/ Hex Artifact Content
Login

Artifact 4224bff1904dfdf3664680897e1b5077de1fd649:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23e0: 2a 20 54 68 65 20 77 69 6e 56 66 73 41 70 70 44  * The winVfsAppD
23f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
2400: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 41   used for the pA
2410: 70 70 44 61 74 61 20 6d 65 6d 62 65 72 20 66 6f  ppData member fo
2420: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
2430: 57 69 6e 33 32 20 56 46 53 20 76 61 72 69 61 6e  Win32 VFS varian
2440: 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ts..*/.typedef s
2450: 74 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44  truct winVfsAppD
2460: 61 74 61 20 77 69 6e 56 66 73 41 70 70 44 61 74  ata winVfsAppDat
2470: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 56 66 73  a;.struct winVfs
2480: 41 70 70 44 61 74 61 20 7b 0a 20 20 63 6f 6e 73  AppData {.  cons
2490: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24a0: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
24b0: 2a 20 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 6d  * The file I/O m
24c0: 65 74 68 6f 64 73 20 74 6f 20 75 73 65 2e 20 2a  ethods to use. *
24d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 70 70 44 61  /.  void *pAppDa
24e0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
24f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
2500: 74 72 61 20 70 41 70 70 44 61 74 61 2c 20 69 66  tra pAppData, if
2510: 20 61 6e 79 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20   any. */.  BOOL 
2520: 62 4e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNoLock;        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2540: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6c 6f 63   Non-zero if loc
2550: 6b 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  king is disabled
2560: 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  . */.};../*.** A
2570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2580: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
2590: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
25a0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
25b0: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
25c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
25d0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
25e0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
25f0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2600: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2610: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2620: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2630: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2640: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
2650: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
2660: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
2670: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
2680: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
2690: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
26a0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
26b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
26d0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
26e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
26f0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2700: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2710: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2720: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2730: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2740: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2750: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2760: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
2770: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
2780: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
2790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27a0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
27b0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
27c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
27d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
27e0: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
27f0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2800: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2810: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2820: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2830: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2840: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
2850: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2860: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2880: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
2890: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
28a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
28b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
28c0: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
28d0: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
28e0: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
28f0: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2900: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2910: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2920: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2930: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2940: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
2950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2960: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
2970: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
2980: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
2990: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
29a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
29b0: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
29c0: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
29d0: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
29e0: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
29f0: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2a00: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2a10: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2a20: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2a30: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2a40: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
2a50: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
2a60: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
2a70: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
2a80: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
2a90: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
2aa0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af0: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2b00: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2b10: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2b20: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2b30: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2b40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
2b50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
2b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b70: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
2b80: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
2b90: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
2ba0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2bb0: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2bc0: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2bd0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2be0: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2bf0: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2c00: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2c10: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2c20: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2c30: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2c40: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
2c50: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
2c60: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
2c70: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
2c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2cd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2ce0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2cf0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2d00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2d10: 41 54 45 20 20 20 20 28 54 52 55 45 29 0a 23 65  ATE    (TRUE).#e
2d20: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73  ndif../*. * This
2d30: 20 69 73 20 63 61 63 68 65 20 73 69 7a 65 20 75   is cache size u
2d40: 73 65 64 20 69 6e 20 74 68 65 20 63 61 6c 63 75  sed in the calcu
2d50: 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  lation of the in
2d60: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2d70: 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70 65 63 69  e. * Win32-speci
2d80: 66 69 63 20 68 65 61 70 2e 20 20 49 74 20 63 61  fic heap.  It ca
2d90: 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74 69 76 65  nnot be negative
2da0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2db0: 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45  LITE_WIN32_CACHE
2dc0: 5f 53 49 5a 45 0a 23 20 20 69 66 20 53 51 4c 49  _SIZE.#  if SQLI
2dd0: 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45  TE_DEFAULT_CACHE
2de0: 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20 20 64 65  _SIZE>=0.#    de
2df0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
2e00: 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 28 53 51  2_CACHE_SIZE (SQ
2e10: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
2e20: 48 45 5f 53 49 5a 45 29 0a 23 20 20 65 6c 73 65  HE_SIZE).#  else
2e30: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
2e40: 49 54 45 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f  ITE_WIN32_CACHE_
2e50: 53 49 5a 45 20 28 2d 28 53 51 4c 49 54 45 5f 44  SIZE (-(SQLITE_D
2e60: 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a  EFAULT_CACHE_SIZ
2e70: 45 29 29 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E)).#  endif.#en
2e80: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
2e90: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
2ea0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
2eb0: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
2ec0: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
2ed0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2ee0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
2ef0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
2f00: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2f10: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 28  HEAP_INIT_SIZE (
2f20: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41  (SQLITE_WIN32_CA
2f30: 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a 20 20  CHE_SIZE) * \.  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
2f70: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 20  AULT_PAGE_SIZE) 
2f80: 2b 20 34 31 39 34 33 30 34 29 0a 23 65 6e 64 69  + 4194304).#endi
2f90: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 6d 61 78  f../*. * The max
2fa0: 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74 68 65  imum size of the
2fb0: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20   Win32-specific 
2fc0: 68 65 61 70 2e 20 20 54 68 69 73 20 76 61 6c 75  heap.  This valu
2fd0: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e 0a 20  e may be zero.. 
2fe0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2ff0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58  E_WIN32_HEAP_MAX
3000: 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20  _SIZE.#  define 
3010: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
3020: 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28 30 29 0a  P_MAX_SIZE  (0).
3030: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
3040: 65 20 65 78 74 72 61 20 66 6c 61 67 73 20 74 6f  e extra flags to
3050: 20 75 73 65 20 69 6e 20 63 61 6c 6c 73 20 74 6f   use in calls to
3060: 20 74 68 65 20 57 69 6e 33 32 20 68 65 61 70 20   the Win32 heap 
3070: 41 50 49 73 2e 20 20 54 68 69 73 20 76 61 6c 75  APIs.  This valu
3080: 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a 65 72 6f  e may be. * zero
3090: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
30a0: 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a 2f 0a 23   behavior.. */.#
30b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
30c0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 0a 23  N32_HEAP_FLAGS.#
30d0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
30e0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
30f0: 20 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a       (0).#endif.
3100: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 4d  ../*.** The winM
3110: 65 6d 44 61 74 61 20 73 74 72 75 63 74 75 72 65  emData structure
3120: 20 73 74 6f 72 65 73 20 69 6e 66 6f 72 6d 61 74   stores informat
3130: 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
3140: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
3150: 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65  ic.** sqlite3_me
3160: 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70 6c 65 6d  m_methods implem
3170: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 74 79 70  entation..*/.typ
3180: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 4d  edef struct winM
3190: 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d 44 61 74  emData winMemDat
31a0: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 4d 65 6d  a;.struct winMem
31b0: 44 61 74 61 20 7b 0a 23 69 66 6e 64 65 66 20 4e  Data {.#ifndef N
31c0: 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69  DEBUG.  u32 magi
31d0: 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e  c1;   /* Magic n
31e0: 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20  umber to detect 
31f0: 73 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70  structure corrup
3200: 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  tion. */.#endif.
3210: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 20    HANDLE hHeap; 
3220: 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65 20 74 6f  /* The handle to
3230: 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f 0a 20 20   our heap. */.  
3240: 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20 20 2f 2a  BOOL bOwned;  /*
3250: 20 44 6f 20 77 65 20 6f 77 6e 20 74 68 65 20 68   Do we own the h
3260: 65 61 70 20 28 69 2e 65 2e 20 64 65 73 74 72 6f  eap (i.e. destro
3270: 79 20 69 74 20 6f 6e 20 73 68 75 74 64 6f 77 6e  y it on shutdown
3280: 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )? */.#ifndef ND
3290: 45 42 55 47 0a 20 20 75 33 32 20 6d 61 67 69 63  EBUG.  u32 magic
32a0: 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63 20 6e 75  2;   /* Magic nu
32b0: 6d 62 65 72 20 74 6f 20 64 65 74 65 63 74 20 73  mber to detect s
32c0: 74 72 75 63 74 75 72 65 20 63 6f 72 72 75 70 74  tructure corrupt
32d0: 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  ion. */.#endif.}
32e0: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
32f0: 47 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  G.#define WINMEM
3300: 5f 4d 41 47 49 43 31 20 20 20 20 20 30 78 34 32  _MAGIC1     0x42
3310: 62 32 38 33 30 62 0a 23 64 65 66 69 6e 65 20 57  b2830b.#define W
3320: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 20 20 20  INMEM_MAGIC2    
3330: 20 30 78 62 64 34 64 37 63 66 34 0a 23 65 6e 64   0xbd4d7cf4.#end
3340: 69 66 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  if..static struc
3350: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
3360: 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b 0a 23 69  _mem_data = {.#i
3370: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 57  fndef NDEBUG.  W
3380: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c 0a 23 65  INMEM_MAGIC1,.#e
3390: 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20 46 41 4c  ndif.  NULL, FAL
33a0: 53 45 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  SE.#ifndef NDEBU
33b0: 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d 41 47 49  G.  ,WINMEM_MAGI
33c0: 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  C2.#endif.};..#i
33d0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
33e0: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
33f0: 74 4d 61 67 69 63 31 28 29 20 61 73 73 65 72 74  tMagic1() assert
3400: 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d  ( win_mem_data.m
3410: 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic1==WINMEM_MA
3420: 47 49 43 31 20 29 0a 23 64 65 66 69 6e 65 20 77  GIC1 ).#define w
3430: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3440: 32 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  2() assert( win_
3450: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 32 3d  mem_data.magic2=
3460: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29  =WINMEM_MAGIC2 )
3470: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
3480: 73 73 65 72 74 4d 61 67 69 63 28 29 20 20 77 69  ssertMagic()  wi
3490: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 31  nMemAssertMagic1
34a0: 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  (); winMemAssert
34b0: 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c 73 65 0a  Magic2();.#else.
34c0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
34d0: 73 65 72 74 4d 61 67 69 63 28 29 0a 23 65 6e 64  sertMagic().#end
34e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  if..#define winM
34f0: 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 20 20  emGetDataPtr()  
3500: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 23 64  &win_mem_data.#d
3510: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 48  efine winMemGetH
3520: 65 61 70 28 29 20 20 20 20 20 77 69 6e 5f 6d 65  eap()     win_me
3530: 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a 23 64 65  m_data.hHeap.#de
3540: 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 4f 77  fine winMemGetOw
3550: 6e 65 64 28 29 20 20 20 20 77 69 6e 5f 6d 65 6d  ned()    win_mem
3560: 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a 0a 73 74  _data.bOwned..st
3570: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3580: 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74  mMalloc(int nByt
3590: 65 73 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  es);.static void
35a0: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
35b0: 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74 61 74 69   *pPrior);.stati
35c0: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
35d0: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
35e0: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 3b  or, int nBytes);
35f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
3600: 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 3b  emSize(void *p);
3610: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
3620: 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e 29  emRoundup(int n)
3630: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
3640: 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70 41  MemInit(void *pA
3650: 70 70 44 61 74 61 29 3b 0a 73 74 61 74 69 63 20  ppData);.static 
3660: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
3670: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
3680: 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73 71 6c 69  ta);..const sqli
3690: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
36a0: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
36b0: 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65 6e 64 69  n32(void);.#endi
36c0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33  f /* SQLITE_WIN3
36d0: 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a  2_MALLOC */../*.
36e0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
36f0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 28 6e 6f   variable is (no
3700: 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f 6e 63 65  rmally) set once
3710: 20 61 6e 64 20 6e 65 76 65 72 20 63 68 61 6e 67   and never chang
3720: 65 73 0a 2a 2a 20 74 68 65 72 65 61 66 74 65 72  es.** thereafter
3730: 2e 20 20 49 74 20 72 65 63 6f 72 64 73 20 77 68  .  It records wh
3740: 65 74 68 65 72 20 74 68 65 20 6f 70 65 72 61 74  ether the operat
3750: 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69  ing system is Wi
3760: 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e 4e 54 2e  n9x.** or WinNT.
3770: 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f 70 65 72  .**.** 0:   Oper
3780: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 75 6e 6b  ating system unk
3790: 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20 20 4f 70  nown..** 1:   Op
37a0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
37b0: 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32 3a 20 20  s Win9x..** 2:  
37c0: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
37d0: 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  m is WinNT..**.*
37e0: 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 66 61  * In order to fa
37f0: 63 69 6c 69 74 61 74 65 20 74 65 73 74 69 6e 67  cilitate testing
3800: 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73 79 73 74   on a WinNT syst
3810: 65 6d 2c 20 74 68 65 20 74 65 73 74 20 66 69 78  em, the test fix
3820: 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d 61 6e 75  ture.** can manu
3830: 61 6c 6c 79 20 73 65 74 20 74 68 69 73 20 76 61  ally set this va
3840: 6c 75 65 20 74 6f 20 31 20 74 6f 20 65 6d 75 6c  lue to 1 to emul
3850: 61 74 65 20 57 69 6e 39 38 20 62 65 68 61 76 69  ate Win98 behavi
3860: 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  or..*/.#ifdef SQ
3870: 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e 47 20 53  LITE_TEST.LONG S
3880: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3890: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
38a0: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  type = 0;.#else.
38b0: 73 74 61 74 69 63 20 4c 4f 4e 47 20 53 51 4c 49  static LONG SQLI
38c0: 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c  TE_WIN32_VOLATIL
38d0: 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  E sqlite3_os_typ
38e0: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  e = 0;.#endif..#
38f0: 69 66 6e 64 65 66 20 53 59 53 43 41 4c 4c 0a 23  ifndef SYSCALL.#
3900: 20 20 64 65 66 69 6e 65 20 53 59 53 43 41 4c 4c    define SYSCALL
3910: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
3920: 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  _ptr.#endif../*.
3930: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3940: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
3950: 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20  e on Windows CE 
3960: 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f 0a 0a 23  or WinRT.. */..#
3970: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
3980: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
3990: 57 49 4e 52 54 0a 23 20 20 64 65 66 69 6e 65 20  WINRT.#  define 
39a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
39b0: 49 28 29 20 20 20 20 20 20 20 31 0a 23 65 6e 64  I()       1.#end
39c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73  if../*.** Many s
39d0: 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20  ystem calls are 
39e0: 61 63 63 65 73 73 65 64 20 74 68 72 6f 75 67 68  accessed through
39f0: 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63   pointer-to-func
3a00: 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a  tions so that.**
3a10: 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65   they may be ove
3a20: 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69  rridden at runti
3a30: 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65  me to facilitate
3a40: 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e   fault injection
3a50: 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69   during.** testi
3a60: 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e  ng and sandboxin
3a70: 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  g.  The followin
3a80: 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68  g array holds th
3a90: 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e  e names and poin
3aa0: 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f  ters.** to all o
3ab0: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
3ac0: 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61  em calls..*/.sta
3ad0: 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 5f 73  tic struct win_s
3ae0: 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74  yscall {.  const
3af0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20   char *zName;   
3b00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
3b10: 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   of the system c
3b20: 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  all */.  sqlite3
3b30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75  _syscall_ptr pCu
3b40: 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e  rrent; /* Curren
3b50: 74 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73  t value of the s
3b60: 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20  ystem call */.  
3b70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b80: 70 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a  ptr pDefault; /*
3b90: 20 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a   Default value *
3ba0: 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d  /.} aSyscall[] =
3bb0: 20 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   {.#if !SQLITE_O
3bc0: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
3bd0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
3be0: 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  "AreFileApisANSI
3bf0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
3c00: 41 4c 4c 29 41 72 65 46 69 6c 65 41 70 69 73 41  ALL)AreFileApisA
3c10: 4e 53 49 2c 20 20 20 20 20 20 20 20 20 30 20 7d  NSI,         0 }
3c20: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 41 72 65  ,.#else.  { "Are
3c30: 46 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20  FileApisANSI",  
3c40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3c50: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3c60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3c70: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73  ndif..#ifndef os
3c80: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 0a  AreFileApisANSI.
3c90: 23 64 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c  #define osAreFil
3ca0: 65 41 70 69 73 41 4e 53 49 20 28 28 42 4f 4f 4c  eApisANSI ((BOOL
3cb0: 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29  (WINAPI*)(VOID))
3cc0: 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72  aSyscall[0].pCur
3cd0: 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69  rent).#endif..#i
3ce0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
3cf0: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
3d00: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3d10: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77  DE).  { "CharLow
3d20: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
3d30: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
3d40: 4c 6f 77 65 72 57 2c 20 20 20 20 20 20 20 20 20  LowerW,         
3d50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3d60: 20 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22    { "CharLowerW"
3d70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3d80: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3da0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
3db0: 65 66 69 6e 65 20 6f 73 43 68 61 72 4c 6f 77 65  efine osCharLowe
3dc0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
3dd0: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
3de0: 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72 72 65 6e  scall[1].pCurren
3df0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
3e00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3e10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3e20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3e30: 68 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20  harUpperW",     
3e40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3e50: 4c 29 43 68 61 72 55 70 70 65 72 57 2c 20 20 20  L)CharUpperW,   
3e60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 55  #else.  { "CharU
3e80: 70 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  pperW",         
3e90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ec0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
3ed0: 61 72 55 70 70 65 72 57 20 28 28 4c 50 57 53 54  arUpperW ((LPWST
3ee0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
3ef0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  R))aSyscall[2].p
3f00: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 43  Current)..  { "C
3f10: 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20 20 20 20  loseHandle",    
3f20: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3f30: 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65 2c 20 20  L)CloseHandle,  
3f40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3f50: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
3f60: 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c 28 57 49  Handle ((BOOL(WI
3f70: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
3f80: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3f90: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
3fa0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
3fb0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 43 72  AS_ANSI).  { "Cr
3fc0: 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20  eateFileA",     
3fd0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3fe0: 29 43 72 65 61 74 65 46 69 6c 65 41 2c 20 20 20  )CreateFileA,   
3ff0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4000: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
4010: 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20  FileA",         
4020: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4050: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
4060: 61 74 65 46 69 6c 65 41 20 28 28 48 41 4e 44 4c  ateFileA ((HANDL
4070: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  E(WINAPI*)(LPCST
4080: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  R,DWORD,DWORD, \
4090: 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52  .        LPSECUR
40a0: 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44  ITY_ATTRIBUTES,D
40b0: 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c  WORD,DWORD,HANDL
40c0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70  E))aSyscall[4].p
40d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
40e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
40f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4100: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4110: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4120: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  W",             
4130: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
4140: 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20 20 20  ileW,           
4150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4160: 20 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20   "CreateFileW", 
4170: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
41a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
41b0: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 57  ne osCreateFileW
41c0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
41d0: 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44  *)(LPCWSTR,DWORD
41e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
41f0: 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54    LPSECURITY_ATT
4200: 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44 57  RIBUTES,DWORD,DW
4210: 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79 73  ORD,HANDLE))aSys
4220: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
4230: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
4240: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
4250: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
4260: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 5c 0a 20  HAS_ANSI) && \. 
4270: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
4280: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4290: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42a0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20 26 26 20  MMAP_SIZE>0) && 
42b0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
42c0: 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c  _WIN32_CREATEFIL
42d0: 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b 20 22 43  EMAPPINGA.  { "C
42e0: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
42f0: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
4300: 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  L)CreateFileMapp
4310: 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a  ingA,      0 },.
4320: 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74  #else.  { "Creat
4330: 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20  eFileMappingA", 
4340: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
4350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4360: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4370: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72  if..#define osCr
4380: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
4390: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
43a0: 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43 55  *)(HANDLE,LPSECU
43b0: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
43c0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
43d0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 43  ,DWORD,DWORD,LPC
43e0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d  STR))aSyscall[6]
43f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4400: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
4410: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
4420: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
4430: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4440: 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20  _WIDE) && \.    
4450: 20 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51      (!defined(SQ
4460: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
4470: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
4480: 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22  P_SIZE>0)).  { "
4490: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
44a0: 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gW",      (SYSCA
44b0: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
44c0: 70 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d 2c  pingW,      0 },
44d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
44e0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c  teFileMappingW",
44f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4500: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4510: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4520: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
4530: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4540: 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  W ((HANDLE(WINAP
4550: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53 45 43  I*)(HANDLE,LPSEC
4560: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4570: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
4580: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4590: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
45a0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
45b0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
45c0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
45d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
45e0: 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65  IDE).  { "Create
45f0: 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20  MutexW",        
4600: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4610: 61 74 65 4d 75 74 65 78 57 2c 20 20 20 20 20 20  ateMutexW,      
4620: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4630: 0a 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65  .  { "CreateMute
4640: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  xW",            
4650: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4670: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4680: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 4d  define osCreateM
4690: 75 74 65 78 57 20 28 28 48 41 4e 44 4c 45 28 57  utexW ((HANDLE(W
46a0: 49 4e 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49  INAPI*)(LPSECURI
46b0: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 42 4f  TY_ATTRIBUTES,BO
46c0: 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  OL, \.        LP
46d0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
46e0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
46f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4700: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4710: 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65  .  { "DeleteFile
4720: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  A",             
4730: 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74 65 46  (SYSCALL)DeleteF
4740: 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20 20 20  ileA,           
4750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4760: 20 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20   "DeleteFileA", 
4770: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
47a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
47b0: 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41  ne osDeleteFileA
47c0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
47d0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
47e0: 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[9].pCurrent)..
47f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4800: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4810: 45 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  E).  { "DeleteFi
4820: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
4830: 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65 74    (SYSCALL)Delet
4840: 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20 20  eFileW,         
4850: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4860: 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22   { "DeleteFileW"
4870: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4880: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
48b0: 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69 6c  fine osDeleteFil
48c0: 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eW ((BOOL(WINAPI
48d0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
48e0: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
48f0: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
4900: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c  S_WINCE.  { "Fil
4910: 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
4920: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
4930: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4940: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
4950: 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d  lse.  { "FileTim
4960: 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
4970: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
4980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4990: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
49a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65  ..#define osFile
49b0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
49c0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
49d0: 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49  I*)(CONST FILETI
49e0: 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ME*, \.        L
49f0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
4a00: 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74  all[11].pCurrent
4a10: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
4a20: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46 69 6c 65  _WINCE.  { "File
4a30: 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65  TimeToSystemTime
4a40: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46  ",    (SYSCALL)F
4a50: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
4a60: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ime,    0 },.#el
4a70: 73 65 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  se.  { "FileTime
4a80: 54 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20  ToSystemTime",  
4a90: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4ac0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 69 6c 65 54  .#define osFileT
4ad0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 20  imeToSystemTime 
4ae0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
4af0: 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c  CONST FILETIME*,
4b00: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53   \.        LPSYS
4b10: 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63 61 6c  TEMTIME))aSyscal
4b20: 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[12].pCurrent).
4b30: 0a 20 20 7b 20 22 46 6c 75 73 68 46 69 6c 65 42  .  { "FlushFileB
4b40: 75 66 66 65 72 73 22 2c 20 20 20 20 20 20 20 20  uffers",        
4b50: 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 46 69  (SYSCALL)FlushFi
4b60: 6c 65 42 75 66 66 65 72 73 2c 20 20 20 20 20 20  leBuffers,      
4b70: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
4b80: 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
4b90: 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  rs ((BOOL(WINAPI
4ba0: 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63  *)(HANDLE))aSysc
4bb0: 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74  all[13].pCurrent
4bc0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4bd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4be0: 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f 72 6d 61  ANSI).  { "Forma
4bf0: 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20  tMessageA",     
4c00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
4c10: 72 6d 61 74 4d 65 73 73 61 67 65 41 2c 20 20 20  rmatMessageA,   
4c20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4c30: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
4c40: 73 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20  sageA",         
4c50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4c80: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4c90: 4d 65 73 73 61 67 65 41 20 28 28 44 57 4f 52 44  MessageA ((DWORD
4ca0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4cb0: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4cc0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
4cd0: 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69       DWORD,va_li
4ce0: 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  st*))aSyscall[14
4cf0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4d00: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4d10: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4d20: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
4d30: 67 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  geW",          (
4d40: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
4d50: 73 73 61 67 65 57 2c 20 20 20 20 20 20 20 20 20  ssageW,         
4d60: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4d70: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22  "FormatMessageW"
4d80: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4d90: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4db0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4dc0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
4dd0: 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eW ((DWORD(WINAP
4de0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
4df0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
4e00: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
4e10: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
4e20: 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75  aSyscall[15].pCu
4e30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4e40: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4e50: 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29  _LOAD_EXTENSION)
4e60: 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72  .  { "FreeLibrar
4e70: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
4e80: 28 53 59 53 43 41 4c 4c 29 46 72 65 65 4c 69 62  (SYSCALL)FreeLib
4e90: 72 61 72 79 2c 20 20 20 20 20 20 20 20 20 20 20  rary,           
4ea0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4eb0: 20 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20   "FreeLibrary", 
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4ed0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4ef0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4f00: 6e 65 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  ne osFreeLibrary
4f10: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4f20: 28 48 4d 4f 44 55 4c 45 29 29 61 53 79 73 63 61  (HMODULE))aSysca
4f30: 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[16].pCurrent)
4f40: 0a 0a 20 20 7b 20 22 47 65 74 43 75 72 72 65 6e  ..  { "GetCurren
4f50: 74 50 72 6f 63 65 73 73 49 64 22 2c 20 20 20 20  tProcessId",    
4f60: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 43 75 72   (SYSCALL)GetCur
4f70: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 2c 20 20  rentProcessId,  
4f80: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
4f90: 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
4fa0: 63 65 73 73 49 64 20 28 28 44 57 4f 52 44 28 57  cessId ((DWORD(W
4fb0: 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53  INAPI*)(VOID))aS
4fc0: 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72 72  yscall[17].pCurr
4fd0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
4fe0: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
4ff0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
5000: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b  32_HAS_ANSI).  {
5010: 20 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61   "GetDiskFreeSpa
5020: 63 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53  ceA",       (SYS
5030: 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65  CALL)GetDiskFree
5040: 53 70 61 63 65 41 2c 20 20 20 20 20 20 20 30 20  SpaceA,       0 
5050: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5060: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22  tDiskFreeSpaceA"
5070: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
5080: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
50a0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
50b0: 73 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  sGetDiskFreeSpac
50c0: 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  eA ((BOOL(WINAPI
50d0: 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44 57 4f 52  *)(LPCSTR,LPDWOR
50e0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50f0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
5100: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
5110: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5120: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
5130: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
5140: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
5150: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5160: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
5170: 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22  tDiskFreeSpaceW"
5180: 2c 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ,       (SYSCALL
5190: 29 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  )GetDiskFreeSpac
51a0: 65 57 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  eW,       0 },.#
51b0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73  else.  { "GetDis
51c0: 6b 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20  kFreeSpaceW",   
51d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5200: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5210: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 20 28  DiskFreeSpaceW (
5220: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
5230: 50 43 57 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c  PCWSTR,LPDWORD,L
5240: 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20  PDWORD,LPDWORD, 
5250: 5c 0a 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52  \.        LPDWOR
5260: 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  D))aSyscall[19].
5270: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
5280: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
5290: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
52a0: 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62  { "GetFileAttrib
52b0: 75 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59  utesA",      (SY
52c0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74  SCALL)GetFileAtt
52d0: 72 69 62 75 74 65 73 41 2c 20 20 20 20 20 20 30  ributesA,      0
52e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
52f0: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5300: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
5310: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5320: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5330: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5340: 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
5350: 74 65 73 41 20 28 28 44 57 4f 52 44 28 57 49 4e  tesA ((DWORD(WIN
5360: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
5370: 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72  yscall[20].pCurr
5380: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5390: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
53a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
53b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
53c0: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
53d0: 74 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53  tesW",      (SYS
53e0: 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72  CALL)GetFileAttr
53f0: 69 62 75 74 65 73 57 2c 20 20 20 20 20 20 30 20  ibutesW,      0 
5400: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
5410: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
5420: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
5430: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
5440: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5450: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
5460: 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
5470: 65 73 57 20 28 28 44 57 4f 52 44 28 57 49 4e 41  esW ((DWORD(WINA
5480: 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53  PI*)(LPCWSTR))aS
5490: 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72 72  yscall[21].pCurr
54a0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
54b0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
54c0: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65  AS_WIDE).  { "Ge
54d0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
54e0: 78 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  xW",    (SYSCALL
54f0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
5500: 65 73 45 78 57 2c 20 20 20 20 30 20 7d 2c 0a 23  esExW,    0 },.#
5510: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5520: 65 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c  eAttributesExW",
5530: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5560: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5570: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
5580: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
5590: 29 28 4c 50 43 57 53 54 52 2c 47 45 54 5f 46 49  )(LPCWSTR,GET_FI
55a0: 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56 45 4c 53  LEEX_INFO_LEVELS
55b0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 56 4f  , \.        LPVO
55c0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  ID))aSyscall[22]
55d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
55e0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
55f0: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a  .  { "GetFileSiz
5600: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
5610: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5620: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
5630: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5640: 20 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20   "GetFileSize", 
5650: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
5660: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5680: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5690: 6e 65 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65  ne osGetFileSize
56a0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
56b0: 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57 4f 52 44  )(HANDLE,LPDWORD
56c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70  ))aSyscall[23].p
56d0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
56e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
56f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
5700: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5710: 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74  .  { "GetFullPat
5720: 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20  hNameA",        
5730: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c  (SYSCALL)GetFull
5740: 50 61 74 68 4e 61 6d 65 41 2c 20 20 20 20 20 20  PathNameA,      
5750: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5760: 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d   "GetFullPathNam
5770: 65 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  eA",        (SYS
5780: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
57a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
57b0: 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68  ne osGetFullPath
57c0: 4e 61 6d 65 41 20 28 28 44 57 4f 52 44 28 57 49  NameA ((DWORD(WI
57d0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57  NAPI*)(LPCSTR,DW
57e0: 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a 20 20 20  ORD,LPSTR, \.   
57f0: 20 20 20 20 20 4c 50 53 54 52 2a 29 29 61 53 79       LPSTR*))aSy
5800: 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65  scall[24].pCurre
5810: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5820: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
5830: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5840: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5850: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5860: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
5870: 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28  NameW",        (
5880: 53 59 53 43 41 4c 4c 29 47 65 74 46 75 6c 6c 50  SYSCALL)GetFullP
5890: 61 74 68 4e 61 6d 65 57 2c 20 20 20 20 20 20 20  athNameW,       
58a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
58b0: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
58c0: 57 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  W",        (SYSC
58d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
58f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
5900: 65 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  e osGetFullPathN
5910: 61 6d 65 57 20 28 28 44 57 4f 52 44 28 57 49 4e  ameW ((DWORD(WIN
5920: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
5930: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
5940: 20 20 20 20 20 20 4c 50 57 53 54 52 2a 29 29 61        LPWSTR*))a
5950: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
5960: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 4c  rent)..  { "GetL
5970: 61 73 74 45 72 72 6f 72 22 2c 20 20 20 20 20 20  astError",      
5980: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5990: 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
59a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
59b0: 65 66 69 6e 65 20 6f 73 47 65 74 4c 61 73 74 45  efine osGetLastE
59c0: 72 72 6f 72 20 28 28 44 57 4f 52 44 28 57 49 4e  rror ((DWORD(WIN
59d0: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
59e0: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
59f0: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
5a00: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41  (SQLITE_OMIT_LOA
5a10: 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 23 69 66  D_EXTENSION).#if
5a20: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
5a30: 0a 20 20 2f 2a 20 54 68 65 20 47 65 74 50 72 6f  .  /* The GetPro
5a40: 63 41 64 64 72 65 73 73 41 28 29 20 72 6f 75 74  cAddressA() rout
5a50: 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ine is only avai
5a60: 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73  lable on Windows
5a70: 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22 47 65 74   CE. */.  { "Get
5a80: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
5a90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5aa0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 2c  GetProcAddressA,
5ab0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ac0: 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20 6f 74 68  lse.  /* All oth
5ad0: 65 72 20 57 69 6e 64 6f 77 73 20 70 6c 61 74 66  er Windows platf
5ae0: 6f 72 6d 73 20 65 78 70 65 63 74 20 47 65 74 50  orms expect GetP
5af0: 72 6f 63 41 64 64 72 65 73 73 28 29 20 74 6f 20  rocAddress() to 
5b00: 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20 41 4e 53  take.  ** an ANS
5b10: 49 20 73 74 72 69 6e 67 20 72 65 67 61 72 64 6c  I string regardl
5b20: 65 73 73 20 6f 66 20 74 68 65 20 5f 55 4e 49 43  ess of the _UNIC
5b30: 4f 44 45 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20  ODE setting */. 
5b40: 20 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65   { "GetProcAddre
5b50: 73 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53  ssA",         (S
5b60: 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64  YSCALL)GetProcAd
5b70: 64 72 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  dress,          
5b80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6c 73  0 },.#endif.#els
5b90: 65 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  e.  { "GetProcAd
5ba0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5bb0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5bd0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5be0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72 6f  #define osGetPro
5bf0: 63 41 64 64 72 65 73 73 41 20 28 28 46 41 52 50  cAddressA ((FARP
5c00: 52 4f 43 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f  ROC(WINAPI*)(HMO
5c10: 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  DULE, \.        
5c20: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5c30: 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [27].pCurrent)..
5c40: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5c50: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 53 79 73  INRT.  { "GetSys
5c60: 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20  temInfo",       
5c70: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5c80: 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20  SystemInfo,     
5c90: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
5ca0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49  .  { "GetSystemI
5cb0: 6e 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  nfo",           
5cc0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
5cf0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
5d00: 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49  emInfo ((VOID(WI
5d10: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 5f  NAPI*)(LPSYSTEM_
5d20: 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b 32  INFO))aSyscall[2
5d30: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  8].pCurrent)..  
5d40: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5d50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
5d60: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5d70: 69 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 30  ime,           0
5d80: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47   },..#define osG
5d90: 65 74 53 79 73 74 65 6d 54 69 6d 65 20 28 28 56  etSystemTime ((V
5da0: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5db0: 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73 63  YSTEMTIME))aSysc
5dc0: 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72 65 6e 74  all[29].pCurrent
5dd0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5de0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 47 65 74  S_WINCE.  { "Get
5df0: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
5e00: 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29  Time", (SYSCALL)
5e10: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5e20: 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c 0a 23 65  ileTime, 0 },.#e
5e30: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5e40: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
5e50: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
5e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e70: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5e80: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5e90: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5ea0: 69 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ime ((VOID(WINAP
5eb0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
5ec0: 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63  PFILETIME))aSysc
5ed0: 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72 65 6e 74  all[30].pCurrent
5ee0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
5ef0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5f00: 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 54 65  ANSI).  { "GetTe
5f10: 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20  mpPathA",       
5f20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
5f30: 74 54 65 6d 70 50 61 74 68 41 2c 20 20 20 20 20  tTempPathA,     
5f40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
5f50: 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61  e.  { "GetTempPa
5f60: 74 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  thA",           
5f70: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
5f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5fa0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d  #define osGetTem
5fb0: 70 50 61 74 68 41 20 28 28 44 57 4f 52 44 28 57  pPathA ((DWORD(W
5fc0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50  INAPI*)(DWORD,LP
5fd0: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 31  STR))aSyscall[31
5fe0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5ff0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6000: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
6010: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
6020: 44 45 29 0a 20 20 7b 20 22 47 65 74 54 65 6d 70  DE).  { "GetTemp
6030: 50 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20  PathW",         
6040: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
6050: 65 6d 70 50 61 74 68 57 2c 20 20 20 20 20 20 20  empPathW,       
6060: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6070: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
6080: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
6090: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
60c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 65 6d 70 50  efine osGetTempP
60d0: 61 74 68 57 20 28 28 44 57 4f 52 44 28 57 49 4e  athW ((DWORD(WIN
60e0: 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 57 53  API*)(DWORD,LPWS
60f0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 33 32 5d  TR))aSyscall[32]
6100: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6110: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6120: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
6130: 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nt",            
6140: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
6150: 43 6f 75 6e 74 2c 20 20 20 20 20 20 20 20 20 20  Count,          
6160: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6170: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c   "GetTickCount",
6180: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6190: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
61b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
61c0: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
61d0: 74 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  t ((DWORD(WINAPI
61e0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
61f0: 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[33].pCurrent).
6200: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
6210: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
6220: 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49  SI) && SQLITE_WI
6230: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
6240: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
6250: 45 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExA",           
6260: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
6270: 69 6f 6e 45 78 41 2c 20 20 20 20 20 20 20 20 20  ionExA,         
6280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6290: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22   "GetVersionExA"
62a0: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
62b0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
62d0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
62e0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
62f0: 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xA ((BOOL(WINAPI
6300: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
6310: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 29 29  OSVERSIONINFOA))
6320: 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e 70 43 75  aSyscall[34].pCu
6330: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6340: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6360: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26  IN32_HAS_WIDE) &
6370: 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  & \.        SQLI
6380: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
6390: 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65  IONEX.  { "GetVe
63a0: 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20  rsionExW",      
63b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
63c0: 74 56 65 72 73 69 6f 6e 45 78 57 2c 20 20 20 20  tVersionExW,    
63d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
63e0: 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f  e.  { "GetVersio
63f0: 6e 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  nExW",          
6400: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6420: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
6430: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72  #define osGetVer
6440: 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f 4c 28 57  sionExW ((BOOL(W
6450: 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20  INAPI*)( \.     
6460: 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e     LPOSVERSIONIN
6470: 46 4f 57 29 29 61 53 79 73 63 61 6c 6c 5b 33 35  FOW))aSyscall[35
6480: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6490: 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 20 20   "HeapAlloc",   
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
64b0: 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f 63 2c 20  CALL)HeapAlloc, 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
64d0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
64e0: 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49 44  apAlloc ((LPVOID
64f0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6500: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6510: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
6520: 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[36].pCurrent)
6530: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6540: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6550: 43 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20  Create",        
6560: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6570: 65 61 70 43 72 65 61 74 65 2c 20 20 20 20 20 20  eapCreate,      
6580: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6590: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61  se.  { "HeapCrea
65a0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
65b0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
65e0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
65f0: 72 65 61 74 65 20 28 28 48 41 4e 44 4c 45 28 57  reate ((HANDLE(W
6600: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 53 49  INAPI*)(DWORD,SI
6610: 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20 20 20 20  ZE_T, \.        
6620: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6630: 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [37].pCurrent)..
6640: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6650: 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 44 65  INRT.  { "HeapDe
6660: 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20  stroy",         
6670: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6680: 70 44 65 73 74 72 6f 79 2c 20 20 20 20 20 20 20  pDestroy,       
6690: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
66a0: 0a 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f  .  { "HeapDestro
66b0: 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
66c0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
66d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66e0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
66f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 44 65 73  define osHeapDes
6700: 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41  troy ((BOOL(WINA
6710: 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79  PI*)(HANDLE))aSy
6720: 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75 72 72 65  scall[38].pCurre
6730: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 46 72  nt)..  { "HeapFr
6740: 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ee",            
6750: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6760: 70 46 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  pFree,          
6770: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6780: 69 6e 65 20 6f 73 48 65 61 70 46 72 65 65 20 28  ine osHeapFree (
6790: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
67a0: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f  ANDLE,DWORD,LPVO
67b0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 39 5d  ID))aSyscall[39]
67c0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
67d0: 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 2c 20 20  "HeapReAlloc",  
67e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
67f0: 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c 6f 63 2c  ALL)HeapReAlloc,
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6810: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61  ,..#define osHea
6820: 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50 56 4f 49  pReAlloc ((LPVOI
6830: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
6840: 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 2c 20  E,DWORD,LPVOID, 
6850: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6860: 29 29 61 53 79 73 63 61 6c 6c 5b 34 30 5d 2e 70  ))aSyscall[40].p
6870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48  Current)..  { "H
6880: 65 61 70 53 69 7a 65 22 2c 20 20 20 20 20 20 20  eapSize",       
6890: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68a0: 4c 29 48 65 61 70 53 69 7a 65 2c 20 20 20 20 20  L)HeapSize,     
68b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
68c0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 53  .#define osHeapS
68d0: 69 7a 65 20 28 28 53 49 5a 45 5f 54 28 57 49 4e  ize ((SIZE_T(WIN
68e0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
68f0: 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  RD, \.        LP
6900: 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  CVOID))aSyscall[
6910: 34 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  41].pCurrent)..#
6920: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6930: 4e 52 54 0a 20 20 7b 20 22 48 65 61 70 56 61 6c  NRT.  { "HeapVal
6940: 69 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  idate",         
6950: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6960: 56 61 6c 69 64 61 74 65 2c 20 20 20 20 20 20 20  Validate,       
6970: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6980: 20 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74    { "HeapValidat
6990: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  e",            (
69a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
69d0: 65 66 69 6e 65 20 6f 73 48 65 61 70 56 61 6c 69  efine osHeapVali
69e0: 64 61 74 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  date ((BOOL(WINA
69f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6a00: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  D, \.        LPC
6a10: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  VOID))aSyscall[4
6a20: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  2].pCurrent)..#i
6a30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6a40: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
6a50: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
6a60: 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20  Compact",       
6a70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6a80: 65 61 70 43 6f 6d 70 61 63 74 2c 20 20 20 20 20  eapCompact,     
6a90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6aa0: 73 65 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70  se.  { "HeapComp
6ab0: 61 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  act",           
6ac0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6af0: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 43  .#define osHeapC
6b00: 6f 6d 70 61 63 74 20 28 28 55 49 4e 54 28 57 49  ompact ((UINT(WI
6b10: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57  NAPI*)(HANDLE,DW
6b20: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 33  ORD))aSyscall[43
6b30: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6b40: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6b50: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
6b60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
6b70: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b80: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b90: 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20  dLibraryA",     
6ba0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6bb0: 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c 20 20 20  LoadLibraryA,   
6bc0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6bd0: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6be0: 72 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20  raryA",         
6bf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6c20: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6c30: 4c 69 62 72 61 72 79 41 20 28 28 48 4d 4f 44 55  LibraryA ((HMODU
6c40: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  LE(WINAPI*)(LPCS
6c50: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 34 5d  TR))aSyscall[44]
6c60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6c70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6c80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
6c90: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
6ca0: 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  E) && \.        
6cb0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
6cc0: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
6cd0: 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69  ION).  { "LoadLi
6ce0: 62 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20  braryW",        
6cf0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61      (SYSCALL)Loa
6d00: 64 4c 69 62 72 61 72 79 57 2c 20 20 20 20 20 20  dLibraryW,      
6d10: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6d20: 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72  .  { "LoadLibrar
6d30: 79 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  yW",            
6d40: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d60: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6d70: 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62  define osLoadLib
6d80: 72 61 72 79 57 20 28 28 48 4d 4f 44 55 4c 45 28  raryW ((HMODULE(
6d90: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
6da0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 35 5d 2e 70  ))aSyscall[45].p
6db0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6dc0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6dd0: 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20   { "LocalFree", 
6de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6df0: 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46 72 65 65  YSCALL)LocalFree
6e00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6e10: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6e20: 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20  LocalFree",     
6e30: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6e40: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6e50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6e60: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6e70: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20 28 28 48   osLocalFree ((H
6e80: 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a 29 28 48  LOCAL(WINAPI*)(H
6e90: 4c 4f 43 41 4c 29 29 61 53 79 73 63 61 6c 6c 5b  LOCAL))aSyscall[
6ea0: 34 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  46].pCurrent)..#
6eb0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6ec0: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
6ed0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63  S_WINRT.  { "Loc
6ee0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
6ef0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6f00: 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20  LockFile,       
6f10: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6f20: 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c  lse.  { "LockFil
6f30: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6f40: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6f70: 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b  ..#ifndef osLock
6f80: 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 4c  File.#define osL
6f90: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
6fa0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6fb0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
6fc0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
6fd0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 37 5d 2e  D))aSyscall[47].
6fe0: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
6ff0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7000: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c 6f 63 6b  _WINCE.  { "Lock
7010: 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20  FileEx",        
7020: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c        (SYSCALL)L
7030: 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20 20 20  ockFileEx,      
7040: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
7050: 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  se.  { "LockFile
7060: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
7070: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
70a0: 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f 63 6b 46  .#ifndef osLockF
70b0: 69 6c 65 45 78 0a 23 64 65 66 69 6e 65 20 6f 73  ileEx.#define os
70c0: 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  LockFileEx ((BOO
70d0: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
70e0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
70f0: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
7100: 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45       LPOVERLAPPE
7110: 44 29 29 61 53 79 73 63 61 6c 6c 5b 34 38 5d 2e  D))aSyscall[48].
7120: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7130: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7140: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
7150: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a  E_OS_WINRT && \.
7160: 20 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65          (!define
7170: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7180: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
7190: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20  _MMAP_SIZE>0)). 
71a0: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
71b0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  e",           (S
71c0: 59 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66  YSCALL)MapViewOf
71d0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
71e0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
71f0: 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  MapViewOfFile", 
7200: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7210: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7220: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7230: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7240: 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
7250: 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49   ((LPVOID(WINAPI
7260: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7270: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7280: 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61         SIZE_T))a
7290: 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70 43 75 72  Syscall[49].pCur
72a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d 75 6c 74  rent)..  { "Mult
72b0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 22  iByteToWideChar"
72c0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d  ,     (SYSCALL)M
72d0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
72e0: 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ar,     0 },..#d
72f0: 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69 42 79 74  efine osMultiByt
7300: 65 54 6f 57 69 64 65 43 68 61 72 20 28 28 69 6e  eToWideChar ((in
7310: 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c  t(WINAPI*)(UINT,
7320: 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c 69 6e 74  DWORD,LPCSTR,int
7330: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
7340: 20 20 20 69 6e 74 29 29 61 53 79 73 63 61 6c 6c     int))aSyscall
7350: 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [50].pCurrent)..
7360: 20 20 7b 20 22 51 75 65 72 79 50 65 72 66 6f 72    { "QueryPerfor
7370: 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22 2c 20 28  manceCounter", (
7380: 53 59 53 43 41 4c 4c 29 51 75 65 72 79 50 65 72  SYSCALL)QueryPer
7390: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 2c  formanceCounter,
73a0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
73b0: 73 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63  sQueryPerformanc
73c0: 65 43 6f 75 6e 74 65 72 20 28 28 42 4f 4f 4c 28  eCounter ((BOOL(
73d0: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
73e0: 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45      LARGE_INTEGE
73f0: 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 31 5d  R*))aSyscall[51]
7400: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7410: 22 52 65 61 64 46 69 6c 65 22 2c 20 20 20 20 20  "ReadFile",     
7420: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7430: 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c 20 20 20  ALL)ReadFile,   
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7450: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  ,..#define osRea
7460: 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e  dFile ((BOOL(WIN
7470: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 56  API*)(HANDLE,LPV
7480: 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52  OID,DWORD,LPDWOR
7490: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  D, \.        LPO
74a0: 56 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63  VERLAPPED))aSysc
74b0: 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72 65 6e 74  all[52].pCurrent
74c0: 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e 64 4f 66  )..  { "SetEndOf
74d0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
74e0: 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74 45 6e    (SYSCALL)SetEn
74f0: 64 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  dOfFile,        
7500: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
7510: 65 20 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65  e osSetEndOfFile
7520: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7530: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
7540: 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[53].pCurrent).
7550: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7560: 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69  WINRT.  { "SetFi
7570: 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20  lePointer",     
7580: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7590: 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c 20 20 20  tFilePointer,   
75a0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
75b0: 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  e.  { "SetFilePo
75c0: 69 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20  inter",         
75d0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7600: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c  #define osSetFil
7610: 65 50 6f 69 6e 74 65 72 20 28 28 44 57 4f 52 44  ePointer ((DWORD
7620: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7630: 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20 5c 0a 20  ,LONG,PLONG, \. 
7640: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7650: 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43 75 72 72  yscall[54].pCurr
7660: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7670: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
7680: 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20  Sleep",         
7690: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
76a0: 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20 20 20 20  LL)Sleep,       
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
76c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 6c 65 65  .#else.  { "Slee
76d0: 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
76e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
76f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7700: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
7710: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53  dif..#define osS
7720: 6c 65 65 70 20 28 28 56 4f 49 44 28 57 49 4e 41  leep ((VOID(WINA
7730: 50 49 2a 29 28 44 57 4f 52 44 29 29 61 53 79 73  PI*)(DWORD))aSys
7740: 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72 72 65 6e  call[55].pCurren
7750: 74 29 0a 0a 20 20 7b 20 22 53 79 73 74 65 6d 54  t)..  { "SystemT
7760: 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 22 2c 20  imeToFileTime", 
7770: 20 20 20 28 53 59 53 43 41 4c 4c 29 53 79 73 74     (SYSCALL)Syst
7780: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
7790: 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69  ,    0 },..#defi
77a0: 6e 65 20 6f 73 53 79 73 74 65 6d 54 69 6d 65 54  ne osSystemTimeT
77b0: 6f 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  oFileTime ((BOOL
77c0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
77d0: 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20 5c 0a 20  SYSTEMTIME*, \. 
77e0: 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d         LPFILETIM
77f0: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 36 5d 2e  E))aSyscall[56].
7800: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7810: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7820: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
7830: 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46  NRT.  { "UnlockF
7840: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7850: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f     (SYSCALL)Unlo
7860: 63 6b 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  ckFile,         
7870: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7880: 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22    { "UnlockFile"
7890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
78a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69   0 },.#endif..#i
78d0: 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63 6b 46 69  fndef osUnlockFi
78e0: 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c  le.#define osUnl
78f0: 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57  ockFile ((BOOL(W
7900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7910: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7920: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7930: 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 37 5d 2e  D))aSyscall[57].
7940: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
7950: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
7960: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55 6e 6c 6f  _WINCE.  { "Unlo
7970: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
7980: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
7990: 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20 20  nlockFileEx,    
79a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
79b0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
79c0: 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20  leEx",          
79d0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79f0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7a00: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63  .#define osUnloc
7a10: 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57  kFileEx ((BOOL(W
7a20: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
7a30: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
7a40: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7a50: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7a60: 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[58].pCurrent)
7a70: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7a80: 57 49 4e 43 45 20 7c 7c 20 21 64 65 66 69 6e 65  WINCE || !define
7a90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
7aa0: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
7ab0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b  _MMAP_SIZE>0.  {
7ac0: 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c   "UnmapViewOfFil
7ad0: 65 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  e",         (SYS
7ae0: 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65 77 4f 66  CALL)UnmapViewOf
7af0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 30 20  File,         0 
7b00: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
7b10: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  mapViewOfFile", 
7b20: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7b30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7b40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7b50: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7b60: 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  sUnmapViewOfFile
7b70: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7b80: 28 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61  (LPCVOID))aSysca
7b90: 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[59].pCurrent)
7ba0: 0a 0a 20 20 7b 20 22 57 69 64 65 43 68 61 72 54  ..  { "WideCharT
7bb0: 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20 20 20 20  oMultiByte",    
7bc0: 20 28 53 59 53 43 41 4c 4c 29 57 69 64 65 43 68   (SYSCALL)WideCh
7bd0: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 2c 20 20  arToMultiByte,  
7be0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7bf0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
7c00: 74 69 42 79 74 65 20 28 28 69 6e 74 28 57 49 4e  tiByte ((int(WIN
7c10: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
7c20: 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c 4c 50 53  ,LPCWSTR,int,LPS
7c30: 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20 20 20 20  TR,int, \.      
7c40: 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f 4f 4c 29    LPCSTR,LPBOOL)
7c50: 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d 2e 70 43  )aSyscall[60].pC
7c60: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 72  urrent)..  { "Wr
7c70: 69 74 65 46 69 6c 65 22 2c 20 20 20 20 20 20 20  iteFile",       
7c80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7c90: 29 57 72 69 74 65 46 69 6c 65 2c 20 20 20 20 20  )WriteFile,     
7ca0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
7cb0: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 46  #define osWriteF
7cc0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
7cd0: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 43 56 4f  I*)(HANDLE,LPCVO
7ce0: 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ID,DWORD,LPDWORD
7cf0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56  , \.        LPOV
7d00: 45 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61  ERLAPPED))aSysca
7d10: 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[61].pCurrent)
7d20: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
7d30: 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74  WINRT.  { "Creat
7d40: 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20  eEventExW",     
7d50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
7d60: 65 61 74 65 45 76 65 6e 74 45 78 57 2c 20 20 20  eateEventExW,   
7d70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7d80: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65  e.  { "CreateEve
7d90: 6e 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20  ntExW",         
7da0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7dc0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7dd0: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
7de0: 45 76 65 6e 74 45 78 57 20 28 28 48 41 4e 44 4c  EventExW ((HANDL
7df0: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
7e00: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
7e10: 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  ,LPCWSTR, \.    
7e20: 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 29      DWORD,DWORD)
7e30: 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d 2e 70 43  )aSyscall[62].pC
7e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
7e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7e60: 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65  { "WaitForSingle
7e70: 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59  Object",     (SY
7e80: 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e  SCALL)WaitForSin
7e90: 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20 20 20 30  gleObject,     0
7ea0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57   },.#else.  { "W
7eb0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
7ec0: 63 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ct",     (SYSCAL
7ed0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7ee0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7ef0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7f00: 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
7f10: 62 6a 65 63 74 20 28 28 44 57 4f 52 44 28 57 49  bject ((DWORD(WI
7f20: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
7f30: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
7f40: 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e 70 43 75  aSyscall[63].pCu
7f50: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
7f60: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
7f70: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7f80: 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53  bjectEx",   (SYS
7f90: 43 41 4c 4c 29 57 61 69 74 46 6f 72 53 69 6e 67  CALL)WaitForSing
7fa0: 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20 20 30 20  leObjectEx,   0 
7fb0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 57 61  },.#else.  { "Wa
7fc0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
7fd0: 74 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c  tEx",   (SYSCALL
7fe0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7ff0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8000: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8010: 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  sWaitForSingleOb
8020: 6a 65 63 74 45 78 20 28 28 44 57 4f 52 44 28 57  jectEx ((DWORD(W
8030: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
8040: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
8050: 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36  BOOL))aSyscall[6
8060: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
8070: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8080: 54 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f  T.  { "SetFilePo
8090: 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20  interEx",       
80a0: 20 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c   (SYSCALL)SetFil
80b0: 65 50 6f 69 6e 74 65 72 45 78 2c 20 20 20 20 20  ePointerEx,     
80c0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
80d0: 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  { "SetFilePointe
80e0: 72 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59  rEx",        (SY
80f0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8110: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8120: 69 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69  ine osSetFilePoi
8130: 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c 28 57 49  nterEx ((BOOL(WI
8140: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 41  NAPI*)(HANDLE,LA
8150: 52 47 45 5f 49 4e 54 45 47 45 52 2c 20 5c 0a 20  RGE_INTEGER, \. 
8160: 20 20 20 20 20 20 20 50 4c 41 52 47 45 5f 49 4e         PLARGE_IN
8170: 54 45 47 45 52 2c 44 57 4f 52 44 29 29 61 53 79  TEGER,DWORD))aSy
8180: 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75 72 72 65  scall[65].pCurre
8190: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
81a0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65  OS_WINRT.  { "Ge
81b0: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
81c0: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
81d0: 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 49 6e 66  SCALL)GetFileInf
81e0: 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65  ormationByHandle
81f0: 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  Ex, 0 },.#else. 
8200: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
8210: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
8220: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8250: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 49 6e  fine osGetFileIn
8260: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8270: 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  eEx ((BOOL(WINAP
8280: 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20  I*)(HANDLE, \.  
8290: 20 20 20 20 20 20 46 49 4c 45 5f 49 4e 46 4f 5f        FILE_INFO_
82a0: 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41 53 53 2c  BY_HANDLE_CLASS,
82b0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29 29 61 53  LPVOID,DWORD))aS
82c0: 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43 75 72 72  yscall[66].pCurr
82d0: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
82e0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64  _OS_WINRT && (!d
82f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8300: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
8310: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
8320: 30 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f  0).  { "MapViewO
8330: 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20  fFileFromApp",  
8340: 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69    (SYSCALL)MapVi
8350: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 2c  ewOfFileFromApp,
8360: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8370: 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c   { "MapViewOfFil
8380: 65 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53  eFromApp",    (S
8390: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
83c0: 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66  fine osMapViewOf
83d0: 46 69 6c 65 46 72 6f 6d 41 70 70 20 28 28 4c 50  FileFromApp ((LP
83e0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
83f0: 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47  NDLE,ULONG,ULONG
8400: 36 34 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49  64, \.        SI
8410: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 36  ZE_T))aSyscall[6
8420: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  7].pCurrent)..#i
8430: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8440: 54 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  T.  { "CreateFil
8450: 65 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  e2",            
8460: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
8470: 46 69 6c 65 32 2c 20 20 20 20 20 20 20 20 20 20  File2,          
8480: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8490: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c  { "CreateFile2",
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
84b0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
84d0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
84e0: 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65  ine osCreateFile
84f0: 32 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50  2 ((HANDLE(WINAP
8500: 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57 4f 52  I*)(LPCWSTR,DWOR
8510: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c  D,DWORD,DWORD, \
8520: 0a 20 20 20 20 20 20 20 20 4c 50 43 52 45 41 54  .        LPCREAT
8530: 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
8540: 50 41 52 41 4d 45 54 45 52 53 29 29 61 53 79 73  PARAMETERS))aSys
8550: 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72 72 65 6e  call[68].pCurren
8560: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8570: 53 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69  S_WINRT && !defi
8580: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8590: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
85a0: 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65    { "LoadPackage
85b0: 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28  dLibrary",     (
85c0: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50 61 63 6b  SYSCALL)LoadPack
85d0: 61 67 65 64 4c 69 62 72 61 72 79 2c 20 20 20 20  agedLibrary,    
85e0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
85f0: 22 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62  "LoadPackagedLib
8600: 72 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43  rary",     (SYSC
8610: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
8630: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
8640: 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  e osLoadPackaged
8650: 4c 69 62 72 61 72 79 20 28 28 48 4d 4f 44 55 4c  Library ((HMODUL
8660: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  E(WINAPI*)(LPCWS
8670: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
8680: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 39  ORD))aSyscall[69
8690: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
86a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
86b0: 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75  .  { "GetTickCou
86c0: 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
86d0: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 69 63 6b  (SYSCALL)GetTick
86e0: 43 6f 75 6e 74 36 34 2c 20 20 20 20 20 20 20 20  Count64,        
86f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8700: 20 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34   "GetTickCount64
8710: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8720: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8740: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8750: 6e 65 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e  ne osGetTickCoun
8760: 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f 4e 47 28  t64 ((ULONGLONG(
8770: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
8780: 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70 43 75 72  Syscall[70].pCur
8790: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
87a0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
87b0: 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
87c0: 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41  nfo",     (SYSCA
87d0: 4c 4c 29 47 65 74 4e 61 74 69 76 65 53 79 73 74  LL)GetNativeSyst
87e0: 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30 20 7d 2c  emInfo,     0 },
87f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 4e  .#else.  { "GetN
8800: 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22  ativeSystemInfo"
8810: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8820: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8830: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8840: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
8850: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8860: 66 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  fo ((VOID(WINAPI
8870: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
8880: 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79  SYSTEM_INFO))aSy
8890: 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75 72 72 65  scall[71].pCurre
88a0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
88b0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
88c0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 4f 75 74  S_ANSI).  { "Out
88d0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22  putDebugStringA"
88e0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
88f0: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8900: 67 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gA,      0 },.#e
8910: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8920: 65 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20  ebugStringA",   
8930: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8950: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8960: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
8970: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 20 28  utDebugStringA (
8980: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
8990: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
89a0: 37 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  72].pCurrent)..#
89b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
89c0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
89d0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
89e0: 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20  ugStringW",     
89f0: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8a00: 44 65 62 75 67 53 74 72 69 6e 67 57 2c 20 20 20  DebugStringW,   
8a10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8a20: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8a30: 72 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  ringW",      (SY
8a40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8a60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8a70: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8a80: 67 53 74 72 69 6e 67 57 20 28 28 56 4f 49 44 28  gStringW ((VOID(
8a90: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
8aa0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 33 5d 2e 70  ))aSyscall[73].p
8ab0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
8ac0: 65 74 50 72 6f 63 65 73 73 48 65 61 70 22 2c 20  etProcessHeap", 
8ad0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8ae0: 4c 29 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  L)GetProcessHeap
8af0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
8b00: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 50 72  .#define osGetPr
8b10: 6f 63 65 73 73 48 65 61 70 20 28 28 48 41 4e 44  ocessHeap ((HAND
8b20: 4c 45 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  LE(WINAPI*)(VOID
8b30: 29 29 61 53 79 73 63 61 6c 6c 5b 37 34 5d 2e 70  ))aSyscall[74].p
8b40: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8b50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8b60: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
8b70: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
8b80: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
8b90: 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43 72 65 61  IZE>0).  { "Crea
8ba0: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f  teFileMappingFro
8bb0: 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29  mApp", (SYSCALL)
8bc0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8bd0: 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d 2c 0a 23  gFromApp, 0 },.#
8be0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
8bf0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
8c00: 70 70 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c  pp", (SYSCALL)0,
8c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8c30: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
8c40: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8c50: 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c 45 28 57  omApp ((HANDLE(W
8c60: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20  INAPI*)(HANDLE, 
8c70: 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45 43 55  \.        LPSECU
8c80: 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c  RITY_ATTRIBUTES,
8c90: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 4c 50  ULONG,ULONG64,LP
8ca0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
8cb0: 37 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  75].pCurrent)../
8cc0: 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e 20 73 6f  *.** NOTE: On so
8cd0: 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73  me sub-platforms
8ce0: 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f 63 6b 65  , the Interlocke
8cf0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8d00: 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a 2a 20 20   "function".**  
8d10: 20 20 20 20 20 69 73 20 72 65 61 6c 6c 79 20 6a       is really j
8d20: 75 73 74 20 61 20 6d 61 63 72 6f 20 74 68 61 74  ust a macro that
8d30: 20 75 73 65 73 20 61 20 63 6f 6d 70 69 6c 65 72   uses a compiler
8d40: 20 69 6e 74 72 69 6e 73 69 63 20 28 65 2e 67 2e   intrinsic (e.g.
8d50: 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20 20 20 20   x64)..**       
8d60: 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f  So do not try to
8d70: 20 6d 61 6b 65 20 74 68 69 73 20 69 73 20 69 6e   make this is in
8d80: 74 6f 20 61 20 72 65 64 65 66 69 6e 61 62 6c 65  to a redefinable
8d90: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
8da0: 69 66 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72  if defined(Inter
8db0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8dc0: 68 61 6e 67 65 29 0a 20 20 7b 20 22 49 6e 74 65  hange).  { "Inte
8dd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8de0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8df0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8e00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
8e10: 65 66 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63  efine osInterloc
8e20: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
8e30: 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  ge InterlockedCo
8e40: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 0a 23 65  mpareExchange.#e
8e50: 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f  lse.  { "Interlo
8e60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8e70: 6e 67 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 49  nge", (SYSCALL)I
8e80: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8e90: 65 45 78 63 68 61 6e 67 65 2c 20 30 20 7d 2c 0a  eExchange, 0 },.
8ea0: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8eb0: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ec0: 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28 57 49 4e  hange ((LONG(WIN
8ed0: 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a 20 20 20  API*)(LONG \.   
8ee0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
8ef0: 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20 4c 4f 4e  2_VOLATILE*, LON
8f00: 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63 61 6c 6c  G,LONG))aSyscall
8f10: 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23  [76].pCurrent).#
8f20: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
8f30: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
8f40: 61 72 65 45 78 63 68 61 6e 67 65 29 20 2a 2f 0a  areExchange) */.
8f50: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
8f60: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
8f70: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
8f80: 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55  ITE_WIN32_USE_UU
8f90: 49 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  ID.  { "UuidCrea
8fa0: 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  te",            
8fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64     (SYSCALL)Uuid
8fc0: 43 72 65 61 74 65 2c 20 20 20 20 20 20 20 20 20  Create,         
8fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8fe0: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 22 2c   { "UuidCreate",
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
9000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
9010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9020: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9030: 66 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74  fine osUuidCreat
9040: 65 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52  e ((RPC_STATUS(R
9050: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9060: 29 29 61 53 79 73 63 61 6c 6c 5b 37 37 5d 2e 70  ))aSyscall[77].p
9070: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
9080: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
9090: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
90a0: 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  RT && SQLITE_WIN
90b0: 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 20  32_USE_UUID.  { 
90c0: 22 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  "UuidCreateSeque
90d0: 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53  ntial",     (SYS
90e0: 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65 53  CALL)UuidCreateS
90f0: 65 71 75 65 6e 74 69 61 6c 2c 20 20 20 30 20 7d  equential,   0 }
9100: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75 69  ,.#else.  { "Uui
9110: 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61  dCreateSequentia
9120: 6c 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  l",     (SYSCALL
9130: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
9140: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
9150: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
9160: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
9170: 74 69 61 6c 20 5c 0a 20 20 20 20 20 20 20 20 28  tial \.        (
9180: 28 52 50 43 5f 53 54 41 54 55 53 28 52 50 43 5f  (RPC_STATUS(RPC_
9190: 45 4e 54 52 59 2a 29 28 55 55 49 44 2a 29 29 61  ENTRY*)(UUID*))a
91a0: 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70 43 75 72  Syscall[78].pCur
91b0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
91c0: 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
91d0: 4e 43 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41  NC) && SQLITE_MA
91e0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
91f0: 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69  { "FlushViewOfFi
9200: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  le",          (S
9210: 59 53 43 41 4c 4c 29 46 6c 75 73 68 56 69 65 77  YSCALL)FlushView
9220: 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20 30  OfFile,        0
9230: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
9240: 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c  lushViewOfFile",
9250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9270: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9280: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
9290: 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c  osFlushViewOfFil
92a0: 65 20 5c 0a 20 20 20 20 20 20 20 20 28 28 42 4f  e \.        ((BO
92b0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
92c0: 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61 53 79 73  OID,SIZE_T))aSys
92d0: 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72 72 65 6e  call[79].pCurren
92e0: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
92f0: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
9300: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
9310: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  /../*.** This is
9320: 20 74 68 65 20 78 53 65 74 53 79 73 74 65 6d 43   the xSetSystemC
9330: 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20 6f 66 20  all() method of 
9340: 73 71 6c 69 74 65 33 5f 76 66 73 20 66 6f 72 20  sqlite3_vfs for 
9350: 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20 22 77  all of the.** "w
9360: 69 6e 33 32 22 20 56 46 53 65 73 2e 20 20 52 65  in32" VFSes.  Re
9370: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
9380: 70 6f 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  pon successfully
9390: 20 75 70 64 61 74 69 6e 67 20 74 68 65 0a 2a 2a   updating the.**
93a0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 70 6f 69   system call poi
93b0: 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49 54 45 5f  nter, or SQLITE_
93c0: 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74 68 65 72  NOTFOUND if ther
93d0: 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69 67 75 72  e is no configur
93e0: 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63  able.** system c
93f0: 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e  all named zName.
9400: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9410: 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  inSetSystemCall(
9420: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
9430: 70 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 20 20  pNotUsed,       
9440: 20 2f 2a 20 54 68 65 20 56 46 53 20 70 6f 69 6e   /* The VFS poin
9450: 74 65 72 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a  ter.  Not used *
9460: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9470: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
9480: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73    /* Name of sys
9490: 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72  tem call to over
94a0: 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ride */.  sqlite
94b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e  3_syscall_ptr pN
94c0: 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74  ewFunc  /* Point
94d0: 65 72 20 74 6f 20 6e 65 77 20 73 79 73 74 65 6d  er to new system
94e0: 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29   call value */.)
94f0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
9500: 20 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   i;.  int rc = S
9510: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
9520: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
9530: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
9540: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9550: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e  .    /* If no zN
9560: 61 6d 65 20 69 73 20 67 69 76 65 6e 2c 20 72 65  ame is given, re
9570: 73 74 6f 72 65 20 61 6c 6c 20 73 79 73 74 65 6d  store all system
9580: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 69 72 20   calls to their 
9590: 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73  default.    ** s
95a0: 65 74 74 69 6e 67 73 20 61 6e 64 20 72 65 74 75  ettings and retu
95b0: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20  rn NULL.    */. 
95c0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
95d0: 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  K;.    for(i=0; 
95e0: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
95f0: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
9600: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
9610: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
9620: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a  [i].pDefault ){.
9630: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
9640: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 61  [i].pCurrent = a
9650: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9660: 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ult;.      }.   
9670: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
9680: 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73 20 73  /* If zName is s
9690: 70 65 63 69 66 69 65 64 2c 20 6f 70 65 72 61 74  pecified, operat
96a0: 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e  e on only the on
96b0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20  e system call.  
96c0: 20 20 2a 2a 20 73 70 65 63 69 66 69 65 64 2e 0a    ** specified..
96d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
96e0: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
96f0: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9700: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9710: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
9720: 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61  mp(zName, aSysca
9730: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20  ll[i].zName)==0 
9740: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
9750: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9760: 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ult==0 ){.      
9770: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
9780: 70 44 65 66 61 75 6c 74 20 3d 20 61 53 79 73 63  pDefault = aSysc
9790: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
97a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
97b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
97c0: 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  K;.        if( p
97d0: 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65  NewFunc==0 ) pNe
97e0: 77 46 75 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c  wFunc = aSyscall
97f0: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
9800: 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69        aSyscall[i
9810: 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20 70 4e 65  ].pCurrent = pNe
9820: 77 46 75 6e 63 3b 0a 20 20 20 20 20 20 20 20 62  wFunc;.        b
9830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
9840: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
9850: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
9860: 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
9870: 66 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  f a system call.
9880: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
9890: 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a   zName is not a.
98a0: 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64 20 73 79  ** recognized sy
98b0: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20  stem call name. 
98c0: 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65   NULL is also re
98d0: 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 73 79  turned if the sy
98e0: 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20  stem call.** is 
98f0: 63 75 72 72 65 6e 74 6c 79 20 75 6e 64 65 66 69  currently undefi
9900: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ned..*/.static s
9910: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
9920: 74 72 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43  tr winGetSystemC
9930: 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  all(.  sqlite3_v
9940: 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20  fs *pNotUsed,.  
9950: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9960: 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e.){.  unsigned 
9970: 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44  int i;..  UNUSED
9980: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
9990: 73 65 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sed);.  for(i=0;
99a0: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
99b0: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
99c0: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
99d0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
99e0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
99f0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74  .zName)==0 ) ret
9a00: 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  urn aSyscall[i].
9a10: 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20  pCurrent;.  }.  
9a20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9a30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
9a40: 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  me of the first 
9a50: 73 79 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65  system call afte
9a60: 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61  r zName.  If zNa
9a70: 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e  me==NULL.** then
9a80: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
9a90: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
9aa0: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9ab0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9ac0: 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20  .** is the last 
9ad0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69  system call or i
9ae0: 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74  f zName is not t
9af0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c  he name of a val
9b00: 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  id.** system cal
9b10: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  l..*/.static con
9b20: 73 74 20 63 68 61 72 20 2a 77 69 6e 4e 65 78 74  st char *winNext
9b30: 53 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74  SystemCall(sqlit
9b40: 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74  e3_vfs *p, const
9b50: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20   char *zName){. 
9b60: 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20   int i = -1;..  
9b70: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
9b80: 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  (p);.  if( zName
9b90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
9ba0: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79   i<ArraySize(aSy
9bb0: 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a  scall)-1; i++){.
9bc0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
9bd0: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9be0: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9bf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
9c00: 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72  .  for(i++; i<Ar
9c10: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9c20: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9c30: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9c40: 72 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72  rrent!=0 ) retur
9c50: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  n aSyscall[i].zN
9c60: 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ame;.  }.  retur
9c70: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  n 0;.}..#ifdef S
9c80: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
9c90: 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69  OC./*.** If a Wi
9ca0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
9cb0: 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  has been configu
9cc0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
9cd0: 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  on will attempt 
9ce0: 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74 20 69 74  to.** compact it
9cf0: 2e 20 20 55 70 6f 6e 20 73 75 63 63 65 73 73 2c  .  Upon success,
9d00: 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69 6c 6c 20   SQLITE_OK will 
9d10: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 55 70  be returned.  Up
9d20: 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f 6e 65 0a  on failure, one.
9d30: 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f 4e 4f 4d  ** of SQLITE_NOM
9d40: 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  EM, SQLITE_ERROR
9d50: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
9d60: 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20 72 65 74  OUND will be ret
9d70: 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a 2a 20 22  urned.  The.** "
9d80: 70 6e 4c 61 72 67 65 73 74 22 20 61 72 67 75 6d  pnLargest" argum
9d90: 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a 65 72 6f  ent, if non-zero
9da0: 2c 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  , will be used t
9db0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 73 69 7a  o return the siz
9dc0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 61 72 67  e of the.** larg
9dd0: 65 73 74 20 63 6f 6d 6d 69 74 74 65 64 20 66 72  est committed fr
9de0: 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74 68 65 20  ee block in the 
9df0: 68 65 61 70 2c 20 69 6e 20 62 79 74 65 73 2e 0a  heap, in bytes..
9e00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
9e10: 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f 68 65 61  in32_compact_hea
9e20: 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61 72 67 65  p(LPUINT pnLarge
9e30: 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
9e40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 49 4e  SQLITE_OK;.  UIN
9e50: 54 20 6e 4c 61 72 67 65 73 74 20 3d 20 30 3b 0a  T nLargest = 0;.
9e60: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
9e70: 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  .  winMemAssertM
9e80: 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20  agic();.  hHeap 
9e90: 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  = winMemGetHeap(
9ea0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
9eb0: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
9ec0: 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  t( hHeap!=INVALI
9ed0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
9ee0: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
9ef0: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
9f00: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
9f10: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
9f20: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
9f30: 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20  Validate(hHeap, 
9f40: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
9f50: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
9f60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  ;.#endif.#if !SQ
9f70: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
9f80: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
9f90: 54 0a 20 20 69 66 28 20 28 6e 4c 61 72 67 65 73  T.  if( (nLarges
9fa0: 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61 63 74 28  t=osHeapCompact(
9fb0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
9fc0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 29 29  N32_HEAP_FLAGS))
9fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57 4f 52 44  ==0 ){.    DWORD
9fe0: 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
9ff0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
a000: 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
a010: 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  ==NO_ERROR ){.  
a020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
a030: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
a040: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
a050: 70 61 63 74 20 28 6e 6f 20 73 70 61 63 65 29 2c  pact (no space),
a060: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
a070: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
a080: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20  id*)hHeap);.    
a090: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
a0a0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  MEM_BKPT;.    }e
a0b0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
a0c0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52  e3_log(SQLITE_ER
a0d0: 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  ROR, "failed to 
a0e0: 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c 75  HeapCompact (%lu
a0f0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
a100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
a110: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
a120: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
a130: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a140: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
a150: 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74   }.#else.  sqlit
a160: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
a170: 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64 20  TFOUND, "failed 
a180: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c 20  to HeapCompact, 
a190: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
a1a0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
a1b0: 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53 51  Heap);.  rc = SQ
a1c0: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 23  LITE_NOTFOUND;.#
a1d0: 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c 61  endif.  if( pnLa
a1e0: 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67 65  rgest ) *pnLarge
a1f0: 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a 20  st = nLargest;. 
a200: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a210: 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20  *.** If a Win32 
a220: 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20  native heap has 
a230: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
a240: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
a250: 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a  ill attempt to.*
a260: 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  * destroy and re
a270: 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20 74  create it.  If t
a280: 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20  he Win32 native 
a290: 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f 6c  heap is not isol
a2a0: 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20 74  ated and/or.** t
a2b0: 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  he sqlite3_memor
a2c0: 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69 6f  y_used() functio
a2d0: 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75 72  n does not retur
a2e0: 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f 42  n zero, SQLITE_B
a2f0: 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 72  USY will.** be r
a300: 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 63  eturned and no c
a310: 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 6d  hanges will be m
a320: 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ade to the Win32
a330: 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a 2f   native heap..*/
a340: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e  .int sqlite3_win
a350: 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29 7b  32_reset_heap(){
a360: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55 54  .  int rc;.  MUT
a370: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
a380: 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72  3_mutex *pMaster
a390: 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ; ) /* The main 
a3a0: 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a  static mutex */.
a3b0: 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73    MUTEX_LOGIC( s
a3c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
a3d0: 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65 20  em; )    /* The 
a3e0: 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d 75  memsys static mu
a3f0: 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  tex */.  MUTEX_L
a400: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
a410: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a420: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a430: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
a440: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a450: 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 4d 75  pMem = sqlite3Mu
a460: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
a470: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
a480: 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ); ).  sqlite3_m
a490: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74  utex_enter(pMast
a4a0: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  er);.  sqlite3_m
a4b0: 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 65 6d 29  utex_enter(pMem)
a4c0: 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ;.  winMemAssert
a4d0: 4d 61 67 69 63 28 29 3b 0a 20 20 69 66 28 20 77  Magic();.  if( w
a4e0: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a4f0: 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65 6d 47 65  NULL && winMemGe
a500: 74 4f 77 6e 65 64 28 29 20 26 26 20 73 71 6c 69  tOwned() && sqli
a510: 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28  te3_memory_used(
a520: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  )==0 ){.    /*. 
a530: 20 20 20 2a 2a 20 41 74 20 74 68 69 73 20 70 6f     ** At this po
a540: 69 6e 74 2c 20 74 68 65 72 65 20 73 68 6f 75 6c  int, there shoul
a550: 64 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  d be no outstand
a560: 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  ing memory alloc
a570: 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20 20 2a 2a  ations on.    **
a580: 20 74 68 65 20 68 65 61 70 2e 20 20 41 6c 73 6f   the heap.  Also
a590: 2c 20 73 69 6e 63 65 20 62 6f 74 68 20 74 68 65  , since both the
a5a0: 20 6d 61 73 74 65 72 20 61 6e 64 20 6d 65 6d 73   master and mems
a5b0: 79 73 20 6c 6f 63 6b 73 20 61 72 65 20 63 75 72  ys locks are cur
a5c0: 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 62 65  rently.    ** be
a5d0: 69 6e 67 20 68 65 6c 64 20 62 79 20 75 73 2c 20  ing held by us, 
a5e0: 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  no other functio
a5f0: 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20 61 6e 6f  n (i.e. from ano
a600: 74 68 65 72 20 74 68 72 65 61 64 29 20 73 68 6f  ther thread) sho
a610: 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65 20 61 62  uld.    ** be ab
a620: 6c 65 20 74 6f 20 65 76 65 6e 20 61 63 63 65 73  le to even acces
a630: 73 20 74 68 65 20 68 65 61 70 2e 20 20 41 74 74  s the heap.  Att
a640: 65 6d 70 74 20 74 6f 20 64 65 73 74 72 6f 79 20  empt to destroy 
a650: 61 6e 64 20 72 65 63 72 65 61 74 65 20 6f 75 72  and recreate our
a660: 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61 74 65 64  .    ** isolated
a670: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
a680: 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20  ap now..    */. 
a690: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
a6a0: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a6b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a6c0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
a6d0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a6e0: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
a6f0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
a700: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 77  winMemShutdown(w
a710: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
a720: 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ));.    assert( 
a730: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3d  winMemGetHeap()=
a740: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  =NULL );.    ass
a750: 65 72 74 28 20 21 77 69 6e 4d 65 6d 47 65 74 4f  ert( !winMemGetO
a760: 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73  wned() );.    as
a770: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65  sert( sqlite3_me
a780: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a790: 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 65  ;.    rc = winMe
a7a0: 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47 65 74 44  mInit(winMemGetD
a7b0: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
a7c0: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a7d0: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
a7e0: 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b  tHeap()!=NULL );
a7f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
a800: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69  =SQLITE_OK || wi
a810: 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29  nMemGetOwned() )
a820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
a830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
a840: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a850: 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c  ed()==0 );.  }el
a860: 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se{.    /*.    *
a870: 2a 20 54 68 65 20 57 69 6e 33 32 20 6e 61 74 69  * The Win32 nati
a880: 76 65 20 68 65 61 70 20 63 61 6e 6e 6f 74 20 62  ve heap cannot b
a890: 65 20 6d 6f 64 69 66 69 65 64 20 62 65 63 61 75  e modified becau
a8a0: 73 65 20 69 74 20 6d 61 79 20 62 65 20 69 6e 20  se it may be in 
a8b0: 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  use..    */.    
a8c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
a8d0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
a8e0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 65 6d  mutex_leave(pMem
a8f0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
a900: 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72  ex_leave(pMaster
a910: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
a920: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
a930: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20  TE_WIN32_MALLOC 
a940: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  */../*.** This f
a950: 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75 74 73 20  unction outputs 
a960: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 28 41  the specified (A
a970: 4e 53 49 29 20 73 74 72 69 6e 67 20 74 6f 20 74  NSI) string to t
a980: 68 65 20 57 69 6e 33 32 20 64 65 62 75 67 67 65  he Win32 debugge
a990: 72 0a 2a 2a 20 28 69 66 20 61 76 61 69 6c 61 62  r.** (if availab
a9a0: 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 73 71  le)..*/..void sq
a9b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77 72 69 74  lite3_win32_writ
a9c0: 65 5f 64 65 62 75 67 28 63 6f 6e 73 74 20 63 68  e_debug(const ch
a9d0: 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74 20 6e 42  ar *zBuf, int nB
a9e0: 75 66 29 7b 0a 20 20 63 68 61 72 20 7a 44 62 67  uf){.  char zDbg
a9f0: 42 75 66 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  Buf[SQLITE_WIN32
aa00: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 5d 3b 0a  _DBG_BUF_SIZE];.
aa10: 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e    int nMin = MIN
aa20: 28 6e 42 75 66 2c 20 28 53 51 4c 49 54 45 5f 57  (nBuf, (SQLITE_W
aa30: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
aa40: 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d 61 79 20  E - 1)); /* may 
aa50: 62 65 20 6e 65 67 61 74 69 76 65 2e 20 2a 2f 0a  be negative. */.
aa60: 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31 20 29 20    if( nMin<-1 ) 
aa70: 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a 20 61 6c  nMin = -1; /* al
aa80: 6c 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  l negative value
aa90: 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20 2a 2f 0a  s become -1. */.
aaa0: 20 20 61 73 73 65 72 74 28 20 6e 4d 69 6e 3d 3d    assert( nMin==
aab0: 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30 20 7c 7c  -1 || nMin==0 ||
aac0: 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f 57 49 4e   nMin<SQLITE_WIN
aad0: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 20  32_DBG_BUF_SIZE 
aae0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
aaf0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
ab00: 52 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b  R.  if( !zBuf ){
ab10: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
ab20: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ab30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 23     return;.  }.#
ab40: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
ab50: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
ab60: 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28 20 6e  AS_ANSI).  if( n
ab70: 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  Min>0 ){.    mem
ab80: 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20  set(zDbgBuf, 0, 
ab90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
aba0: 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20  _BUF_SIZE);.    
abb0: 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20  memcpy(zDbgBuf, 
abc0: 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20  zBuf, nMin);.   
abd0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
abe0: 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29 3b 0a  ringA(zDbgBuf);.
abf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 73 4f    }else{.    osO
ac00: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
ac10: 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6c  A(zBuf);.  }.#el
ac20: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
ac30: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
ac40: 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42  ).  memset(zDbgB
ac50: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
ac60: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ac70: 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75 6c 74  );.  if ( osMult
ac80: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
ac90: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41 72 65  .          osAre
aca0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 3f  FileApisANSI() ?
acb0: 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d   CP_ACP : CP_OEM
acc0: 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20 20 20  CP, 0, zBuf,.   
acd0: 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28 4c 50         nMin, (LP
ace0: 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20 53 51  WSTR)zDbgBuf, SQ
acf0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
ad00: 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66 28 57  UF_SIZE/sizeof(W
ad10: 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20 20 20  CHAR))<=0 ){.   
ad20: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
ad30: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
ad40: 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a 44 62  ngW((LPCWSTR)zDb
ad50: 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20 69  gBuf);.#else.  i
ad60: 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20  f( nMin>0 ){.   
ad70: 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c   memset(zDbgBuf,
ad80: 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   0, SQLITE_WIN32
ad90: 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a  _DBG_BUF_SIZE);.
ada0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42      memcpy(zDbgB
adb0: 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b  uf, zBuf, nMin);
adc0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
add0: 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62 67 42  err, "%s", zDbgB
ade0: 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  uf);.  }else{.  
adf0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
ae00: 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
ae10: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
ae20: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
ae30: 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65 6e 64   routine suspend
ae40: 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  s the current th
ae50: 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65 61 73  read for at leas
ae60: 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73 65 63  t ms.** millisec
ae70: 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73 20 65  onds.  This is e
ae80: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
ae90: 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29 20 69   Win32 Sleep() i
aea0: 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66  nterface..*/.#if
aeb0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
aec0: 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45 20 73  .static HANDLE s
aed0: 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
aee0: 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73 71 6c  #endif..void sql
aef0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
af00: 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65 63 6f  (DWORD milliseco
af10: 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  nds){.#if SQLITE
af20: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 20 28  _OS_WINRT.  if (
af30: 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c 4c 20   sleepObj==NULL 
af40: 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20  ){.    sleepObj 
af50: 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  = osCreateEventE
af60: 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 43  xW(NULL, NULL, C
af70: 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41 4e 55  REATE_EVENT_MANU
af80: 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20 20 20  AL_RESET,.      
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 53 59 4e 43 48 52            SYNCHR
afb0: 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20 61 73  ONIZE);.  }.  as
afc0: 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a 21 3d  sert( sleepObj!=
afd0: 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61 69 74  NULL );.  osWait
afe0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
aff0: 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69 6c 6c  x(sleepObj, mill
b000: 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53 45 29  iseconds, FALSE)
b010: 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c 65 65  ;.#else.  osSlee
b020: 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 3b  p(milliseconds);
b030: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
b040: 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52  QLITE_MAX_WORKER
b050: 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20 21 53  _THREADS>0 && !S
b060: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
b070: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
b080: 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  RT && \.        
b090: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
b0a0: 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69 74 65  E>0.DWORD sqlite
b0b0: 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e 44 4c  3Win32Wait(HANDL
b0c0: 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20 44 57  E hObject){.  DW
b0d0: 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c 65 28  ORD rc;.  while(
b0e0: 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46 6f 72   (rc = osWaitFor
b0f0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 68  SingleObjectEx(h
b100: 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49 54 45  Object, INFINITE
b110: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b130: 20 20 20 20 20 20 20 20 20 54 52 55 45 29 29 3d           TRUE))=
b140: 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c 45 54  =WAIT_IO_COMPLET
b150: 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75 72 6e  ION ){}.  return
b160: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
b170: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
b180: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 77   (non-zero) if w
b190: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 75 6e  e are running un
b1a0: 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e 32 4b  der WinNT, Win2K
b1b0: 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72 20 57  , WinXP,.** or W
b1c0: 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20 66 61  inCE.  Return fa
b1d0: 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57  lse (zero) for W
b1e0: 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20  in95, Win98, or 
b1f0: 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72  WinME..**.** Her
b200: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74  e is an interest
b210: 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a  ing observation:
b220: 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20    Win95, Win98, 
b230: 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a  and WinME lack.*
b240: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
b250: 28 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20  () API.  But we 
b260: 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63  can still static
b270: 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73  ally link agains
b280: 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73  t that.** API as
b290: 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27   long as we don'
b2a0: 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e 20 72  t call it when r
b2b0: 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f  unning Win95/98/
b2c0: 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a  ME.  A call to.*
b2d0: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * this routine i
b2e0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
b2f0: 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74 20  ine if the host 
b300: 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f  is Win95/98/ME o
b310: 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50  r.** WinNT/2K/XP
b320: 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c   so that we will
b330: 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72   know whether or
b340: 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65   not we can safe
b350: 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c  ly call.** the L
b360: 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e  ockFileEx() API.
b370: 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  .*/..#if !SQLITE
b380: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
b390: 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  NEX.# define osI
b3a0: 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66  sNT()  (1).#elif
b3b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
b3c0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
b3d0: 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NRT || !defined(
b3e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b3f0: 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e 65 20  _ANSI).# define 
b400: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
b410: 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  lif !defined(SQL
b420: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
b430: 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  DE).# define osI
b440: 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c 73 65  sNT()  (0).#else
b450: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
b460: 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f 6f 73  ()  ((sqlite3_os
b470: 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73 71 6c  _type==2) || sql
b480: 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74  ite3_win32_is_nt
b490: 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ()).#endif../*.*
b4a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
b4b0: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 74 68  determines if th
b4c0: 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72 75 6e  e machine is run
b4d0: 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e 20 6f  ning a version o
b4e0: 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62 61 73  f Windows.** bas
b4f0: 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72  ed on the NT ker
b500: 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  nel..*/.int sqli
b510: 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e 74 28  te3_win32_is_nt(
b520: 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54  void){.#if SQLIT
b530: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 2f 2a 0a  E_OS_WINRT.  /*.
b540: 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65 20 57    ** NOTE: The W
b550: 69 6e 52 54 20 73 75 62 2d 70 6c 61 74 66 6f 72  inRT sub-platfor
b560: 6d 20 69 73 20 61 6c 77 61 79 73 20 61 73 73 75  m is always assu
b570: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
b580: 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a 2a 20 20  on the NT.  **  
b590: 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a       kernel..  *
b5a0: 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  /.  return 1;.#e
b5b0: 6c 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  lif SQLITE_WIN32
b5c0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20  _GETVERSIONEX.  
b5d0: 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  if( osInterlocke
b5e0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b5f0: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b600: 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 23  e, 0, 0)==0 ){.#
b610: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
b620: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b630: 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49  ).    OSVERSIONI
b640: 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20 20 20  NFOA sInfo;.    
b650: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
b660: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
b670: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  of(sInfo);.    o
b680: 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41 28 26  sGetVersionExA(&
b690: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49 6e  sInfo);.    osIn
b6a0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
b6b0: 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65  Exchange(&sqlite
b6c0: 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20 20  3_os_type,.     
b6d0: 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61 74     (sInfo.dwPlat
b6e0: 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50 4c  formId == VER_PL
b6f0: 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54 29  ATFORM_WIN32_NT)
b700: 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23 65   ? 2 : 1, 0);.#e
b710: 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
b720: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
b730: 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  E).    OSVERSION
b740: 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20 20 20  INFOW sInfo;.   
b750: 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69   sInfo.dwOSVersi
b760: 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a  onInfoSize = siz
b770: 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20  eof(sInfo);.    
b780: 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 57 28  osGetVersionExW(
b790: 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 49  &sInfo);.    osI
b7a0: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
b7b0: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
b7c0: 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20 20  e3_os_type,.    
b7d0: 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c 61      (sInfo.dwPla
b7e0: 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f 50  tformId == VER_P
b7f0: 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e 54  LATFORM_WIN32_NT
b800: 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a 23  ) ? 2 : 1, 0);.#
b810: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
b820: 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  rn osInterlocked
b830: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
b840: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
b850: 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 69  , 2, 2)==2;.#eli
b860: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
b870: 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f  return osInterlo
b880: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b890: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b8a0: 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a  type, 2, 2)==2;.
b8b0: 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
b8c0: 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d 70 6c  NOTE: All sub-pl
b8d0: 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20 74 68  atforms where th
b8e0: 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78 5b 41  e GetVersionEx[A
b8f0: 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  W] functions are
b900: 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65 70 72  .  **       depr
b910: 65 63 61 74 65 64 20 61 72 65 20 61 6c 77 61 79  ecated are alway
b920: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 20  s assumed to be 
b930: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
b940: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
b950: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
b960: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
b970: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
b980: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42 79  .** Allocate nBy
b990: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e 0a 2a  tes of memory..*
b9a0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
b9b0: 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20  inMemMalloc(int 
b9c0: 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c  nBytes){.  HANDL
b9d0: 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20  E hHeap;.  void 
b9e0: 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73  *p;..  winMemAss
b9f0: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
ba00: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
ba10: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
ba20: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
ba30: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
ba40: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
ba50: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
ba60: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
ba70: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
ba80: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
ba90: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
baa0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
bab0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bac0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c  _HEAP_FLAGS, NUL
bad0: 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  L) );.#endif.  a
bae0: 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d 30  ssert( nBytes>=0
baf0: 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65 61 70   );.  p = osHeap
bb00: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
bb10: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bb20: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
bb30: 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21 70 20  ytes);.  if( !p 
bb40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
bb50: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
bb60: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
bb70: 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73 20 28  Alloc %u bytes (
bb80: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bba0: 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73  nBytes, osGetLas
bbb0: 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a  tError(), (void*
bbc0: 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72  )hHeap);.  }.  r
bbd0: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
bbe0: 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e 0a 2a  * Free memory..*
bbf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
bc00: 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70  nMemFree(void *p
bc10: 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44 4c 45  Prior){.  HANDLE
bc20: 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65   hHeap;..  winMe
bc30: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
bc40: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
bc50: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
bc60: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
bc70: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bc80: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
bc90: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
bca0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bcb0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bcc0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
bcd0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
bce0: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
bcf0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bd00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bd10: 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64   pPrior) );.#end
bd20: 69 66 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72  if.  if( !pPrior
bd30: 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20 50 61   ) return; /* Pa
bd40: 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20 48 65  ssing NULL to He
bd50: 61 70 46 72 65 65 20 69 73 20 75 6e 64 65 66 69  apFree is undefi
bd60: 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 21 6f  ned. */.  if( !o
bd70: 73 48 65 61 70 46 72 65 65 28 68 48 65 61 70 2c  sHeapFree(hHeap,
bd80: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bd90: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
bda0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
bdb0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
bdc0: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
bdd0: 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25 70 20  apFree block %p 
bde0: 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c  (%lu), heap=%p",
bdf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
be00: 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74 4c 61   pPrior, osGetLa
be10: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
be20: 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 7d 0a  *)hHeap);.  }.}.
be30: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
be40: 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65 78 69  e size of an exi
be50: 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c 6c  sting memory all
be60: 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ocation.*/.stati
be70: 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 52 65  c void *winMemRe
be80: 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50 72 69  alloc(void *pPri
be90: 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73 29 7b  or, int nBytes){
bea0: 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b  .  HANDLE hHeap;
beb0: 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77  .  void *p;..  w
bec0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
bed0: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
bee0: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
bef0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
bf00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
bf10: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
bf20: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
bf30: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
bf40: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
bf50: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
bf60: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
bf70: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
bf80: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
bf90: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
bfa0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a  AGS, pPrior) );.
bfb0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
bfc0: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
bfd0: 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b 0a 20  if( !pPrior ){. 
bfe0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c     p = osHeapAll
bff0: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
c000: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c010: 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65  S, (SIZE_T)nByte
c020: 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  s);.  }else{.   
c030: 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41 6c 6c   p = osHeapReAll
c040: 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  oc(hHeap, SQLITE
c050: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c060: 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49 5a 45  S, pPrior, (SIZE
c070: 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 0a  _T)nBytes);.  }.
c080: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
c090: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c0a0: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
c0b0: 64 20 74 6f 20 25 73 20 25 75 20 62 79 74 65 73  d to %s %u bytes
c0c0: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
c0d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c0e0: 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65 61 70    pPrior ? "Heap
c0f0: 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65 61 70  ReAlloc" : "Heap
c100: 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73 2c 20  Alloc", nBytes, 
c110: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
c120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c130: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
c140: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
c150: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c160: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
c170: 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c 6c 6f  outstanding allo
c180: 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74 65 73  cation, in bytes
c190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c1a0: 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20  winMemSize(void 
c1b0: 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48  *p){.  HANDLE hH
c1c0: 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20 6e 3b  eap;.  SIZE_T n;
c1d0: 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ..  winMemAssert
c1e0: 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70  Magic();.  hHeap
c1f0: 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70   = winMemGetHeap
c200: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48  ();.  assert( hH
c210: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
c220: 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c  rt( hHeap!=INVAL
c230: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
c240: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
c250: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
c260: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
c270: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
c280: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
c290: 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c  pValidate(hHeap,
c2a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
c2b0: 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29 3b 0a  AP_FLAGS, p) );.
c2c0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 20  #endif.  if( !p 
c2d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 20  ) return 0;.  n 
c2e0: 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68 48 65  = osHeapSize(hHe
c2f0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c300: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 3b  _HEAP_FLAGS, p);
c310: 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a 45 5f  .  if( n==(SIZE_
c320: 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  T)-1 ){.    sqli
c330: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c340: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
c350: 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63 6b 20   HeapSize block 
c360: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
c370: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
c380: 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61 73 74      p, osGetLast
c390: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
c3a0: 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65 74 75  hHeap);.    retu
c3b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
c3c0: 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a  rn (int)n;.}../*
c3d0: 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61 20 72  .** Round up a r
c3e0: 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f 20 74  equest size to t
c3f0: 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20 61 6c  he next valid al
c400: 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e 0a 2a  location size..*
c410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
c420: 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74 20 6e  MemRoundup(int n
c430: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  ){.  return n;.}
c440: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
c450: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
c460: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
c470: 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20 2a 70  nMemInit(void *p
c480: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
c490: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
c4a0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
c4b0: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
c4c0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
c4d0: 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  a ) return SQLIT
c4e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73 65 72  E_ERROR;.  asser
c4f0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c500: 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic1==WINMEM_M
c510: 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72  AGIC1 );.  asser
c520: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c530: 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d  magic2==WINMEM_M
c540: 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20 21 53  AGIC2 );..#if !S
c550: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
c560: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  & SQLITE_WIN32_H
c570: 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69 66 28  EAP_CREATE.  if(
c580: 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68   !pWinMemData->h
c590: 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57 4f 52  Heap ){.    DWOR
c5a0: 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 20  D dwInitialSize 
c5b0: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  = SQLITE_WIN32_H
c5c0: 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b 0a 20  EAP_INIT_SIZE;. 
c5d0: 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78 69 6d     DWORD dwMaxim
c5e0: 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52 44 29  umSize = (DWORD)
c5f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
c600: 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20 20 69  fig.nHeap;.    i
c610: 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  f( dwMaximumSize
c620: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 77 4d  ==0 ){.      dwM
c630: 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53 51 4c  aximumSize = SQL
c640: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d  ITE_WIN32_HEAP_M
c650: 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 65 6c  AX_SIZE;.    }el
c660: 73 65 20 69 66 28 20 64 77 49 6e 69 74 69 61 6c  se if( dwInitial
c670: 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d 53 69  Size>dwMaximumSi
c680: 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77 49 6e  ze ){.      dwIn
c690: 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77 4d 61  itialSize = dwMa
c6a0: 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20 20 7d  ximumSize;.    }
c6b0: 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61  .    pWinMemData
c6c0: 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65 61 70  ->hHeap = osHeap
c6d0: 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f 57 49  Create(SQLITE_WI
c6e0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 0a  N32_HEAP_FLAGS,.
c6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c710: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
c720: 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d 53 69  ize, dwMaximumSi
c730: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 57  ze);.    if( !pW
c740: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c750: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c760: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c770: 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20 22 66  EM,.          "f
c780: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 72 65  ailed to HeapCre
c790: 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61 67 73  ate (%lu), flags
c7a0: 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d 25 6c  =%u, initSize=%l
c7b0: 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75 22 2c  u, maxSize=%lu",
c7c0: 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  .          osGet
c7d0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53 51 4c  LastError(), SQL
c7e0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c7f0: 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61 6c 53  LAGS, dwInitialS
c800: 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 64  ize,.          d
c810: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
c820: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c830: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
c840: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
c850: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54  Data->bOwned = T
c860: 52 55 45 3b 0a 20 20 20 20 61 73 73 65 72 74 28  RUE;.    assert(
c870: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c880: 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  wned );.  }.#els
c890: 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  e.  pWinMemData-
c8a0: 3e 68 48 65 61 70 20 3d 20 6f 73 47 65 74 50 72  >hHeap = osGetPr
c8b0: 6f 63 65 73 73 48 65 61 70 28 29 3b 0a 20 20 69  ocessHeap();.  i
c8c0: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
c8d0: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 73 71  >hHeap ){.    sq
c8e0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c8f0: 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20  _NOMEM,.        
c900: 22 66 61 69 6c 65 64 20 74 6f 20 47 65 74 50 72  "failed to GetPr
c910: 6f 63 65 73 73 48 65 61 70 20 28 25 6c 75 29 22  ocessHeap (%lu)"
c920: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c930: 28 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ());.    return 
c940: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
c950: 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e 4d 65 6d  T;.  }.  pWinMem
c960: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46  Data->bOwned = F
c970: 41 4c 53 45 3b 0a 20 20 61 73 73 65 72 74 28 20  ALSE;.  assert( 
c980: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f  !pWinMemData->bO
c990: 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69 66 0a 20  wned );.#endif. 
c9a0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
c9b0: 44 61 74 61 2d 3e 68 48 65 61 70 21 3d 30 20 29  Data->hHeap!=0 )
c9c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  ;.  assert( pWin
c9d0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c9e0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c9f0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
ca00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
ca10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
ca20: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
ca30: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
ca40: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 70  osHeapValidate(p
ca50: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
ca60: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ca70: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
ca80: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ) );.#endif.  re
ca90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e 69 74 69  }../*.** Deiniti
cab0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
cac0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
cad0: 64 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e  d winMemShutdown
cae0: 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29  (void *pAppData)
caf0: 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a  {.  winMemData *
cb00: 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77  pWinMemData = (w
cb10: 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70  inMemData *)pApp
cb20: 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57  Data;..  if( !pW
cb30: 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75  inMemData ) retu
cb40: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  rn;.  assert( pW
cb50: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
cb60: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
cb70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
cb80: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
cb90: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
cba0: 20 29 3b 0a 0a 20 20 69 66 28 20 70 57 69 6e 4d   );..  if( pWinM
cbb0: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
cbc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69  .    assert( pWi
cbd0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21  nMemData->hHeap!
cbe0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
cbf0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
cc00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
cc10: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
cc20: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
cc30: 49 44 41 54 45 29 0a 20 20 20 20 61 73 73 65 72  IDATE).    asser
cc40: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
cc50: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
cc60: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
cc70: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
cc80: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
cc90: 20 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61     if( pWinMemDa
cca0: 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b 0a 20 20  ta->bOwned ){.  
ccb0: 20 20 20 20 69 66 28 20 21 6f 73 48 65 61 70 44      if( !osHeapD
ccc0: 65 73 74 72 6f 79 28 70 57 69 6e 4d 65 6d 44 61  estroy(pWinMemDa
ccd0: 74 61 2d 3e 68 48 65 61 70 29 20 29 7b 0a 20 20  ta->hHeap) ){.  
cce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
ccf0: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
cd00: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 44  "failed to HeapD
cd10: 65 73 74 72 6f 79 20 28 25 6c 75 29 2c 20 68 65  estroy (%lu), he
cd20: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
cd40: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
cd50: 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44 61 74 61  oid*)pWinMemData
cd60: 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  ->hHeap);.      
cd70: 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d 65 6d 44  }.      pWinMemD
cd80: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 46 41  ata->bOwned = FA
cd90: 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  LSE;.    }.    p
cda0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cdb0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  p = NULL;.  }.}.
cdc0: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
cdd0: 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65  the low-level me
cde0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
cdf0: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72  function pointer
ce00: 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 47  s in.** sqlite3G
ce10: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 77 69  lobalConfig.m wi
ce20: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
ce30: 68 65 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  he routines in t
ce40: 68 69 73 20 66 69 6c 65 2e 20 54 68 65 0a 2a 2a  his file. The.**
ce50: 20 61 72 67 75 6d 65 6e 74 73 20 73 70 65 63 69   arguments speci
ce60: 66 79 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20  fy the block of 
ce70: 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e 61 67 65  memory to manage
ce80: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ce90: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
cea0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  led by sqlite3_c
ceb0: 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20 74 68 65  onfig(), and the
cec0: 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20 6e 6f 74  refore.** is not
ced0: 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
cee0: 74 68 72 65 61 64 73 61 66 65 20 28 69 74 20 69  threadsafe (it i
cef0: 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f 6e 73 74  s not)..*/.const
cf00: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
cf10: 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d  hods *sqlite3Mem
cf20: 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 7b 0a  GetWin32(void){.
cf30: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
cf40: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
cf50: 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73  ds winMemMethods
cf60: 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d 65 6d 4d   = {.    winMemM
cf70: 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65  alloc,.    winMe
cf80: 6d 46 72 65 65 2c 0a 20 20 20 20 77 69 6e 4d 65  mFree,.    winMe
cf90: 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  mRealloc,.    wi
cfa0: 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20 20 77 69  nMemSize,.    wi
cfb0: 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a 20 20 20  nMemRoundup,.   
cfc0: 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a 20 20 20   winMemInit,.   
cfd0: 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 2c   winMemShutdown,
cfe0: 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61  .    &win_mem_da
cff0: 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74 75 72 6e  ta.  };.  return
d000: 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f 64 73 3b   &winMemMethods;
d010: 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .}..void sqlite3
d020: 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 76 6f  MemSetDefault(vo
d030: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 63  id){.  sqlite3_c
d040: 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
d050: 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73 71 6c 69  FIG_MALLOC, sqli
d060: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 29  te3MemGetWin32()
d070: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
d080: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
d090: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  OC */../*.** Con
d0a0: 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74 72  vert a UTF-8 str
d0b0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d0c0: 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20   Unicode..**.** 
d0d0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d0e0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
d0f0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d100: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d110: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c  c()..*/.static L
d120: 50 57 53 54 52 20 77 69 6e 55 74 66 38 54 6f 55  PWSTR winUtf8ToU
d130: 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61  nicode(const cha
d140: 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 69 6e 74  r *zText){.  int
d150: 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57 53 54 52   nChar;.  LPWSTR
d160: 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a 20 20 6e   zWideText;..  n
d170: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
d180: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
d190: 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20  UTF8, 0, zText, 
d1a0: 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20  -1, NULL, 0);.  
d1b0: 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a  if( nChar==0 ){.
d1c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d1d0: 7d 0a 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20  }.  zWideText = 
d1e0: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
d1f0: 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65 6f 66 28  o( nChar*sizeof(
d200: 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20  WCHAR) );.  if( 
d210: 7a 57 69 64 65 54 65 78 74 3d 3d 30 20 29 7b 0a  zWideText==0 ){.
d220: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d230: 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75  }.  nChar = osMu
d240: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
d250: 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54  r(CP_UTF8, 0, zT
d260: 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64 65 54 65  ext, -1, zWideTe
d270: 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  xt,.            
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d290: 20 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66      nChar);.  if
d2a0: 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20  ( nChar==0 ){.  
d2b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d2c0: 57 69 64 65 54 65 78 74 29 3b 0a 20 20 20 20 7a  WideText);.    z
d2d0: 57 69 64 65 54 65 78 74 20 3d 20 30 3b 0a 20 20  WideText = 0;.  
d2e0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57 69 64 65  }.  return zWide
d2f0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Text;.}../*.** C
d300: 6f 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f  onvert a Microso
d310: 66 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e  ft Unicode strin
d320: 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a  g to UTF-8..**.*
d330: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
d340: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
d350: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
d360: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d370: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
d380: 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64   char *winUnicod
d390: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
d3a0: 7a 57 69 64 65 54 65 78 74 29 7b 0a 20 20 69 6e  zWideText){.  in
d3b0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
d3c0: 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42 79 74 65  *zText;..  nByte
d3d0: 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d   = osWideCharToM
d3e0: 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38  ultiByte(CP_UTF8
d3f0: 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20  , 0, zWideText, 
d400: 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  -1, 0, 0, 0, 0);
d410: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
d420: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
d430: 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d  0;.  }.  zText =
d440: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d450: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
d460: 66 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20  f( zText==0 ){. 
d470: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d480: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
d490: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
d4a0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
d4b0: 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78  deText, -1, zTex
d4c0: 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  t, nByte,.      
d4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4e0: 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 29 3b            0, 0);
d4f0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
d500: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d510: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
d520: 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d    zText = 0;.  }
d530: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b  .  return zText;
d540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d550: 74 20 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67  t an ANSI string
d560: 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e   to Microsoft Un
d570: 69 63 6f 64 65 2c 20 75 73 69 6e 67 20 74 68 65  icode, using the
d580: 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a 2a 2a 20   ANSI or OEM.** 
d590: 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  code page..**.**
d5a0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d5b0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d5c0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d5d0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d5e0: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d5f0: 4c 50 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f  LPWSTR winMbcsTo
d600: 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  Unicode(const ch
d610: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
d620: 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e  seAnsi){.  int n
d630: 42 79 74 65 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Byte;.  LPWSTR z
d640: 4d 62 63 73 54 65 78 74 3b 0a 20 20 69 6e 74 20  MbcsText;.  int 
d650: 63 6f 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e  codepage = useAn
d660: 73 69 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50  si ? CP_ACP : CP
d670: 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65  _OEMCP;..  nByte
d680: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d690: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
d6a0: 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c  e, 0, zText, -1,
d6b0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
d6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6d0: 20 20 20 20 20 20 20 30 29 2a 73 69 7a 65 6f 66         0)*sizeof
d6e0: 28 57 43 48 41 52 29 3b 0a 20 20 69 66 28 20 6e  (WCHAR);.  if( n
d6f0: 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Byte==0 ){.    r
d700: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d710: 4d 62 63 73 54 65 78 74 20 3d 20 73 71 6c 69 74  MbcsText = sqlit
d720: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
d730: 79 74 65 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  yte*sizeof(WCHAR
d740: 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d 62 63 73  ) );.  if( zMbcs
d750: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
d760: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d770: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
d780: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
d790: 65 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c  epage, 0, zText,
d7a0: 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78 74 2c 0a   -1, zMbcsText,.
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7d0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 6e 42  nByte);.  if( nB
d7e0: 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  yte==0 ){.    sq
d7f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 62 63 73  lite3_free(zMbcs
d800: 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d 62 63 73  Text);.    zMbcs
d810: 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Text = 0;.  }.  
d820: 72 65 74 75 72 6e 20 7a 4d 62 63 73 54 65 78 74  return zMbcsText
d830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d840: 72 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55  rt a Microsoft U
d850: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f  nicode string to
d860: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
d870: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2c 0a  aracter string,.
d880: 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53  ** using the ANS
d890: 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65 20 70 61  I or OEM code pa
d8a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  ge..**.** Space 
d8b0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d8c0: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d8d0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d8e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d8f0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77  /.static char *w
d900: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
d910: 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78  LPCWSTR zWideTex
d920: 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b  t, int useAnsi){
d930: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d940: 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 20 20 69  char *zText;.  i
d950: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d960: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d970: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d980: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d990: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d9a0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65  page, 0, zWideTe
d9b0: 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c  xt, -1, 0, 0, 0,
d9c0: 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65   0);.  if( nByte
d9d0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74   == 0 ){.    ret
d9e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65  urn 0;.  }.  zTe
d9f0: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
da00: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b  ocZero( nByte );
da10: 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
da20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
da30: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
da40: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
da50: 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30  Byte(codepage, 0
da60: 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c  , zWideText, -1,
da70: 20 7a 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20   zText,.        
da80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da90: 20 20 20 20 20 20 20 20 6e 42 79 74 65 2c 20 30          nByte, 0
daa0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74  , 0);.  if( nByt
dab0: 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71  e == 0 ){.    sq
dac0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74  lite3_free(zText
dad0: 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30  );.    zText = 0
dae0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
daf0: 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Text;.}../*.** C
db00: 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74 69 2d 62  onvert a multi-b
db10: 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74  yte character st
db20: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a  ring to UTF-8..*
db30: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
db40: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
db50: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
db60: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
db70: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
db80: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 4d 62 63  tic char *winMbc
db90: 73 54 6f 55 74 66 38 28 63 6f 6e 73 74 20 63 68  sToUtf8(const ch
dba0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
dbb0: 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72 20  seAnsi){.  char 
dbc0: 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20 20 4c 50  *zTextUtf8;.  LP
dbd0: 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a  WSTR zTmpWide;..
dbe0: 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69 6e    zTmpWide = win
dbf0: 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 7a 54  MbcsToUnicode(zT
dc00: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20  ext, useAnsi);. 
dc10: 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30   if( zTmpWide==0
dc20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
dc30: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 55 74 66  ;.  }.  zTextUtf
dc40: 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f  8 = winUnicodeTo
dc50: 55 74 66 38 28 7a 54 6d 70 57 69 64 65 29 3b 0a  Utf8(zTmpWide);.
dc60: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dc70: 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74 75  TmpWide);.  retu
dc80: 72 6e 20 7a 54 65 78 74 55 74 66 38 3b 0a 7d 0a  rn zTextUtf8;.}.
dc90: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
dca0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
dcb0: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
dcc0: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 2e 0a  aracter string..
dcd0: 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  **.** Space to h
dce0: 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64  old the returned
dcf0: 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69   string is obtai
dd00: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
dd10: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74  _malloc()..*/.st
dd20: 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 74  atic char *winUt
dd30: 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73 74 20 63  f8ToMbcs(const c
dd40: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
dd50: 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68 61 72  useAnsi){.  char
dd60: 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a 20 20 4c   *zTextMbcs;.  L
dd70: 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65 3b 0a  PWSTR zTmpWide;.
dd80: 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20 77 69  .  zTmpWide = wi
dd90: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a  nUtf8ToUnicode(z
dda0: 54 65 78 74 29 3b 0a 20 20 69 66 28 20 7a 54 6d  Text);.  if( zTm
ddb0: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
ddc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
ddd0: 7a 54 65 78 74 4d 62 63 73 20 3d 20 77 69 6e 55  zTextMbcs = winU
dde0: 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28 7a 54 6d  nicodeToMbcs(zTm
ddf0: 70 57 69 64 65 2c 20 75 73 65 41 6e 73 69 29 3b  pWide, useAnsi);
de00: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
de10: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65 74  zTmpWide);.  ret
de20: 75 72 6e 20 7a 54 65 78 74 4d 62 63 73 3b 0a 7d  urn zTextMbcs;.}
de30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
de40: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
de50: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66 38   for the winUtf8
de60: 54 6f 55 6e 69 63 6f 64 65 28 29 20 66 75 6e 63  ToUnicode() func
de70: 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53 54 52 20  tion..*/.LPWSTR 
de80: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
de90: 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f  f8_to_unicode(co
dea0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29  nst char *zText)
deb0: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
dec0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
ded0: 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b  .  if( !zText ){
dee0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
def0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
df00: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
df10: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
df20: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
df30: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
df40: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
df50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
df60: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55  if.  return winU
df70: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65  tf8ToUnicode(zTe
df80: 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
df90: 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77  is is a public w
dfa0: 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77  rapper for the w
dfb0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
dfc0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  ) function..*/.c
dfd0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
dfe0: 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74  32_unicode_to_ut
dff0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
e000: 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Text){.#ifdef SQ
e010: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e020: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 57 69  ARMOR.  if( !zWi
e030: 64 65 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76  deText ){.    (v
e040: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
e050: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
e060: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
e070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e080: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e090: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
e0a0: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
e0b0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
e0c0: 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f 64 65 54  turn winUnicodeT
e0d0: 6f 55 74 66 38 28 7a 57 69 64 65 54 65 78 74 29  oUtf8(zWideText)
e0e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e0f0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e100: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 4d  per for the winM
e110: 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e 63  bcsToUtf8() func
e120: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e130: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
e140: 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20  s_to_utf8(const 
e150: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69  char *zText){.#i
e160: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e170: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e180: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
e190: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e1a0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e1b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e1c0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e1d0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e1e0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e1f0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e200: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e210: 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73 54   return winMbcsT
e220: 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 6f 73 41  oUtf8(zText, osA
e230: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
e240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e250: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e260: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e270: 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66 75 6e  MbcsToUtf8() fun
e280: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e290: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
e2a0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f  cs_to_utf8_v2(co
e2b0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
e2c0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23   int useAnsi){.#
e2d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e2e0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e2f0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e300: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e310: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e320: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e330: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e340: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e350: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e360: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e370: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e380: 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62 63 73    return winMbcs
e390: 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20 75 73  ToUtf8(zText, us
e3a0: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eAnsi);.}../*.**
e3b0: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
e3c0: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
e3d0: 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  e winUtf8ToMbcs(
e3e0: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  ) function..*/.c
e3f0: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
e400: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
e410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
e420: 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t){.#ifdef SQLIT
e430: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
e440: 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20  OR.  if( !zText 
e450: 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c  ){.    (void)SQL
e460: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e470: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
e480: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   }.#endif.#ifnde
e490: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e4a0: 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c  TOINIT.  if( sql
e4b0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
e4c0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ) ) return 0;.#e
e4d0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69  ndif.  return wi
e4e0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65 78  nUtf8ToMbcs(zTex
e4f0: 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  t, osAreFileApis
e500: 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ANSI());.}../*.*
e510: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e520: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e530: 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73  he winUtf8ToMbcs
e540: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
e550: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
e560: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
e570: 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  _v2(const char *
e580: 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e  zText, int useAn
e590: 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  si){.#ifdef SQLI
e5a0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
e5b0: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e5c0: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e5d0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e5e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e5f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e600: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e610: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e620: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e630: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e640: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e650: 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 54 65  inUtf8ToMbcs(zTe
e660: 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a  xt, useAnsi);.}.
e670: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
e680: 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 64 61  tion sets the da
e690: 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f 72 20  ta directory or 
e6a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  the temporary di
e6b0: 72 65 63 74 6f 72 79 20 62 61 73 65 64 20 6f 6e  rectory based on
e6c0: 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69 64 65 64  .** the provided
e6d0: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 54 68 65   arguments.  The
e6e0: 20 74 79 70 65 20 61 72 67 75 6d 65 6e 74 20 6d   type argument m
e6f0: 75 73 74 20 62 65 20 31 20 69 6e 20 6f 72 64 65  ust be 1 in orde
e700: 72 20 74 6f 20 73 65 74 20 74 68 65 0a 2a 2a 20  r to set the.** 
e710: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 6f  data directory o
e720: 72 20 32 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  r 2 in order to 
e730: 73 65 74 20 74 68 65 20 74 65 6d 70 6f 72 61 72  set the temporar
e740: 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 54 68  y directory.  Th
e750: 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61 72 67 75  e zValue.** argu
e760: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
e770: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
e780: 79 20 74 6f 20 75 73 65 2e 20 20 54 68 65 20 72  y to use.  The r
e790: 65 74 75 72 6e 20 76 61 6c 75 65 20 77 69 6c 6c  eturn value will
e7a0: 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   be.** SQLITE_OK
e7b0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
e7c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e7d0: 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74 6f  in32_set_directo
e7e0: 72 79 28 44 57 4f 52 44 20 74 79 70 65 2c 20 4c  ry(DWORD type, L
e7f0: 50 43 57 53 54 52 20 7a 56 61 6c 75 65 29 7b 0a  PCWSTR zValue){.
e800: 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72 65 63    char **ppDirec
e810: 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  tory = 0;.#ifnde
e820: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e830: 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72 63 20  TOINIT.  int rc 
e840: 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  = sqlite3_initia
e850: 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63  lize();.  if( rc
e860: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65   ) return rc;.#e
e870: 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70 65 3d  ndif.  if( type=
e880: 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41  =SQLITE_WIN32_DA
e890: 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50  TA_DIRECTORY_TYP
e8a0: 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65 63  E ){.    ppDirec
e8b0: 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33 5f  tory = &sqlite3_
e8c0: 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 3b 0a  data_directory;.
e8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79 70 65    }else if( type
e8e0: 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54  ==SQLITE_WIN32_T
e8f0: 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59  EMP_DIRECTORY_TY
e900: 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72 65  PE ){.    ppDire
e910: 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65 33  ctory = &sqlite3
e920: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
e930: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
e940: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 74  ppDirectory || t
e950: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
e960: 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59  2_DATA_DIRECTORY
e970: 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20 20 20  _TYPE.          
e980: 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  || type==SQLITE_
e990: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
e9a0: 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b 0a 20  TORY_TYPE.  );. 
e9b0: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
e9c0: 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74 65 33  ctory || sqlite3
e9d0: 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70 65 28  MemdebugHasType(
e9e0: 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20 4d 45  *ppDirectory, ME
e9f0: 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b 0a 20  MTYPE_HEAP) );. 
ea00: 20 69 66 28 20 70 70 44 69 72 65 63 74 6f 72 79   if( ppDirectory
ea10: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56   ){.    char *zV
ea20: 61 6c 75 65 55 74 66 38 20 3d 20 30 3b 0a 20 20  alueUtf8 = 0;.  
ea30: 20 20 69 66 28 20 7a 56 61 6c 75 65 20 26 26 20    if( zValue && 
ea40: 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20  zValue[0] ){.   
ea50: 20 20 20 7a 56 61 6c 75 65 55 74 66 38 20 3d 20     zValueUtf8 = 
ea60: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
ea70: 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  (zValue);.      
ea80: 69 66 20 28 20 7a 56 61 6c 75 65 55 74 66 38 3d  if ( zValueUtf8=
ea90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
eaa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
eab0: 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a  M_BKPT;.      }.
eac0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
ead0: 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65 63 74  3_free(*ppDirect
eae0: 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44 69 72  ory);.    *ppDir
eaf0: 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75 65 55  ectory = zValueU
eb00: 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tf8;.    return 
eb10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
eb20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
eb30: 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  RROR;.}../*.** T
eb40: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
eb50: 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  of winGetLastErr
eb60: 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f  orMsg.** is zero
eb70: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   if the error me
eb80: 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68  ssage fits in th
eb90: 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e  e buffer, or non
eba0: 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69  -zero.** otherwi
ebb0: 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61  se (if the messa
ebc0: 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  ge was truncated
ebd0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
ebe0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
ebf0: 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72  Msg(DWORD lastEr
ec00: 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  rno, int nBuf, c
ec10: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
ec20: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72   FormatMessage r
ec30: 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c  eturns 0 on fail
ec40: 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ure.  Otherwise 
ec50: 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  it.  ** returns 
ec60: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43  the number of TC
ec70: 48 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20  HARs written to 
ec80: 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20  the output.  ** 
ec90: 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e  buffer, excludin
eca0: 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e  g the terminatin
ecb0: 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a  g null char..  *
ecc0: 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20  /.  DWORD dwLen 
ecd0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75  = 0;.  char *zOu
ece0: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73  t = 0;..  if( os
ecf0: 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
ed00: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
ed10: 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64    WCHAR zTempWid
ed20: 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e[SQLITE_WIN32_M
ed30: 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b  AX_ERRMSG_CHARS+
ed40: 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  1];.    dwLen = 
ed50: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
ed60: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
ed70: 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20  FROM_SYSTEM |.  
ed80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed90: 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41             FORMA
eda0: 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45  T_MESSAGE_IGNORE
edb0: 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20  _INSERTS,.      
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
ede0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edf0: 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72            lastEr
ee00: 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee20: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20    zTempWide,.   
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ee70: 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53  _WIN32_MAX_ERRMS
ee80: 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20  G_CHARS,.       
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eea0: 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a        0);.#else.
eeb0: 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70      LPWSTR zTemp
eec0: 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Wide = NULL;.   
eed0: 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61   dwLen = osForma
eee0: 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54  tMessageW(FORMAT
eef0: 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54  _MESSAGE_ALLOCAT
ef00: 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20  E_BUFFER |.     
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
ef30: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
ef40: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
ef50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef60: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
ef70: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
ef80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
efa0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efc0: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
efd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efe0: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f000: 20 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52           (LPWSTR
f010: 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20  ) &zTempWide,.  
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f030: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f050: 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23             0);.#
f060: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77  endif.    if( dw
f070: 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20  Len > 0 ){.     
f080: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62   /* allocate a b
f090: 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72  uffer and conver
f0a0: 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20  t to UTF8 */.   
f0b0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
f0c0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
f0d0: 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55       zOut = winU
f0e0: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
f0f0: 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73  mpWide);.      s
f100: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f110: 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51  alloc();.#if !SQ
f120: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
f130: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
f140: 73 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c  system buffer al
f150: 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61  located by Forma
f160: 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20  tMessage */.    
f170: 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54    osLocalFree(zT
f180: 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66  empWide);.#endif
f190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
f1a0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
f1b0: 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
f1c0: 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20      char *zTemp 
f1d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
f1e0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
f1f0: 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageA(FORMAT_MESS
f200: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
f210: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
f220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f230: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
f240: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f270: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
f280: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
f290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2a0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
f2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
f2d0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65      (LPSTR) &zTe
f320: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f340: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f360: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c   0);.    if( dwL
f370: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
f380: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
f390: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
f3a0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
f3b0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
f3c0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f3d0: 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62      zOut = winMb
f3e0: 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20  csToUtf8(zTemp, 
f3f0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
f400: 49 28 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  I());.      sqli
f410: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
f420: 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66  oc();.      /* f
f430: 72 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62  ree the system b
f440: 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  uffer allocated 
f450: 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  by FormatMessage
f460: 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61   */.      osLoca
f470: 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  lFree(zTemp);.  
f480: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
f490: 20 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20   if( 0 == dwLen 
f4a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
f4b0: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
f4c0: 75 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25  uf, "OsError 0x%
f4d0: 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45  lx (%lu)", lastE
f4e0: 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29  rrno, lastErrno)
f4f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
f500: 2a 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d  * copy a maximum
f510: 20 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74   of nBuf chars t
f520: 6f 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  o output buffer 
f530: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  */.    sqlite3_s
f540: 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42  nprintf(nBuf, zB
f550: 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b  uf, "%s", zOut);
f560: 0a 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65  .    /* free the
f570: 20 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a   UTF8 buffer */.
f580: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f590: 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65  (zOut);.  }.  re
f5a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f5b0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f5c0: 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  n - winLogErrorA
f5d0: 74 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c  tLine() - is onl
f5e0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
f5f0: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77  a the macro.** w
f600: 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  inLogError()..**
f610: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f620: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
f630: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
f640: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
f650: 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20  ion..** It logs 
f660: 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20  a message using 
f670: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f  sqlite3_log() co
f680: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72  ntaining the cur
f690: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a  rent value of.**
f6a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c   error code and,
f6b0: 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68   if possible, th
f6c0: 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  e human-readable
f6d0: 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d   equivalent from
f6e0: 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67  .** FormatMessag
f6f0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  e..**.** The fir
f700: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
f710: 65 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20  ed to the macro 
f720: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72  should be the er
f730: 72 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  ror code that.**
f740: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
f750: 64 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67  d to SQLite (e.g
f760: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  . SQLITE_IOERR_D
f770: 45 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41  ELETE, SQLITE_CA
f780: 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20  NTOPEN)..** The 
f790: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
f7a0: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
f7b0: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
f7c0: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
f7d0: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e  hat.** failed an
f7e0: 64 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  d the associated
f7f0: 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74   file-system pat
f800: 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64  h, if any..*/.#d
f810: 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f  efine winLogErro
f820: 72 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e  r(a,b,c,d)   win
f830: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61  LogErrorAtLine(a
f840: 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29  ,b,c,d,__LINE__)
f850: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
f860: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20  ogErrorAtLine(. 
f870: 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20   int errcode,   
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f890: 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72   /* SQLite error
f8a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44   code */.  DWORD
f8b0: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20   lastErrno,     
f8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69             /* Wi
f8d0: 6e 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a  n32 last error *
f8e0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
f8f0: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
f900: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
f910: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
f920: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
f930: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f950: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
f960: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
f970: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
f9a0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
f9b0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
f9c0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67  /.){.  char zMsg
f9d0: 5b 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20  [500];          
f9e0: 20 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20         /* Human 
f9f0: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74  readable error t
fa00: 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ext */.  int i; 
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
fa30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a   counter */..  z
fa40: 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69  Msg[0] = 0;.  wi
fa50: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
fa60: 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65  (lastErrno, size
fa70: 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b  of(zMsg), zMsg);
fa80: 0a 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f  .  assert( errco
fa90: 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de!=SQLITE_OK );
faa0: 0a 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20  .  if( zPath==0 
fab0: 29 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20  ) zPath = "";.  
fac0: 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d  for(i=0; zMsg[i]
fad0: 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72   && zMsg[i]!='\r
fae0: 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c  ' && zMsg[i]!='\
faf0: 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73  n'; i++){}.  zMs
fb00: 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  g[i] = 0;.  sqli
fb10: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
fb20: 0a 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63  .      "os_win.c
fb30: 3a 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73  :%d: (%lu) %s(%s
fb40: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
fb50: 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  Line, lastErrno,
fb60: 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a   zFunc, zPath, z
fb70: 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75  Msg.  );..  retu
fb80: 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f  rn errcode;.}../
fb90: 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20  *.** The number 
fba0: 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20  of times that a 
fbb0: 52 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74  ReadFile(), Writ
fbc0: 65 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c  eFile(), and Del
fbd0: 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c  eteFile().** wil
fbe0: 6c 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c  l be retried fol
fbf0: 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67  lowing a locking
fc00: 20 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c   error - probabl
fc10: 79 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61  y caused by.** a
fc20: 6e 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72  ntivirus softwar
fc30: 65 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69  e.  Also the ini
fc40: 74 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72  tial delay befor
fc50: 65 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72  e the first retr
fc60: 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20  y..** The delay 
fc70: 69 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72  increases linear
fc80: 6c 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74  ly with each ret
fc90: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ry..*/.#ifndef S
fca0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fcb0: 52 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65  R_RETRY.# define
fcc0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
fcd0: 45 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e  ERR_RETRY 10.#en
fce0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
fcf0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
fd00: 45 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66  ETRY_DELAY.# def
fd10: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
fd20: 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c  _IOERR_RETRY_DEL
fd30: 41 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61  AY 25.#endif.sta
fd40: 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
fd50: 52 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57  Retry = SQLITE_W
fd60: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
fd70: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
fd80: 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
fd90: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
fda0: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
fdb0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69  ;../*.** The "wi
fdc0: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
fdd0: 20 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74   macro is used t
fde0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61  o determine if a
fdf0: 20 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a   particular I/O.
fe00: 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62  ** error code ob
fe10: 74 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61  tained via GetLa
fe20: 73 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69  stError() is eli
fe30: 67 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72  gible to be retr
fe40: 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74  ied.  It.** must
fe50: 20 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f   accept the erro
fe60: 72 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20  r code DWORD as 
fe70: 69 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  its only argumen
fe80: 74 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74  t and should ret
fe90: 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20  urn.** non-zero 
fea0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  if the error cod
feb0: 65 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69  e is transient i
fec0: 6e 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65  n nature and the
fed0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65   operation.** re
fee0: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65  sponsible for ge
fef0: 6e 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69  nerating the ori
ff00: 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68  ginal error migh
ff10: 74 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62  t succeed upon b
ff20: 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e  eing.** retried.
ff30: 20 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74    The argument t
ff40: 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f  o this macro sho
ff50: 75 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c  uld be a variabl
ff60: 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f  e..**.** Additio
ff70: 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e  nally, a macro n
ff80: 61 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61  amed "winIoerrCa
ff90: 6e 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20  nRetry2" may be 
ffa0: 64 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a  defined.  If it.
ffb0: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69  ** is defined, i
ffc0: 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c  t will be consul
ffd0: 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68  ted only when th
ffe0: 65 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72  e macro "winIoer
fff0: 72 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72  rCanRetry1".** r
10000 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68  eturns zero.  Th
10010 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
10020 74 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63  try2" macro is c
10030 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e  ompletely option
10040 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65  al and.** may be
10050 20 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65   used to include
10060 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f   additional erro
10070 72 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73  r codes in the s
10080 65 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a  et that should.*
10090 2a 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20  * result in the 
100a0 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72  failing I/O oper
100b0 61 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72  ation being retr
100c0 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  ied by the calle
100d0 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65  r.  If.** define
100e0 64 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72  d, the "winIoerr
100f0 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f  CanRetry2" macro
10100 20 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78   must exhibit ex
10110 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73  ternal semantics
10120 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f  .** identical to
10130 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77   those of the "w
10140 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
10150 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20  " macro..*/.#if 
10160 21 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72  !defined(winIoer
10170 72 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66  rCanRetry1).#def
10180 69 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  ine winIoerrCanR
10190 65 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d  etry1(a) (((a)==
101a0 45 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e  ERROR_ACCESS_DEN
101b0 49 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c  IED)        || \
101c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
101e0 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49  (a)==ERROR_SHARI
101f0 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  NG_VIOLATION)   
10200 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
10210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10220 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
10230 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20  LOCK_VIOLATION) 
10240 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
10250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10260 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
10270 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49  RROR_DEV_NOT_EXI
10280 53 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ST)        || \.
10290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
102b0 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d  a)==ERROR_NETNAM
102c0 45 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20  E_DELETED)      
102d0 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
102e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102f0 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53     ((a)==ERROR_S
10300 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20  EM_TIMEOUT)     
10310 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
10340 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45  ROR_NETWORK_UNRE
10350 41 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66  ACHABLE)).#endif
10360 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61  ../*.** If a Rea
10370 64 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65  dFile() or Write
10380 46 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63  File() error occ
10390 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73  urs, invoke this
103a0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73   routine.** to s
103b0 65 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20  ee if it should 
103c0 62 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74  be retried.  Ret
103d0 75 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72  urn TRUE to retr
103e0 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  y.  Return FALSE
103f0 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77  .** to give up w
10400 69 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ith an error..*/
10410 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52  .static int winR
10420 65 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70  etryIoerr(int *p
10430 6e 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70  nRetry, DWORD *p
10440 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20  Error){.  DWORD 
10450 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  e = osGetLastErr
10460 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52  or();.  if( *pnR
10470 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65  etry>=winIoerrRe
10480 74 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  try ){.    if( p
10490 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a  Error ){.      *
104a0 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20  pError = e;.    
104b0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  }.    return 0;.
104c0 20 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65    }.  if( winIoe
104d0 72 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29  rrCanRetry1(e) )
104e0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69  {.    sqlite3_wi
104f0 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65  n32_sleep(winIoe
10500 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b  rrRetryDelay*(1+
10510 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20  *pnRetry));.    
10520 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20  ++*pnRetry;.    
10530 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69  return 1;.  }.#i
10540 66 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65  f defined(winIoe
10550 72 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65  rrCanRetry2).  e
10560 6c 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72  lse if( winIoerr
10570 43 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a  CanRetry2(e) ){.
10580 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
10590 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
105a0 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
105b0 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
105c0 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
105d0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  turn 1;.  }.#end
105e0 69 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20  if.  if( pError 
105f0 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d  ){.    *pError =
10600 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   e;.  }.  return
10610 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67   0;.}../*.** Log
10620 20 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74   a I/O error ret
10630 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73  ry episode..*/.s
10640 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f  tatic void winLo
10650 67 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72  gIoerr(int nRetr
10660 79 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  y, int lineno){.
10670 20 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a    if( nRetry ){.
10680 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
10690 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20  SQLITE_NOTICE,. 
106a0 20 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64       "delayed %d
106b0 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72  ms for lock/shar
106c0 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20  ing conflict at 
106d0 6c 69 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20  line %d",.      
106e0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
106f0 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72  ay*nRetry*(nRetr
10700 79 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20  y+1)/2, lineno. 
10710 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a     );.  }.}../*.
10720 2a 2a 20 54 68 69 73 20 23 69 66 20 64 6f 65 73  ** This #if does
10730 20 6e 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65   not rely on the
10740 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
10750 20 64 65 66 69 6e 65 20 62 65 63 61 75 73 65 20   define because 
10760 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
10770 64 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20  ding section in 
10780 22 64 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20  "date.c" cannot 
10790 75 73 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21  use it..*/.#if !
107a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
107b0 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26  MIT_LOCALTIME) &
107c0 26 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  & defined(_WIN32
107d0 5f 57 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28  _WCE) && \.    (
107e0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
107f0 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41  MSVC_LOCALTIME_A
10800 50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d  PI) || !SQLITE_M
10810 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
10820 49 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56  I)./*.** The MSV
10830 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73  C CRT on Windows
10840 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65   CE may not have
10850 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66   a localtime() f
10860 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64  unction..** So d
10870 65 66 69 6e 65 20 61 20 73 75 62 73 74 69 74 75  efine a substitu
10880 74 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64  te..*/.#  includ
10890 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63  e <time.h>.struc
108a0 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f  t tm *__cdecl lo
108b0 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69  caltime(const ti
108c0 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61  me_t *t).{.  sta
108d0 74 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b  tic struct tm y;
108e0 0a 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c  .  FILETIME uTm,
108f0 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49   lTm;.  SYSTEMTI
10900 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65  ME pTm;.  sqlite
10910 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74  3_int64 t64;.  t
10920 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d  64 = *t;.  t64 =
10930 20 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33   (t64 + 11644473
10940 36 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20  600)*10000000;. 
10950 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69   uTm.dwLowDateTi
10960 6d 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34  me = (DWORD)(t64
10970 20 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a   & 0xFFFFFFFF);.
10980 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65    uTm.dwHighDate
10990 54 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36  Time= (DWORD)(t6
109a0 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69  4 >> 32);.  osFi
109b0 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c  leTimeToLocalFil
109c0 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29  eTime(&uTm,&lTm)
109d0 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ;.  osFileTimeTo
109e0 53 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c  SystemTime(&lTm,
109f0 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65  &pTm);.  y.tm_ye
10a00 61 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d  ar = pTm.wYear -
10a10 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f   1900;.  y.tm_mo
10a20 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d  n = pTm.wMonth -
10a30 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20   1;.  y.tm_wday 
10a40 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b  = pTm.wDayOfWeek
10a50 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20  ;.  y.tm_mday = 
10a60 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d  pTm.wDay;.  y.tm
10a70 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75  _hour = pTm.wHou
10a80 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20  r;.  y.tm_min = 
10a90 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79  pTm.wMinute;.  y
10aa0 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53  .tm_sec = pTm.wS
10ab0 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20  econd;.  return 
10ac0 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  &y;.}.#endif..#i
10ad0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
10ae0 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  E./*************
10af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
10b30 54 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e  This section con
10b40 74 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57  tains code for W
10b50 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64  inCE only..*/.#d
10b60 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f  efine HANDLE_TO_
10b70 57 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46  WINFILE(a) (winF
10b80 69 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29  ile*)&((char*)a)
10b90 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28  [-(int)offsetof(
10ba0 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a  winFile,h)]../*.
10bb0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63  ** Acquire a loc
10bc0 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20  k on the handle 
10bd0 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  h.*/.static void
10be0 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
10bf0 72 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20  re(HANDLE h){.  
10c00 20 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20   DWORD dwErr;.  
10c10 20 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72   do {.     dwErr
10c20 20 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67   = osWaitForSing
10c30 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49  leObject(h, INFI
10c40 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c  NITE);.   } whil
10c50 65 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54  e (dwErr != WAIT
10c60 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45  _OBJECT_0 && dwE
10c70 72 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44  rr != WAIT_ABAND
10c80 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52  ONED);.}./*.** R
10c90 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63  elease a lock ac
10ca0 71 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d  quired by winceM
10cb0 75 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f  utexAcquire().*/
10cc0 0a 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75  .#define winceMu
10cd0 74 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65  texRelease(h) Re
10ce0 6c 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f  leaseMutex(h)../
10cf0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20  *.** Create the 
10d00 6d 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64  mutex and shared
10d10 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72   memory used for
10d20 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20   locking in the 
10d30 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
10d40 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74  or pFile.*/.stat
10d50 69 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61  ic int winceCrea
10d60 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61  teLock(const cha
10d70 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69  r *zFilename, wi
10d80 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
10d90 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20   LPWSTR zTok;.  
10da0 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20  LPWSTR zName;.  
10db0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
10dc0 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20  .  BOOL bLogged 
10dd0 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20  = FALSE;.  BOOL 
10de0 62 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20  bInit = TRUE;.. 
10df0 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38   zName = winUtf8
10e00 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
10e10 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  ame);.  if( zNam
10e20 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f  e==0 ){.    /* o
10e30 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a  ut of memory */.
10e40 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
10e50 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
10e60 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  PT;.  }..  /* In
10e70 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
10e80 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20  al lockdata */. 
10e90 20 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e   memset(&pFile->
10ea0 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  local, 0, sizeof
10eb0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b  (pFile->local));
10ec0 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74  ..  /* Replace t
10ed0 68 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66  he backslashes f
10ee0 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rom the filename
10ef0 20 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69   and lowercase i
10f00 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65  t.  ** to derive
10f10 20 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a   a mutex name. *
10f20 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61  /.  zTok = osCha
10f30 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a  rLowerW(zName);.
10f40 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54    for (;*zTok;zT
10f50 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a  ok++){.    if (*
10f60 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a  zTok == '\\') *z
10f70 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a  Tok = '_';.  }..
10f80 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e    /* Create/open
10f90 20 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78   the named mutex
10fa0 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75   */.  pFile->hMu
10fb0 74 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75  tex = osCreateMu
10fc0 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45  texW(NULL, FALSE
10fd0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28  , zName);.  if (
10fe0 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b  !pFile->hMutex){
10ff0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
11000 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
11010 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71  tError();.    sq
11020 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65  lite3_free(zName
11030 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
11040 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
11050 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
11060 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63   "winceCreateLoc
11090 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  k1", zFilename);
110a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
110b0 72 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66  re the mutex bef
110c0 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a  ore continuing *
110d0 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  /.  winceMutexAc
110e0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
110f0 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63  tex);..  /* Sinc
11100 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e  e the names of n
11110 61 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65  amed mutexes, se
11120 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d  maphores, file m
11130 61 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a  appings etc are.
11140 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74    ** case-sensit
11150 69 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74  ive, take advant
11160 61 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75  age of that by u
11170 70 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d  ppercasing the m
11180 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61  utex name.  ** a
11190 6e 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73  nd using that as
111a0 20 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65   the shared file
111b0 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20  mapping name..  
111c0 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72  */.  osCharUpper
111d0 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  W(zName);.  pFil
111e0 65 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43  e->hShared = osC
111f0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
11200 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  W(INVALID_HANDLE
11210 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20  _VALUE, NULL,.  
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57        PAGE_READW
11250 52 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28  RITE, 0, sizeof(
11260 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  winceLock),.    
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f      zName);..  /
112a0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61  * Set a flag tha
112b0 74 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72  t indicates we'r
112c0 65 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63  e the first to c
112d0 72 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79  reate the memory
112e0 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74   so it.  ** must
112f0 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c   be zero-initial
11300 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72  ized */.  lastEr
11310 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
11320 72 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61  rror();.  if (la
11330 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52  stErrno == ERROR
11340 5f 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29  _ALREADY_EXISTS)
11350 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41  {.    bInit = FA
11360 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  LSE;.  }..  sqli
11370 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b  te3_free(zName);
11380 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63  ..  /* If we suc
11390 63 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67  ceeded in making
113a0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
113b0 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69  ry handle, map i
113c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  t. */.  if( pFil
113d0 65 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20  e->hShared ){.  
113e0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20    pFile->shared 
113f0 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73  = (winceLock*)os
11400 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
11410 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20  ile->hShared,.  
11420 20 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f             FILE_
11430 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41  MAP_READ|FILE_MA
11440 50 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73  P_WRITE, 0, 0, s
11450 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29  izeof(winceLock)
11460 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70  );.    /* If map
11470 70 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f  ping failed, clo
11480 73 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  se the shared me
11490 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20  mory handle and 
114a0 65 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20  erase it */.    
114b0 69 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72  if( !pFile->shar
114c0 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
114d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
114e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
114f0 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  .      winLogErr
11500 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  or(SQLITE_IOERR,
11510 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
11520 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
11530 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
11540 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61  eLock2", zFilena
11550 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67  me);.      bLogg
11560 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
11570 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
11580 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
11590 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68        pFile->hSh
115a0 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ared = NULL;.   
115b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
115c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f  shared memory co
115d0 75 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74  uld not be creat
115e0 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74  ed, then close t
115f0 68 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69  he mutex and fai
11600 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  l */.  if( pFile
11610 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20  ->hShared==NULL 
11620 29 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67  ){.    if( !bLog
11630 67 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ged ){.      pFi
11640 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
11650 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
11660 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11670 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
11680 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
116a0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33  winceCreateLock3
116b0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
116c0 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
116d0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  RUE;.    }.    w
116e0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
116f0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11700 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
11710 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  le(pFile->hMutex
11720 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d  );.    pFile->hM
11730 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  utex = NULL;.   
11740 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
11750 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OERR;.  }..  /* 
11760 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
11770 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20  hared memory if 
11780 77 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74  we're supposed t
11790 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74  o */.  if( bInit
117a0 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70   ){.    memset(p
117b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c  File->shared, 0,
117c0 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63   sizeof(winceLoc
117d0 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63  k));.  }..  winc
117e0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
117f0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
11800 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11810 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72  ;.}../*.** Destr
11820 6f 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77  oy the part of w
11830 69 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c  inFile that deal
11840 73 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63  s with wince loc
11850 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ks.*/.static voi
11860 64 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f  d winceDestroyLo
11870 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
11880 65 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d  e){.  if (pFile-
11890 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a  >hMutex){.    /*
118a0 20 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74   Acquire the mut
118b0 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d  ex */.    winceM
118c0 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c  utexAcquire(pFil
118d0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20  e->hMutex);..   
118e0 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
118f0 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20  g blocks should 
11900 70 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20  probably assert 
11910 69 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62  in debug mode, b
11920 75 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61  ut they.       a
11930 72 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e  re to cleanup in
11940 20 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20   case any locks 
11950 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f  remained open */
11960 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11970 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
11980 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11990 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
119a0 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  -;.    }.    if 
119b0 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52  (pFile->local.bR
119c0 65 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20  eserved){.      
119d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
119e0 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45  Reserved = FALSE
119f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11a00 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65  pFile->local.bPe
11a10 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46  nding){.      pF
11a20 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
11a30 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20  nding = FALSE;. 
11a40 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
11a50 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
11a60 73 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69  sive){.      pFi
11a70 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11a80 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
11a90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11aa0 2d 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63  -reference and c
11ab0 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66  lose our copy of
11ac0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
11ad0 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ry handle */.   
11ae0 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69   osUnmapViewOfFi
11af0 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  le(pFile->shared
11b00 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  );.    osCloseHa
11b10 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61  ndle(pFile->hSha
11b20 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  red);..    /* Do
11b30 6e 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65  ne with the mute
11b40 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
11b50 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
11b60 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
11b70 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
11b80 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
11b90 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
11ba0 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   NULL;.  }.}../*
11bb0 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74  .** An implement
11bc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63  ation of the Loc
11bd0 6b 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57  kFile() API of W
11be0 69 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f  indows for CE.*/
11bf0 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e  .static BOOL win
11c00 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50  ceLockFile(.  LP
11c10 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20  HANDLE phFile,. 
11c20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66   DWORD dwFileOff
11c30 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
11c40 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
11c50 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
11c60 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
11c70 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
11c80 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
11c90 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65  igh.){.  winFile
11ca0 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45   *pFile = HANDLE
11cb0 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69  _TO_WINFILE(phFi
11cc0 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74  le);.  BOOL bRet
11cd0 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20  urn = FALSE;..  
11ce0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11cf0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67  (dwFileOffsetHig
11d00 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  h);.  UNUSED_PAR
11d10 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66  AMETER(nNumberOf
11d20 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29  BytesToLockHigh)
11d30 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
11d40 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
11d50 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
11d60 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
11d70 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
11d80 57 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75  Wanting an exclu
11d90 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  sive lock? */.  
11da0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11db0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11dc0 41 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20  ARED_FIRST.     
11dd0 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
11de0 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
11df0 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
11e00 5a 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69  ZE){.    if (pFi
11e10 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
11e20 64 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69  ders == 0 && pFi
11e30 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63  le->shared->bExc
11e40 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20  lusive == 0){.  
11e50 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
11e60 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
11e70 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46   TRUE;.       pF
11e80 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11e90 75 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20  usive = TRUE;.  
11ea0 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54       bReturn = T
11eb0 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RUE;.    }.  }..
11ec0 20 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64    /* Want a read
11ed0 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20  -only lock? */. 
11ee0 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
11ef0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
11f00 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
11f10 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e   &&.           n
11f20 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
11f30 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11f40 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61    if (pFile->sha
11f50 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
11f60 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69  == 0){.      pFi
11f70 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
11f80 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20  rs ++;.      if 
11f90 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
11fa0 65 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20  eaders == 1){.  
11fb0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
11fc0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b  red->nReaders ++
11fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11fe0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11ff0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12000 57 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c  Want a pending l
12010 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
12020 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12030 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e  ow == (DWORD)PEN
12040 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20  DING_BYTE.      
12050 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12060 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12070 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66  == 1){.    /* If
12080 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   no pending lock
12090 20 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72   has been acquir
120a0 65 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  ed, then acquire
120b0 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70   it */.    if (p
120c0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
120d0 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20  ending == 0) {. 
120e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
120f0 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54  ed->bPending = T
12100 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
12110 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
12120 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62   = TRUE;.      b
12130 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12140 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
12150 61 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  ant a reserved l
12160 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69  ock? */.  else i
12170 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12180 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53  ow == (DWORD)RES
12190 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20  ERVED_BYTE.     
121a0 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
121b0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
121c0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
121d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
121e0 52 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b  Reserved == 0) {
121f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
12200 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20  ared->bReserved 
12210 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
12220 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
12230 72 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20  rved = TRUE;.   
12240 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12250 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12260 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
12270 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
12280 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75  ;.  return bRetu
12290 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  rn;.}../*.** An 
122a0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
122b0 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65  f the UnlockFile
122c0 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20   API of Windows 
122d0 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63  for CE.*/.static
122e0 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63   BOOL winceUnloc
122f0 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
12300 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
12310 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
12320 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
12330 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
12340 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
12350 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a  tesToUnlockLow,.
12360 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
12370 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69  fBytesToUnlockHi
12380 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
12390 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
123a0 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
123b0 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
123c0 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
123d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
123e0 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
123f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12400 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
12410 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68  ytesToUnlockHigh
12420 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65  );..  if (!pFile
12430 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e  ->hMutex) return
12440 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75   TRUE;.  winceMu
12450 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
12460 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ->hMutex);..  /*
12470 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61   Releasing a rea
12480 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65  der lock or an e
12490 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
124a0 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
124b0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
124c0 29 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a  )SHARED_FIRST){.
124d0 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61      /* Did we ha
124e0 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
124f0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20  lock? */.    if 
12500 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
12510 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
12520 20 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f   assert(nNumberO
12530 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
12540 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
12550 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20  ED_SIZE);.      
12560 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
12570 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b  clusive = FALSE;
12580 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
12590 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
125a0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
125b0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
125c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69      }..    /* Di
125d0 64 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61  d we just have a
125e0 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f   reader lock? */
125f0 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46  .    else if (pF
12600 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
12610 65 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ers){.      asse
12620 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
12630 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12640 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
12650 5a 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ZE.             
12660 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  || nNumberOfByte
12670 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12680 31 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  1);.      pFile-
12690 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
126a0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  --;.      if (pF
126b0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
126c0 65 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20  ers == 0).      
126d0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
126e0 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
126f0 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s --;.      }.  
12700 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12710 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12720 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
12730 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a  pending lock */.
12740 20 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c    else if (dwFil
12750 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
12760 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54  WORD)PENDING_BYT
12770 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
12780 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12790 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
127a0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
127b0 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b  local.bPending){
127c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
127d0 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46  cal.bPending = F
127e0 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
127f0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
12800 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ing = FALSE;.   
12810 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12820 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f  E;.    }.  }.  /
12830 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65  * Releasing a re
12840 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20  served lock */. 
12850 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
12860 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12870 4f 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54  ORD)RESERVED_BYT
12880 45 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  E.           && 
12890 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
128a0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  UnlockLow == 1){
128b0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
128c0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29  local.bReserved)
128d0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
128e0 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
128f0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
12900 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12910 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
12920 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12930 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
12940 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
12950 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
12960 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
12970 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  Return;.}./*.** 
12980 45 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69  End of the speci
12990 61 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63  al code for winc
129a0 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e.**************
129b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
129e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
129f0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a00 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f  E_OS_WINCE */../
12a10 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65  *.** Lock a file
12a20 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74   region..*/.stat
12a30 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46  ic BOOL winLockF
12a40 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
12a50 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
12a60 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f  flags,.  DWORD o
12a70 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
12a80 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
12a90 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
12aa0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
12ab0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
12ac0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
12ad0 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
12ae0 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
12af0 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
12b00 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
12b10 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
12b20 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c    **       API L
12b30 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
12b40 72 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b  return winceLock
12b50 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
12b60 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
12b70 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
12b80 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79             numBy
12b90 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12ba0 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69  High);.#else.  i
12bb0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
12bc0 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76     OVERLAPPED ov
12bd0 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  lp;.    memset(&
12be0 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ovlp, 0, sizeof(
12bf0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
12c00 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20    ovlp.Offset = 
12c10 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f  offsetLow;.    o
12c20 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  vlp.OffsetHigh =
12c30 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20   offsetHigh;.   
12c40 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69   return osLockFi
12c50 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c  leEx(*phFile, fl
12c60 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73  ags, 0, numBytes
12c70 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
12c80 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c  h, &ovlp);.  }el
12c90 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  se{.    return o
12ca0 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c  sLockFile(*phFil
12cb0 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66  e, offsetLow, of
12cc0 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74  fsetHigh, numByt
12cd0 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20  esLow,.         
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
12cf0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
12d00 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
12d10 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  Unlock a file re
12d20 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  gion.. */.static
12d30 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46   BOOL winUnlockF
12d40 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20  ile(.  LPHANDLE 
12d50 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20  phFile,.  DWORD 
12d60 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  offsetLow,.  DWO
12d70 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  RD offsetHigh,. 
12d80 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c   DWORD numBytesL
12d90 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42  ow,.  DWORD numB
12da0 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20  ytesHigh.){.#if 
12db0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
12dc0 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
12dd0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
12de0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
12df0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
12e00 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
12e10 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20  .  **       API 
12e20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  UnlockFile..  */
12e30 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55  .  return winceU
12e40 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65  nlockFile(phFile
12e50 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
12e60 73 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20  setHigh,.       
12e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e80 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e    numBytesLow, n
12e90 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65  umBytesHigh);.#e
12ea0 6c 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  lse.  if( osIsNT
12eb0 28 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41  () ){.    OVERLA
12ec0 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d  PPED ovlp;.    m
12ed0 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20  emset(&ovlp, 0, 
12ee0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
12ef0 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  D));.    ovlp.Of
12f00 66 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77  fset = offsetLow
12f10 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12f20 74 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69  tHigh = offsetHi
12f30 67 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  gh;.    return o
12f40 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70  sUnlockFileEx(*p
12f50 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74  hFile, 0, numByt
12f60 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
12f70 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d  igh, &ovlp);.  }
12f80 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
12f90 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70   osUnlockFile(*p
12fa0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
12fb0 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
12fc0 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29     numBytesHigh)
12ff0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
13000 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
13010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13050 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
13060 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70   of routines imp
13070 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d  lement the I/O m
13080 65 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64  ethods specified
13090 0a 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74  .** by the sqlit
130a0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
130b0 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ject..**********
130c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  ****/../*.** Som
13110 65 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70  e Microsoft comp
13120 69 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20  ilers lack this 
13130 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23  definition..*/.#
13140 69 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53  ifndef INVALID_S
13150 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
13160 23 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44  # define INVALID
13170 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13180 52 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65  R ((DWORD)-1).#e
13190 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
131a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
131b0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ition of the fil
131c0 65 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20  e handle passed 
131d0 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  as the first.** 
131e0 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73  argument to offs
131f0 65 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69  et iOffset withi
13200 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73  n the file. If s
13210 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
13220 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73  n 0..** Otherwis
13230 65 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61  e, set pFile->la
13240 73 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75  stErrno and retu
13250 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a  rn non-zero..*/.
13260 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65  static int winSe
13270 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  ekFile(winFile *
13280 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69  pFile, sqlite3_i
13290 6e 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23  nt64 iOffset){.#
132a0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
132b0 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72  NRT.  LONG upper
132c0 42 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20  Bits;           
132d0 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69        /* Most si
132e0 67 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65  g. 32 bits of ne
132f0 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f  w offset */.  LO
13300 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20  NG lowerBits;   
13310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13320 20 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62   Least sig. 32 b
13330 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65  its of new offse
13340 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52  t */.  DWORD dwR
13350 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
13360 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
13370 72 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46  returned by SetF
13380 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a  ilePointer() */.
13390 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
133a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
133b0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
133c0 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72  ned by GetLastEr
133d0 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52  ror() */..  OSTR
133e0 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
133f0 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c  %p, offset=%lld\
13400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f  n", pFile->h, iO
13410 66 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65  ffset));..  uppe
13420 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28  rBits = (LONG)((
13430 69 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  iOffset>>32) & 0
13440 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f  x7fffffff);.  lo
13450 77 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29  werBits = (LONG)
13460 28 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66  (iOffset & 0xfff
13470 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50  fffff);..  /* AP
13480 49 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63  I oddity: If suc
13490 63 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65  cessful, SetFile
134a0 50 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e  Pointer() return
134b0 73 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63  s a dword.  ** c
134c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
134d0 77 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74  wer 32-bits of t
134e0 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73  he new file-offs
134f0 65 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61  et. Or, if it fa
13500 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74  ils,.  ** it ret
13510 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54  urns INVALID_SET
13520 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48  _FILE_POINTER. H
13530 6f 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67  owever according
13540 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49   to MSDN,.  ** I
13550 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
13560 50 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f  POINTER may also
13570 20 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20   be a valid new 
13580 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65  offset. So to de
13590 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65  termine.  ** whe
135a0 74 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61  ther an error ha
135b0 73 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72  s actually occur
135c0 72 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20  red, it is also 
135d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c  necessary to cal
135e0 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72  l.  ** GetLastEr
135f0 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77  ror()..  */.  dw
13600 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50  Ret = osSetFileP
13610 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c  ointer(pFile->h,
13620 20 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70   lowerBits, &upp
13630 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47  erBits, FILE_BEG
13640 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52  IN);..  if( (dwR
13650 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f  et==INVALID_SET_
13660 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20  FILE_POINTER.   
13670 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e     && ((lastErrn
13680 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
13690 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29  or())!=NO_ERROR)
136a0 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ) ){.    pFile->
136b0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
136c0 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f  Errno;.    winLo
136d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
136e0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
136f0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
13700 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
13710 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
13720 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13730 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13740 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13750 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13760 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13770 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
13780 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
13790 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
137a0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
137b0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
137c0 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a  .#else.  /*.  **
137d0 20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20   Same as above, 
137e0 65 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73  except that this
137f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13800 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e  works for WinRT.
13810 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49  .  */..  LARGE_I
13820 4e 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20  NTEGER x;       
13830 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
13840 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20  new offset */.  
13850 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20  BOOL bRet;      
13860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13870 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
13880 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e  d by SetFilePoin
13890 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e  terEx() */..  x.
138a0 51 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73  QuadPart = iOffs
138b0 65 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53  et;.  bRet = osS
138c0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
138d0 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20  pFile->h, x, 0, 
138e0 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20  FILE_BEGIN);..  
138f0 69 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70  if(!bRet){.    p
13900 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
13910 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
13920 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  ();.    winLogEr
13930 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
13940 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
13950 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
13960 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
13970 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
13980 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
13990 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
139a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
139b0 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
139c0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
139d0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
139e0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
139f0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
13a00 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13a10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
13a20 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ndif.}..#if SQLI
13a30 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13a40 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  >0./* Forward re
13a50 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20  ferences to VFS 
13a60 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75  helper methods u
13a70 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d  sed for memory m
13a80 61 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73  apped files */.s
13a90 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70  tatic int winMap
13aa0 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73  file(winFile*, s
13ab0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73  qlite3_int64);.s
13ac0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d  tatic int winUnm
13ad0 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29  apfile(winFile*)
13ae0 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
13af0 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a  Close a file..**
13b00 0a 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74  .** It is report
13b10 65 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d  ed that an attem
13b20 70 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61  pt to close a ha
13b30 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74  ndle might somet
13b40 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54  imes.** fail.  T
13b50 68 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e  his is a very un
13b60 72 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c  reasonable resul
13b70 74 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69  t, but Windows i
13b80 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66  s notorious.** f
13b90 6f 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f  or being unreaso
13ba0 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f  nable so I do no
13bb0 74 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20  t doubt that it 
13bc0 6d 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49  might happen.  I
13bd0 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66  f.** the close f
13be0 61 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66  ails, we pause f
13bf0 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f  or 100 milliseco
13c00 6e 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69  nds and try agai
13c10 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61  n.  As.** many a
13c20 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  s MX_CLOSE_ATTEM
13c30 50 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63  PT attempts to c
13c40 6c 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20  lose the handle 
13c50 61 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a  are made before.
13c60 2a 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64  ** giving up and
13c70 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
13c80 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ror..*/.#define 
13c90 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54  MX_CLOSE_ATTEMPT
13ca0 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69   3.static int wi
13cb0 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  nClose(sqlite3_f
13cc0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
13cd0 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77  rc, cnt = 0;.  w
13ce0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
13cf0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
13d00 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
13d10 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
13d20 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65  _OMIT_WAL.  asse
13d30 72 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d  rt( pFile->pShm=
13d40 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  =0 );.#endif.  a
13d50 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21  ssert( pFile->h!
13d60 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e  =NULL && pFile->
13d70 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h!=INVALID_HANDL
13d80 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54  E_VALUE );.  OST
13d90 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64  RACE(("CLOSE pid
13da0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
13db0 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  file=%p\n",.    
13dc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13dd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13de0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
13df0 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  );..#if SQLITE_M
13e00 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13e10 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
13e20 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ile);.#endif..  
13e30 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43  do{.    rc = osC
13e40 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65  loseHandle(pFile
13e50 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d  ->h);.    /* Sim
13e60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
13e70 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45  =0; cnt=MX_CLOSE
13e80 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a  _ATTEMPT; ); */.
13e90 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20    }while( rc==0 
13ea0 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c  && ++cnt < MX_CL
13eb0 4f 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28  OSE_ATTEMPT && (
13ec0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
13ed0 65 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a  eep(100), 1) );.
13ee0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
13ef0 4e 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43  NCE.#define WINC
13f00 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
13f10 50 54 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69  PTS 3.  {.    wi
13f20 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70  nVfsAppData *pAp
13f30 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41  pData = (winVfsA
13f40 70 70 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70  ppData*)pFile->p
13f50 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20  Vfs->pAppData;. 
13f60 20 20 20 69 66 28 20 70 41 70 70 44 61 74 61 3d     if( pAppData=
13f70 3d 4e 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61  =NULL || !pAppDa
13f80 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20  ta->bNoLock ){. 
13f90 20 20 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f       winceDestro
13fa0 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
13fb0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46    }.  }.  if( pF
13fc0 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c  ile->zDeleteOnCl
13fd0 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ose ){.    int c
13fe0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  nt = 0;.    whil
13ff0 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  e(.           os
14000 44 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c  DeleteFileW(pFil
14010 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
14020 65 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26  e)==0.        &&
14030 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
14040 75 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65  utesW(pFile->zDe
14050 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78  leteOnClose)!=0x
14060 66 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20  ffffffff.       
14070 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43   && cnt++ < WINC
14080 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  E_DELETION_ATTEM
14090 50 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  PTS.    ){.     
140a0 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
140b0 73 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20  sleep(100);  /* 
140c0 57 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65  Wait a little be
140d0 66 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69  fore trying agai
140e0 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73  n */.    }.    s
140f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c  qlite3_free(pFil
14100 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
14110 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  e);.  }.#endif. 
14120 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70   if( rc ){.    p
14130 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a  File->h = NULL;.
14140 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
14150 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45  r(-1);.  OSTRACE
14160 28 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75  (("CLOSE pid=%lu
14170 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14180 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
14190 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
141a0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
141b0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
141c0 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20  >h, rc ? "ok" : 
141d0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65  "failed"));.  re
141e0 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45  turn rc ? SQLITE
141f0 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
14200 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  : winLogError(SQ
14210 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
14220 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
14230 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
14240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
14250 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d  inClose", pFile-
14260 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >zPath);.}../*.*
14270 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
14280 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
14290 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
142a0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
142b0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
142c0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
142d0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
142e0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
142f0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
14300 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61  tatic int winRea
14310 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
14320 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
14330 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20  /* File to read 
14340 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  from */.  void *
14350 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
14360 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
14370 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
14380 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
14390 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
143a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
143b0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
143c0 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  d */.  sqlite3_i
143d0 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20  nt64 offset     
143e0 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
143f0 6e 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65  ng at this offse
14400 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c  t */.){.#if !SQL
14410 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
14420 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14430 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
14440 50 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45  PED).  OVERLAPPE
14450 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
14460 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66         /* The of
14470 66 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c  fset for ReadFil
14480 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77  e. */.#endif.  w
14490 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
144a0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
144b0 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * file handle */
144c0 0a 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20  .  DWORD nRead; 
144d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
144f0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
14500 65 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f  ead from file */
14510 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
14520 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14530 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14540 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73  retrys */..  ass
14550 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
14560 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b  assert( amt>0 );
14570 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
14580 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  t>=0 );.  Simula
14590 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
145a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
145b0 41 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  AD);.  OSTRACE((
145c0 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
145d0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
145e0 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
145f0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
14600 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14610 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14620 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14630 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14640 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14650 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
14660 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
14670 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53  cktype));..#if S
14680 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
14690 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
146a0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
146b0 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73  this read reques
146c0 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
146d0 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
146e0 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
146f0 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
14700 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
14710 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
14720 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
14730 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
14740 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
14750 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
14760 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
14770 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
14780 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
14790 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  et], amt);.     
147a0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
147b0 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  MMAP pid=%lu, pF
147c0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
147d0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
147e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
147f0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14800 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14810 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14830 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
14840 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
14850 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d  = (int)(pFile->m
14860 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
14870 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
14880 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
14890 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
148a0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
148b0 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
148c0 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
148d0 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
148e0 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
148f0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
14900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
14910 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
14920 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e  S_WINCE || defin
14930 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
14940 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
14950 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
14960 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20  (pFile, offset) 
14970 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
14980 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14990 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
149a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  , rc=SQLITE_FULL
149b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
149c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
149d0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
149e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
149f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a00 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  FULL;.  }.  whil
14a10 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70  e( !osReadFile(p
14a20 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61  File->h, pBuf, a
14a30 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29  mt, &nRead, 0) )
14a40 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74  {.#else.  memset
14a50 28 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c  (&overlapped, 0,
14a60 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50   sizeof(OVERLAPP
14a70 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  ED));.  overlapp
14a80 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e  ed.Offset = (LON
14a90 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66  G)(offset & 0xff
14aa0 66 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c  ffffff);.  overl
14ab0 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
14ac0 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
14ad0 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
14ae0 66 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21  fff);.  while( !
14af0 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
14b00 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14b10 26 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70  &nRead, &overlap
14b20 70 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20  ped) &&.        
14b30 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14b40 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  )!=ERROR_HANDLE_
14b50 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20  EOF ){.#endif.  
14b60 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
14b70 6f 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65  o;.    if( winRe
14b80 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79  tryIoerr(&nRetry
14b90 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20  , &lastErrno) ) 
14ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46  continue;.    pF
14bb0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14bc0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
14bd0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
14be0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14bf0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
14c00 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c  LITE_IOERR_READ\
14c10 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14c20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14c30 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14c40 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14c50 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
14c60 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
14c70 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61  _READ, pFile->la
14c80 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 22 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65  "winRead", pFile
14cb0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20  ->zPath);.  }.  
14cc0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
14cd0 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  ry, __LINE__);. 
14ce0 20 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52   if( nRead<(DWOR
14cf0 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20  D)amt ){.    /* 
14d00 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
14d10 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
14d20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
14d30 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
14d40 63 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61  char*)pBuf)[nRea
14d50 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64  d], 0, amt-nRead
14d60 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  );.    OSTRACE((
14d70 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70  "READ pid=%lu, p
14d80 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14d90 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14da0 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c  R_SHORT_READ\n",
14db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
14dc0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14dd0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14de0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14e00 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
14e10 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52  }..  OSTRACE(("R
14e20 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  EAD pid=%lu, pFi
14e30 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14e40 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14e50 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
14e60 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14e70 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14e80 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
14e90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
14ea0 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
14eb0 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
14ec0 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
14ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
14ee0 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
14ef0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
14f00 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
14f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
14f20 6e 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  nWrite(.  sqlite
14f30 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
14f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14f50 65 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20  e to write into 
14f60 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
14f70 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
14f80 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
14f90 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
14fa0 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14fd0 66 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65  f bytes to write
14fe0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
14ff0 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
15000 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
15010 69 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f  into the file to
15020 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
15030 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  t */.){.  int rc
15040 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
15050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15060 65 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f  e if error has o
15070 63 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61  ccurred, else fa
15080 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  lse */.  winFile
15090 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
150a0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
150b0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
150c0 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
150d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
150e0 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65  Number of retrie
150f0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
15100 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  amt>0 );.  asser
15110 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
15120 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15130 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15140 52 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75  R_WRITE);.  Simu
15150 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
15160 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
15170 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43  FULL);..  OSTRAC
15180 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
15190 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
151a0 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c  e=%p, buffer=%p,
151b0 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20   amount=%d, ".  
151c0 20 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74           "offset
151d0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
151e0 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
151f0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
15200 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  e,.           pF
15210 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15220 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65  t, offset, pFile
15230 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15240 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
15250 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
15260 29 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) && SQLITE_MAX_
15270 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
15280 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
15290 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
152a0 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
152b0 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
152c0 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
152d0 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
152e0 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
152f0 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
15300 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
15310 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
15320 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
15330 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15340 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
15350 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
15360 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
15370 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
15380 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
15390 28 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64  ("WRITE-MMAP pid
153a0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
153b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
153c0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
153d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
153e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
153f0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15400 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
15410 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
15420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
15430 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28  t nCopy = (int)(
15440 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15450 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  - offset);.     
15460 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
15470 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
15480 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
15490 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  uf, nCopy);.    
154a0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
154b0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
154c0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
154d0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
154e0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
154f0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
15500 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15510 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15520 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15530 41 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69  APPED).  rc = wi
15540 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c  nSeekFile(pFile,
15550 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20   offset);.  if( 
15560 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20  rc==0 ){.#else. 
15570 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53   {.#endif.#if !S
15580 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
15590 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
155a0 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
155b0 41 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c  APPED).    OVERL
155c0 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64  APPED overlapped
155d0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
155e0 6f 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65  offset for Write
155f0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
15600 20 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28      u8 *aRem = (
15610 75 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20  u8 *)pBuf;      
15620 20 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f    /* Data yet to
15630 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
15640 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d     int nRem = am
15650 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
15660 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
15670 74 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72  tes yet to be wr
15680 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f  itten */.    DWO
15690 52 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20  RD nWrite;      
156a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
156b0 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65  tes written by e
156c0 61 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20  ach WriteFile() 
156d0 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52  call */.    DWOR
156e0 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f  D lastErrno = NO
156f0 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c  _ERROR;   /* Val
15700 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47  ue returned by G
15710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f  etLastError() */
15720 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
15730 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
15740 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
15750 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
15760 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c     memset(&overl
15770 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66  apped, 0, sizeof
15780 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
15790 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
157a0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
157b0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
157c0 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70  f);.    overlapp
157d0 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
157e0 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
157f0 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
15800 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77  );.#endif..    w
15810 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a  hile( nRem>0 ){.
15820 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
15830 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
15840 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15850 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20  VERLAPPED).     
15860 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c   if( !osWriteFil
15870 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d  e(pFile->h, aRem
15880 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c  , nRem, &nWrite,
15890 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20   0) ){.#else.   
158a0 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46     if( !osWriteF
158b0 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52  ile(pFile->h, aR
158c0 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74  em, nRem, &nWrit
158d0 65 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  e, &overlapped) 
158e0 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ){.#endif.      
158f0 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
15900 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
15910 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
15920 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65  nue;.        bre
15930 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
15940 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65    assert( nWrite
15950 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28  ==0 || nWrite<=(
15960 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20  DWORD)nRem );.  
15970 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
15980 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f  0 || nWrite>(DWO
15990 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20  RD)nRem ){.     
159a0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
159b0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
159c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
159d0 20 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c        }.#if !SQL
159e0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
159f0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
15a00 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15a10 50 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65  PED).      offse
15a20 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  t += nWrite;.   
15a30 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
15a40 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
15a50 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
15a60 66 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61  f);.      overla
15a70 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15a80 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15a90 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15aa0 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ff);.#endif.    
15ab0 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65    aRem += nWrite
15ac0 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20  ;.      nRem -= 
15ad0 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20  nWrite;.    }.  
15ae0 20 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a    if( nRem>0 ){.
15af0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
15b00 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
15b10 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  no;.      rc = 1
15b20 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
15b30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28  f( rc ){.    if(
15b40 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74     ( pFile->last
15b50 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e  Errno==ERROR_HAN
15b60 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a  DLE_DISK_FULL ).
15b70 20 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c         || ( pFil
15b80 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  e->lastErrno==ER
15b90 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29  ROR_DISK_FULL ))
15ba0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
15bb0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
15bc0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
15bd0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55  %p, rc=SQLITE_FU
15be0 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  LL\n",.         
15bf0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15c00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15c10 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
15c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
15c30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15c40 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c  E_FULL, pFile->l
15c50 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20     "winWrite1", 
15c80 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
15c90 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45     }.    OSTRACE
15ca0 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
15cb0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15cc0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
15cd0 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20  OERR_WRITE\n",. 
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15cf0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15d00 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15d10 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
15d20 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
15d30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
15d40 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  E, pFile->lastEr
15d50 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
15d60 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
15d70 57 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  Write2", pFile->
15d80 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
15d90 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  .    winLogIoerr
15da0 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f  (nRetry, __LINE_
15db0 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  _);.  }.  OSTRAC
15dc0 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c  E(("WRITE pid=%l
15dd0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
15de0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15df0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
15e00 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
15e10 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15e20 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
15e50 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
15e60 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
15e70 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
15e80 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73  nt winTruncate(s
15e90 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
15ea0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
15eb0 42 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Byte){.  winFile
15ec0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
15ed0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65  le*)id;  /* File
15ee0 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a   handle object *
15ef0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
15f00 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
15f10 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
15f20 64 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63  de for this func
15f30 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20  tion */.  DWORD 
15f40 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73  lastErrno;..  as
15f50 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
15f60 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
15f70 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
15f80 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a  OERR_TRUNCATE);.
15f90 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
15fa0 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  CATE pid=%lu, pF
15fb0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15fc0 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b   size=%lld, lock
15fd0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15fe0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
15ff0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
16000 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  e, pFile->h, nBy
16010 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  te, pFile->lockt
16020 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
16030 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
16040 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
16050 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
16060 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
16070 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
16080 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
16090 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
160a0 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
160b0 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
160c0 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
160d0 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
160e0 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
160f0 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
16100 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
16110 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16120 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
16130 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
16140 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
16150 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
16160 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
16170 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
16180 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46 69 6c 65   /* SetEndOfFile
16190 28 29 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  () returns non-z
161a0 65 72 6f 20 77 68 65 6e 20 73 75 63 63 65 73 73  ero when success
161b0 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65  ful, or zero whe
161c0 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20  n it fails. */. 
161d0 20 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65   if( winSeekFile
161e0 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 20 29  (pFile, nByte) )
161f0 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f  {.    rc = winLo
16200 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16210 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46  ERR_TRUNCATE, pF
16220 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74       "winTruncat
16250 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e1", pFile->zPat
16260 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  h);.  }else if( 
16270 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c  0==osSetEndOfFil
16280 65 28 70 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20  e(pFile->h) &&. 
16290 20 20 20 20 20 20 20 20 20 20 20 28 28 6c 61 73             ((las
162a0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
162b0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
162c0 52 5f 55 53 45 52 5f 4d 41 50 50 45 44 5f 46 49  R_USER_MAPPED_FI
162d0 4c 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LE) ){.    pFile
162e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
162f0 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
16300 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
16310 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
16320 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ATE, pFile->last
16330 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
16340 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
16350 54 72 75 6e 63 61 74 65 32 22 2c 20 70 46 69 6c  Truncate2", pFil
16360 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a  e->zPath);.  }..
16370 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
16380 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
16390 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
163a0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73  truncated to a s
163b0 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  ize smaller than
163c0 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20   the currently. 
163d0 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f   ** mapped regio
163e0 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66  n, reduce the ef
163f0 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20  fective mapping 
16400 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51  size as well. SQ
16410 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75  Lite will.  ** u
16420 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77 72  se read() and wr
16430 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73 20  ite() to access 
16440 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73  data beyond this
16450 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20   point from now 
16460 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  on..  */.  if( p
16470 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
16480 20 26 26 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d   && nByte<pFile-
16490 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
164a0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
164b0 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65   = nByte;.  }.#e
164c0 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
164d0 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
164e0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
164f0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
16500 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
16510 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16520 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
16530 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
16540 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
16550 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
16560 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
16570 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
16580 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e  umber of fullsyn
16590 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79  cs and normal sy
165a0 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20 75 73  ncs.  This is us
165b0 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68  ed to test.** th
165c0 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c  at syncs and ful
165d0 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72  lsyncs are occur
165e0 69 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74  ing at the right
165f0 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   times..*/.int s
16600 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
16610 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
16620 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e  e3_fullsync_coun
16630 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  t = 0;.#endif../
16640 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61  *.** Make sure a
16650 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70  ll writes to a p
16660 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61  articular file a
16670 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20  re committed to 
16680 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
16690 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71 6c 69  int winSync(sqli
166a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
166b0 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65  t flags){.#ifnde
166c0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
166d0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20  .  /*.  ** Used 
166e0 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49 54 45  only when SQLITE
166f0 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
16700 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20  defined..   */. 
16710 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66   BOOL rc;.#endif
16720 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
16730 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69 6e 65  EBUG) || !define
16740 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  d(SQLITE_NO_SYNC
16750 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e  ) || \.    defin
16760 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
16770 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20  S_TRACE).  /*.  
16780 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53 51 4c  ** Used when SQL
16790 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
167a0 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64 20 62  ot defined and b
167b0 79 20 74 68 65 20 61 73 73 65 72 74 28 29 20 61  y the assert() a
167c0 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41  nd/or.  ** OSTRA
167d0 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20  CE() macros..   
167e0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
167f0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
16800 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53  id;.#else.  UNUS
16810 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
16820 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
16830 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f  rt( pFile );.  /
16840 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
16850 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
16860 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
16870 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
16880 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
16890 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
168a0 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
168b0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
168c0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
168d0 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
168e0 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
168f0 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
16900 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
16910 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
16920 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
16930 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
16940 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
16950 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
16960 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
16970 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
16980 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
16990 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
169a0 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
169b0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
169c0 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d   flags=%x, lock=
169d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
169e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
169f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
16a00 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67  , pFile->h, flag
16a10 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  s,.           pF
16a20 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
16a30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16a40 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44 5f 50  _TEST.  UNUSED_P
16a50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73 29 3b  ARAMETER(flags);
16a60 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28 66 6c  .#else.  if( (fl
16a70 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
16a80 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20  E_SYNC_FULL ){. 
16a90 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73     sqlite3_fulls
16aa0 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d  ync_count++;.  }
16ab0 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  .  sqlite3_sync_
16ac0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16ad0 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70  .  /* If we comp
16ae0 69 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51  iled with the SQ
16af0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61  LITE_NO_SYNC fla
16b00 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20  g, then syncing 
16b10 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a  is a.  ** no-op.
16b20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
16b30 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54  TE_NO_SYNC.  OST
16b40 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20  RACE(("SYNC-NOP 
16b50 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
16b60 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
16b70 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
16b80 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16b90 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16ba0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16bb0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16bc0 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69  ITE_OK;.#else.#i
16bd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
16be0 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70  P_SIZE>0.  if( p
16bf0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
16c00 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 46 6c   ){.    if( osFl
16c10 75 73 68 56 69 65 77 4f 66 46 69 6c 65 28 70 46  ushViewOfFile(pF
16c20 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c  ile->pMapRegion,
16c30 20 30 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54   0) ){.      OST
16c40 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50  RACE(("SYNC-MMAP
16c50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16c60 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
16c70 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
16c80 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f      "rc=SQLITE_O
16c90 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  K\n", osGetCurre
16ca0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20  ntProcessId(),. 
16cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
16cc0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70  ile, pFile->pMap
16cd0 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65  Region));.    }e
16ce0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
16cf0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
16d00 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16d10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
16d20 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  SYNC-MMAP pid=%l
16d30 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
16d40 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
16d60 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
16d70 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
16d80 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 0a  entProcessId(),.
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
16da0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61  File, pFile->pMa
16db0 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
16dc0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16dd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16de0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
16df0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 22 77 69 6e 53 79 6e 63 31 22 2c 20 70 46    "winSync1", pF
16e20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
16e30 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
16e40 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65  rc = osFlushFile
16e50 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d 3e 68  Buffers(pFile->h
16e60 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
16e70 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45 20 29  rror( rc=FALSE )
16e80 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
16e90 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16ea0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
16eb0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
16ec0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
16ed0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16ee0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16ef0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16f00 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16f10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16f20 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
16f30 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
16f40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16f50 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
16f60 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  C pid=%lu, pFile
16f70 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
16f80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  =SQLITE_IOERR_FS
16f90 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  YNC\n",.        
16fa0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16fb0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16fc0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16fd0 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c  .    return winL
16fe0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
16ff0 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c  OERR_FSYNC, pFil
17000 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 22 77 69 6e 53 79 6e 63 32 22 2c       "winSync2",
17030 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17040 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
17050 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
17060 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
17070 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
17080 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
17090 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71 6c 69  winFileSize(sqli
170a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
170b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69  lite3_int64 *pSi
170c0 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ze){.  winFile *
170d0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
170e0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
170f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
17100 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
17110 20 20 61 73 73 65 72 74 28 20 70 53 69 7a 65 21    assert( pSize!
17120 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  =0 );.  Simulate
17130 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
17140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
17150 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  T);.  OSTRACE(("
17160 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
17170 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  ize=%p\n", pFile
17180 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23  ->h, pSize));..#
17190 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
171a0 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f  RT.  {.    FILE_
171b0 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e  STANDARD_INFO in
171c0 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73 47 65  fo;.    if( osGe
171d0 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
171e0 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69 6c 65  ByHandleEx(pFile
171f0 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64 61 72  ->h, FileStandar
17200 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20 20 20  dInfo,.         
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 20 20 20 20 20 20 20 20 26 69 6e 66              &inf
17230 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  o, sizeof(info))
17240 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   ){.      *pSize
17250 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c   = info.EndOfFil
17260 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20 20 20  e.QuadPart;.    
17270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17280 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17290 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
172a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
172b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
172c0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
172d0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
172e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172f0 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
17300 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
17310 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
17320 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52  lse.  {.    DWOR
17330 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20 20 20  D upperBits;.   
17340 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69 74 73   DWORD lowerBits
17350 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  ;.    DWORD last
17360 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65  Errno;..    lowe
17370 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46 69 6c  rBits = osGetFil
17380 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20  eSize(pFile->h, 
17390 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 20  &upperBits);.   
173a0 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73 71 6c   *pSize = (((sql
173b0 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70 65 72  ite3_int64)upper
173c0 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77  Bits)<<32) + low
173d0 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66 28 20  erBits;.    if( 
173e0 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20    (lowerBits == 
173f0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a  INVALID_FILE_SIZ
17400 45 29 0a 20 20 20 20 20 20 20 26 26 20 28 28 6c  E).       && ((l
17410 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
17420 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f  LastError())!=NO
17430 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20 20 20  _ERROR) ){.     
17440 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17450 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
17460 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
17470 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17480 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
17490 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174b0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
174c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
174d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
174e0 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49  f.  OSTRACE(("SI
174f0 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a  ZE file=%p, pSiz
17500 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c  e=%p, *pSize=%ll
17510 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
17520 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
17530 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c  , pSize, *pSize,
17540 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
17550 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
17560 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43  rc;.}../*.** LOC
17570 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17580 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65 66 69  IATELY is undefi
17590 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64  ned on some Wind
175a0 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a  ows systems..*/.
175b0 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45  #ifndef LOCKFILE
175c0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
175d0 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  Y.# define LOCKF
175e0 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
175f0 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23  TELY 1.#endif..#
17600 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f  ifndef LOCKFILE_
17610 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23  EXCLUSIVE_LOCK.#
17620 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
17630 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  _EXCLUSIVE_LOCK 
17640 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  2.#endif../*.** 
17650 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51  Historically, SQ
17660 4c 69 74 65 20 68 61 73 20 75 73 65 64 20 62 6f  Lite has used bo
17670 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20  th the LockFile 
17680 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66  and LockFileEx f
17690 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65  unctions..** Whe
176a0 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66  n the LockFile f
176b0 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73 65 64  unction was used
176c0 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79 73 20  , it was always 
176d0 65 78 70 65 63 74 65 64 20 74 6f 20 66 61 69 6c  expected to fail
176e0 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  .** immediately 
176f0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c  if the lock coul
17700 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  d not be obtaine
17710 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77  d.  Also, it alw
17720 61 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 0a  ays expected to.
17730 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  ** obtain an exc
17740 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68  lusive lock.  Th
17750 65 73 65 20 66 6c 61 67 73 20 61 72 65 20 75 73  ese flags are us
17760 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b  ed with the Lock
17770 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a  FileEx function.
17780 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74 20 74  ** and reflect t
17790 68 6f 73 65 20 65 78 70 65 63 74 61 74 69 6f 6e  hose expectation
177a0 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 74 68  s; therefore, th
177b0 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  ey should not be
177c0 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66   changed..*/.#if
177d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
177e0 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64 65 66  FILE_FLAGS.# def
177f0 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  ine SQLITE_LOCKF
17800 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43  ILE_FLAGS   (LOC
17810 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17820 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20  IATELY | \.     
17830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 4f 43               LOC
17850 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
17860 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  LOCK).#endif../*
17870 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 53  .** Currently, S
17880 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61 6c 6c  QLite never call
17890 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  s the LockFileEx
178a0 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75   function withou
178b0 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a  t wanting the.**
178c0 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d   call to fail im
178d0 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
178e0 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20   lock cannot be 
178f0 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66  obtained..*/.#if
17900 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ndef SQLITE_LOCK
17910 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23 20 64  FILEEX_FLAGS.# d
17920 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
17930 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c  KFILEEX_FLAGS (L
17940 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
17950 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64 69 66  EDIATELY).#endif
17960 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
17970 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
17980 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
17990 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
179a0 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
179b0 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
179c0 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78  this.** is Win9x
179d0 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
179e0 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 52  atic int winGetR
179f0 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20  eadLock(winFile 
17a00 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72  *pFile){.  int r
17a10 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
17a20 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
17a30 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17a40 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17a50 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17a60 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
17a70 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
17a80 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  E.    /*.    ** 
17a90 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45  NOTE: Windows CE
17aa0 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66   is handled diff
17ab0 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65  erently here due
17ac0 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65   its lack of the
17ad0 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20   Win32.    **   
17ae0 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65      API LockFile
17af0 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  Ex..    */.    r
17b00 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69  es = winceLockFi
17b10 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
17b20 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 31  ARED_FIRST, 0, 1
17b30 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  , 0);.#else.    
17b40 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
17b50 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
17b60 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46  ITE_LOCKFILEEX_F
17b70 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52  LAGS, SHARED_FIR
17b80 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ST, 0,.         
17b90 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17ba0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65  RED_SIZE, 0);.#e
17bb0 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20  ndif.  }.#ifdef 
17bc0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
17bd0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
17be0 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71    int lk;.    sq
17bf0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
17c00 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
17c10 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  );.    pFile->sh
17c20 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28  aredLockByte = (
17c30 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30 78 37  short)((lk & 0x7
17c40 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
17c50 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20  _SIZE - 1));.   
17c60 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
17c70 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
17c80 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17c90 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
17ca0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
17cb0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17cc0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17cd0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17ce0 64 69 66 0a 20 20 69 66 28 20 72 65 73 20 3d 3d  dif.  if( res ==
17cf0 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
17d00 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
17d10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
17d20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
17d30 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65 20 74   log a failure t
17d40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20  o lock */.  }.  
17d50 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
17d60 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
17d70 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ult=%d\n", pFile
17d80 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65  ->h, res));.  re
17d90 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
17da0 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f  ** Undo a readlo
17db0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ck.*/.static int
17dc0 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
17dd0 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
17de0 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
17df0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
17e00 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
17e10 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
17e20 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70  p, lock=%d\n", p
17e30 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
17e40 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 69 66  locktype));.  if
17e50 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
17e60 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
17e70 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17e80 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
17e90 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30  , SHARED_SIZE, 0
17ea0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
17eb0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
17ec0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
17ed0 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46  res = winUnlockF
17ee0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
17ef0 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c  HARED_FIRST+pFil
17f00 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e->sharedLockByt
17f10 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  e, 0, 1, 0);.  }
17f20 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65  .#endif.  if( re
17f30 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74 45 72  s==0 && ((lastEr
17f40 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17f50 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e  rror())!=ERROR_N
17f60 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20  OT_LOCKED) ){.  
17f70 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
17f80 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
17f90 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
17fa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
17fb0 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  OCK, pFile->last
17fc0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
17fd0 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63         "winUnloc
17fe0 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c  kReadLock", pFil
17ff0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20  e->zPath);.  }. 
18000 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
18010 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
18020 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
18030 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
18040 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
18050 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
18060 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
18070 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
18080 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
18090 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
180a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
180b0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
180c0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
180d0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
180e0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
180f0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
18100 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
18110 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
18120 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
18130 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
18140 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
18150 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
18160 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
18170 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
18180 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
18190 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
181a0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
181b0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
181c0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
181d0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
181e0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
181f0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
18200 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
18210 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
18220 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
18230 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
18240 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
18250 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
18260 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
18270 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
18280 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
18290 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
182a0 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
182b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
182c0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
182d0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
182e0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
182f0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
18300 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
18310 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
18320 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
18330 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
18340 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
18350 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
18360 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
18370 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
18380 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
18390 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
183a0 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
183b0 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
183c0 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
183d0 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
183e0 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
183f0 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
18400 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
18410 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69  int winLock(sqli
18420 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
18430 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
18440 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18450 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  K;    /* Return 
18460 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72 6f 75  code from subrou
18470 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72  tines */.  int r
18480 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  es = 1;         
18490 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66 20 61    /* Result of a
184a0 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61   Windows lock ca
184b0 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c  ll */.  int newL
184c0 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20 20 2f  ocktype;       /
184d0 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63  * Set pFile->loc
184e0 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20 76 61  ktype to this va
184f0 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69 74 69  lue before exiti
18500 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50  ng */.  int gotP
18510 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f  endingLock = 0;/
18520 2a 20 54 72 75 65 20 69 66 20 77 65 20 61 63 71  * True if we acq
18530 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e 47 20  uired a PENDING 
18540 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65 20 2a  lock this time *
18550 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
18560 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
18570 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  d;.  DWORD lastE
18580 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  rrno = NO_ERROR;
18590 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
185a0 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  0 );.  OSTRACE((
185b0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "LOCK file=%p, o
185c0 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
185d0 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
185e0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
185f0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
18600 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
18610 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
18620 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ype));..  /* If 
18630 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
18640 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
18650 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
18660 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
18670 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20    ** OsFile, do 
18680 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
18690 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
186a0 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
186b0 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45 6e 74   ** sqlite3OsEnt
186c0 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
186d0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
186e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
186f0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f  le->locktype>=lo
18700 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 4f 53  cktype ){.    OS
18710 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c  TRACE(("LOCK-HEL
18720 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  D file=%p, rc=SQ
18730 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
18740 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
18750 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18760 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61  }..  /* Do not a
18770 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66  llow any kind of
18780 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61   write-lock on a
18790 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
187a0 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ase.  */.  if( (
187b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
187c0 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
187d0 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70  Y)!=0 && locktyp
187e0 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e>=RESERVED_LOCK
187f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
18810 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
18820 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
18830 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
18840 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73  rrect.  */.  ass
18850 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
18860 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c  type!=NO_LOCK ||
18870 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
18880 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
18890 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45  rt( locktype!=PE
188a0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
188b0 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65  assert( locktype
188c0 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
188d0 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  || pFile->lockty
188e0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
188f0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68  );..  /* Lock th
18900 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
18910 79 74 65 20 69 66 20 77 65 20 6e 65 65 64 20 74  yte if we need t
18920 6f 20 61 63 71 75 69 72 65 20 61 20 50 45 4e 44  o acquire a PEND
18930 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a  ING lock or.  **
18940 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20   a SHARED lock. 
18950 20 49 66 20 77 65 20 61 72 65 20 61 63 71 75 69   If we are acqui
18960 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
18970 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73 69 74  ck, the acquisit
18980 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  ion of.  ** the 
18990 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74  PENDING_LOCK byt
189a0 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a  e is temporary..
189b0 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79    */.  newLockty
189c0 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  pe = pFile->lock
189d0 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46 69 6c  type;.  if( pFil
189e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
189f0 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b  LOCK.   || (lock
18a00 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
18a10 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6c  LOCK && pFile->l
18a20 6f 63 6b 74 79 70 65 3c 3d 52 45 53 45 52 56 45  ocktype<=RESERVE
18a30 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  D_LOCK).  ){.   
18a40 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a 20 20   int cnt = 3;.  
18a50 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
18a60 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e 4c 6f   && (res = winLo
18a70 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18a80 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
18a90 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20  E_FLAGS,.       
18aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ac0 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20    PENDING_BYTE, 
18ad0 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
18ae0 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74        /* Try 3 t
18af0 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20  imes to get the 
18b00 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54  pending lock.  T
18b10 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 74 6f  his is needed to
18b20 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a 20 61   work.      ** a
18b30 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63  round problems c
18b40 61 75 73 65 64 20 62 79 20 69 6e 64 65 78 69 6e  aused by indexin
18b50 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d 76 69  g and/or anti-vi
18b60 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f 6e 0a  rus software on.
18b70 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f 77 73        ** Windows
18b80 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20 20 20   systems..      
18b90 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20 75 73  ** If you are us
18ba0 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20 61 73  ing this code as
18bb0 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61 6c 74   a model for alt
18bc0 65 72 6e 61 74 69 76 65 20 56 46 53 65 73 2c 20  ernative VFSes, 
18bd0 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  do not.      ** 
18be0 63 6f 70 79 20 74 68 69 73 20 72 65 74 72 79 20  copy this retry 
18bf0 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20 61 20  logic.  It is a 
18c00 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20 66 6f  hack intended fo
18c10 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a  r Windows only..
18c20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6c        */.      l
18c30 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18c40 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18c50 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
18c60 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c 20 66  K-PENDING-FAIL f
18c70 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
18c80 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a  , result=%d\n",.
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
18ca0 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 72 65  File->h, cnt, re
18cb0 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  s));.      if( l
18cc0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
18cd0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 20 29  INVALID_HANDLE )
18ce0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
18cf0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
18d00 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  tErrno;.        
18d10 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
18d20 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
18d30 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 46  OSTRACE(("LOCK-F
18d40 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75  AIL file=%p, cou
18d50 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  nt=%d, rc=%s\n",
18d60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18d70 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
18d80 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
18d90 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
18da0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18db0 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 20  }.      if( cnt 
18dc0 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  ) sqlite3_win32_
18dd0 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  sleep(1);.    }.
18de0 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
18df0 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20 69 66  ck = res;.    if
18e00 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20 20 20  ( !res ){.      
18e10 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18e20 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18e30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63    }.  }..  /* Ac
18e40 71 75 69 72 65 20 61 20 73 68 61 72 65 64 20 6c  quire a shared l
18e50 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
18e60 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18e70 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
18e80 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18e90 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c  ->locktype==NO_L
18ea0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
18eb0 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
18ec0 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
18ed0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
18ee0 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
18ef0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
18f00 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
18f10 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18f20 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
18f30 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
18f40 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20   RESERVED lock. 
18f50 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
18f60 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
18f70 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
18f80 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
18f90 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
18fa0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
18fb0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
18fc0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
18fd0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20  LOCKFILE_FLAGS, 
18fe0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30  RESERVED_BYTE, 0
18ff0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
19000 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
19010 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45 53 45  wLocktype = RESE
19020 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  RVED_LOCK;.    }
19030 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
19040 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
19050 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
19060 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
19070 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  e a PENDING lock
19080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
19090 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
190a0 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
190b0 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d     newLocktype =
190c0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
190d0 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63     gotPendingLoc
190e0 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 0;.  }..  /*
190f0 20 41 63 71 75 69 72 65 20 61 6e 20 45 58 43 4c   Acquire an EXCL
19100 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  USIVE lock.  */.
19110 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
19120 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
19130 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
19140 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
19150 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  type>=SHARED_LOC
19160 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  K );.    res = w
19170 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
19180 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 65 73  (pFile);.    res
19190 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
191a0 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
191b0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
191c0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
191d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
191e0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
191f0 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
19200 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65   res ){.      ne
19210 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c  wLocktype = EXCL
19220 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
19230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73  }else{.      las
19240 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
19250 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
19260 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28   winGetReadLock(
19270 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
19280 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  }..  /* If we ar
19290 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45 4e 44  e holding a PEND
192a0 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20 6f 75  ING lock that ou
192b0 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65 61 73  ght to be releas
192c0 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65  ed, then.  ** re
192d0 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
192e0 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65 6e 64  */.  if( gotPend
192f0 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63 6b 74  ingLock && lockt
19300 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
19310 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63   ){.    winUnloc
19320 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
19330 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
19340 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
19350 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
19360 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
19370 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
19380 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19390 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
193a0 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
193b0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
193c0 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29 7b 0a  */.  if( res ){.
193d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
193e0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
193f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
19400 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
19410 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
19420 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  USY;.    OSTRACE
19430 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
19440 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25 64 2c  e=%p, wanted=%d,
19450 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   got=%d\n",.    
19460 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19470 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77  h, locktype, new
19480 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20 7d 0a  Locktype));.  }.
19490 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
194a0 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63 6b 74  e = (u8)newLockt
194b0 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ype;.  OSTRACE((
194c0 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  "LOCK file=%p, l
194d0 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
194e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
194f0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
19500 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
19510 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
19520 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19530 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19540 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
19550 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
19560 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
19570 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
19580 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
19590 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
195a0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
195b0 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a 2a  s held, return.*
195c0 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65  * non-zero, othe
195d0 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  rwise zero..*/.s
195e0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 68 65  tatic int winChe
195f0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
19600 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19610 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
19620 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77 69 6e    int res;.  win
19630 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
19640 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  inFile*)id;..  S
19650 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
19670 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
19680 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53 54 52  DLOCK; );.  OSTR
19690 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f  ACE(("TEST-WR-LO
196a0 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65 73  CK file=%p, pRes
196b0 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Out=%p\n", pFile
196c0 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ->h, pResOut));.
196d0 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
196e0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
196f0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
19700 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
19710 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54  res = 1;.    OST
19720 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19730 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
19740 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29 5c 6e  ult=%d (local)\n
19750 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73  ", pFile->h, res
19760 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
19770 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69   res = winLockFi
19780 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
19790 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f  LITE_LOCKFILEEX_
197a0 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44 5f 42  FLAGS,RESERVED_B
197b0 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20 20 20  YTE,0,1,0);.    
197c0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
197d0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
197e0 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56  pFile->h, RESERV
197f0 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
19800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73  );.    }.    res
19810 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f 53 54   = !res;.    OST
19820 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19830 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
19840 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65 29 5c  ult=%d (remote)\
19850 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
19860 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  s));.  }.  *pRes
19870 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f 53 54  Out = res;.  OST
19880 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d 4c  RACE(("TEST-WR-L
19890 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52 65  OCK file=%p, pRe
198a0 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
198b0 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
198c0 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
198d0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52 65 73    pFile->h, pRes
198e0 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b  Out, *pResOut));
198f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  _OK;.}../*.** Lo
19910 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
19920 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
19930 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f 20 6c  scriptor id to l
19940 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b 74 79  ocktype.  lockty
19950 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  pe.** must be ei
19960 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
19970 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
19980 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
19990 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
199a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
199b0 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
199c0 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
199d0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
199e0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
199f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19a00 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70  *.** It is not p
19a10 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68 69 73  ossible for this
19a20 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61 69 6c   routine to fail
19a30 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
19a40 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f  rgument.** is NO
19a50 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65 20 73  _LOCK.  If the s
19a60 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
19a70 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 74 68  s SHARED_LOCK th
19a80 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
19a90 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  ** might return 
19aa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f  SQLITE_IOERR;.*/
19ab0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
19ac0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
19ad0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
19ae0 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74 79 70  type){.  int typ
19af0 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  e;.  winFile *pF
19b00 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
19b10 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  id;.  int rc = S
19b20 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
19b30 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a  rt( pFile!=0 );.
19b40 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
19b50 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe<=SHARED_LOCK 
19b60 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
19b70 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  NLOCK file=%p, o
19b80 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e  ldLock=%d(%d), n
19b90 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  ewLock=%d\n",.  
19ba0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
19bb0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
19bc0 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
19bd0 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74  dLockByte, lockt
19be0 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20 3d 20  ype));.  type = 
19bf0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
19c00 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45 58 43  .  if( type>=EXC
19c10 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
19c20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
19c30 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
19c40 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
19c50 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
19c60 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
19c70 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21  SHARED_LOCK && !
19c80 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 70  winGetReadLock(p
19c90 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  File) ){.      /
19ca0 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20 6e 65  * This should ne
19cb0 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57 65 20  ver happen.  We 
19cc0 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
19cd0 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a   able to.      *
19ce0 2a 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  * reacquire the 
19cf0 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  read lock */.   
19d00 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
19d10 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
19d20 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74 4c 61  _UNLOCK, osGetLa
19d30 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
19d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d50 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70    "winUnlock", p
19d60 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
19d70 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 74 79    }.  }.  if( ty
19d80 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
19d90 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f  K ){.    winUnlo
19da0 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
19db0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19dc0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
19dd0 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e   if( locktype==N
19de0 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d  O_LOCK && type>=
19df0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
19e00 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64     winUnlockRead
19e10 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 7d  Lock(pFile);.  }
19e20 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
19e30 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
19e40 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
19e50 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
19e60 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
19e70 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c  ;.  }.  pFile->l
19e80 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29 6c 6f  ocktype = (u8)lo
19e90 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
19ea0 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d  E(("UNLOCK file=
19eb0 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d  %p, lock=%d, rc=
19ec0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
19ed0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
19ee0 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c  e->locktype, sql
19ef0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
19f00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19f10 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
19f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f60 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19f80 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
19f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19fb0 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
19fc0 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
19fd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
19fe0 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
19ff0 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
1a000 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
1a010 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
1a020 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
1a030 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
1a040 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
1a050 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
1a060 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
1a070 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
1a080 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
1a090 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
1a0a0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
1a0b0 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
1a0c0 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
1a0d0 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
1a0e0 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
1a0f0 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
1a100 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
1a110 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
1a120 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
1a130 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
1a140 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
1a150 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
1a160 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
1a170 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
1a180 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1a190 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
1a1a0 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
1a1b0 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
1a1c0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
1a1d0 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
1a1e0 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
1a1f0 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
1a200 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
1a210 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
1a220 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
1a230 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
1a240 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
1a250 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
1a260 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
1a270 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1a280 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
1a290 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f  atic int winNolo
1a2a0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
1a2b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
1a2c0 6b 74 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44  ktype){.  UNUSED
1a2d0 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a  _PARAMETER(id);.
1a2e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1a2f0 45 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  ER(locktype);.  
1a300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a310 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
1a320 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65  winNolockCheckRe
1a330 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
1a340 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1a350 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
1a360 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
1a370 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1a380 41 4d 45 54 45 52 28 70 52 65 73 4f 75 74 29 3b  AMETER(pResOut);
1a390 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1a3a0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
1a3b0 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f  nt winNolockUnlo
1a3c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1a3d0 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  *id, int locktyp
1a3e0 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  e){.  UNUSED_PAR
1a3f0 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e  AMETER(id);.  UN
1a400 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c  USED_PARAMETER(l
1a410 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75  ocktype);.  retu
1a420 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a430 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1a440 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1a450 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
1a460 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1a4d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67  ../*.** If *pArg
1a4e0 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65   is initially ne
1a4f0 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69 73  gative then this
1a500 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53 65   is a query.  Se
1a510 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20  t *pArg to.** 1 
1a520 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 0 depending o
1a530 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1a540 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69   bit mask of pFi
1a550 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73  le->ctrlFlags is
1a560 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a   set..**.** If *
1a570 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20  pArg is 0 or 1, 
1a580 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65  then clear or se
1a590 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f  t the mask bit o
1a5a0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
1a5b0 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  gs..*/.static vo
1a5c0 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28 77 69  id winModeBit(wi
1a5d0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  nFile *pFile, un
1a5e0 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1a5f0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1a600 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1a610 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1a620 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1a630 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1a640 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1a650 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1a660 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1a670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1a680 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1a690 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1a6a0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1a6b0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
1a6c0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
1a6d0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
1a6e0 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  iles */.static i
1a6f0 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  nt winGetTempnam
1a700 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
1a710 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69   char **);.stati
1a720 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63  c int winIsDir(c
1a730 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74  onst void *);.st
1a740 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
1a750 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
1a760 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  on(const char *)
1a770 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c  ;../*.** Control
1a780 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20 74 68   and query of th
1a790 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64  e open file hand
1a7a0 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1a7b0 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c  t winFileControl
1a7c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a7d0 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1a7e0 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c  *pArg){.  winFil
1a7f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
1a800 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41  ile*)id;.  OSTRA
1a810 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a820 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d  %p, op=%d, pArg=
1a830 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
1a840 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20 20 73   op, pArg));.  s
1a850 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
1a860 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1a870 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a  TL_LOCKSTATE: {.
1a880 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1a890 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  g = pFile->lockt
1a8a0 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  ype;.      OSTRA
1a8b0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a8c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a8d0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a8e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a8f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a900 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a910 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  CNTL_LAST_ERRNO:
1a920 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1a930 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c  pArg = (int)pFil
1a940 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
1a950 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a960 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a970 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1a980 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1a990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a9b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48   SQLITE_FCNTL_CH
1a9c0 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  UNK_SIZE: {.    
1a9d0 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b    pFile->szChunk
1a9e0 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b   = *(int *)pArg;
1a9f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1aa00 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1aa10 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1aa20 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1aa30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1aa40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1aa50 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1aa60 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
1aa70 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
1aa80 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1aa90 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1aaa0 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20  4 oldSz;.       
1aab0 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c   int rc = winFil
1aac0 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a  eSize(id, &oldSz
1aad0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1aae0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1aaf0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1ab00 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20  3_int64 newSz = 
1ab10 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a  *(sqlite3_int64*
1ab20 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20  )pArg;.         
1ab30 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a   if( newSz>oldSz
1ab40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ab50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1ab60 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1ab70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72        rc = winTr
1ab80 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a  uncate(id, newSz
1ab90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
1aba0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1abb0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20  nign(0);.       
1abc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1abd0 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1abe0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1abf0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
1ac00 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
1ac10 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1ac20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ac30 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1ac40 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1ac50 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1ac60 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1ac70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ac80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ac90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1aca0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1acb0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 50  : {.      int bP
1acc0 65 72 73 69 73 74 20 3d 20 2a 28 69 6e 74 2a 29  ersist = *(int*)
1acd0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20  pArg;.      if( 
1ace0 62 50 65 72 73 69 73 74 3c 30 20 29 7b 0a 20 20  bPersist<0 ){.  
1acf0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1ad00 67 20 3d 20 70 46 69 6c 65 2d 3e 62 50 65 72 73  g = pFile->bPers
1ad10 69 73 74 57 61 6c 3b 0a 20 20 20 20 20 20 7d 65  istWal;.      }e
1ad20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 69  lse{.        pFi
1ad30 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c 20  le->bPersistWal 
1ad40 3d 20 62 50 65 72 73 69 73 74 21 3d 30 3b 0a 20  = bPersist!=0;. 
1ad50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1ad60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ad70 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1ad80 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1ad90 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1ada0 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  winModeBit(pFile
1adb0 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49 53  , WINFILE_PERSIS
1adc0 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72  T_WAL, (int*)pAr
1add0 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  g);.      OSTRAC
1ade0 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1adf0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1ae00 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1ae10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ae20 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1ae30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1ae40 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
1ae50 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
1ae60 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
1ae70 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 2c  e, WINFILE_PSOW,
1ae80 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1ae90 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1aea0 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1aeb0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1aec0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1aed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1aee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1aef0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1af00 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1af10 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1af20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1af30 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1af40 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1af50 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1af60 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1af70 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1af80 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1af90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1afa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1afb0 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
1afc0 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20 20  AV_RETRY: {.    
1afd0 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74 2a    int *a = (int*
1afe0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66 28  )pArg;.      if(
1aff0 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20 20   a[0]>0 ){.     
1b000 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
1b010 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 7d   = a[0];.      }
1b020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b  else{.        a[
1b030 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74  0] = winIoerrRet
1b040 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ry;.      }.    
1b050 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b 0a    if( a[1]>0 ){.
1b060 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
1b070 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b 31  RetryDelay = a[1
1b080 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
1b090 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20 77          a[1] = w
1b0a0 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
1b0b0 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  y;.      }.     
1b0c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b0d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1b0e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1b0f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b100 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b110 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1b120 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
1b130 5f 47 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20  _GET_HANDLE: {. 
1b140 20 20 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68       LPHANDLE ph
1b150 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45  File = (LPHANDLE
1b160 29 70 41 72 67 3b 0a 20 20 20 20 20 20 2a 70 68  )pArg;.      *ph
1b170 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  File = pFile->h;
1b180 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1b190 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1b1a0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1b1b0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1b1c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b1d0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  _OK;.    }.#ifde
1b1e0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
1b1f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b200 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41  NTL_WIN32_SET_HA
1b210 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50  NDLE: {.      LP
1b220 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20  HANDLE phFile = 
1b230 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a  (LPHANDLE)pArg;.
1b240 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c        HANDLE hOl
1b250 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68  dFile = pFile->h
1b260 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68  ;.      pFile->h
1b270 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20   = *phFile;.    
1b280 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64    *phFile = hOld
1b290 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52  File;.      OSTR
1b2a0 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46  ACE(("FCNTL oldF
1b2b0 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d  ile=%p, newFile=
1b2c0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1b2d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b2e0 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46      hOldFile, pF
1b2f0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b310 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
1b320 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b330 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
1b340 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  E: {.      char 
1b350 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  *zTFile = 0;.   
1b360 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47     int rc = winG
1b370 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
1b380 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29  ->pVfs, &zTFile)
1b390 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1b3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b3b0 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1b3c0 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
1b3d0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1b3e0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1b3f0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
1b400 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
1b410 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1b420 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b430 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
1b440 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1b450 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b460 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a  FCNTL_MMAP_SIZE:
1b470 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77   {.      i64 new
1b480 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70  Limit = *(i64*)p
1b490 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  Arg;.      int r
1b4a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b4b0 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1b4c0 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  t>sqlite3GlobalC
1b4d0 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a  onfig.mxMmap ){.
1b4e0 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74          newLimit
1b4f0 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
1b500 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20  Config.mxMmap;. 
1b510 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69       }.      *(i
1b520 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1b530 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1b540 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1b550 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1b560 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1b570 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1b580 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1b590 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1b5a0 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1b5b0 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1b5c0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1b5d0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1b5e0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
1b5f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
1b600 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28  rc = winMapfile(
1b610 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20  pFile, -1);.    
1b620 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b630 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b640 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b650 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1b660 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1b670 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  rc)));.      ret
1b680 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65  urn rc;.    }.#e
1b690 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ndif.  }.  OSTRA
1b6a0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1b6b0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f  %p, rc=SQLITE_NO
1b6c0 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65  TFOUND\n", pFile
1b6d0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
1b6e0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
1b6f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b700 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1b710 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
1b720 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
1b730 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
1b740 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
1b750 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
1b760 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
1b770 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
1b780 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
1b790 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
1b7a0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
1b7b0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
1b7c0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
1b7d0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
1b7e0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
1b7f0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
1b800 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
1b810 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
1b820 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
1b830 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
1b840 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
1b850 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
1b860 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
1b870 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
1b880 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1b890 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  inSectorSize(sql
1b8a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1b8b0 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65    (void)id;.  re
1b8c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
1b8d0 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
1b8e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1b8f0 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76   a vector of dev
1b900 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1b910 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ics..*/.static i
1b920 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  nt winDeviceChar
1b930 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
1b940 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1b950 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77   winFile *p = (w
1b960 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65  inFile*)id;.  re
1b970 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
1b980 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48  P_UNDELETABLE_WH
1b990 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20  EN_OPEN |.      
1b9a0 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67     ((p->ctrlFlag
1b9b0 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  s & WINFILE_PSOW
1b9c0 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  )?SQLITE_IOCAP_P
1b9d0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
1b9e0 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE:0);.}../*.** 
1b9f0 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c  Windows will onl
1ba00 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65  y let you create
1ba10 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69   file view mappi
1ba20 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61  ngs.** on alloca
1ba30 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c  tion size granul
1ba40 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73  arity boundaries
1ba50 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69  ..** During sqli
1ba60 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65  te3_os_init() we
1ba70 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49   do a GetSystemI
1ba80 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20  nfo().** to get 
1ba90 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20  the granularity 
1baa0 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1bab0 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53  SYSTEM_INFO winS
1bac0 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66  ysInfo;..#ifndef
1bad0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
1bae0 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66  ../*.** Helper f
1baf0 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61  unctions to obta
1bb00 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73  in and relinquis
1bb10 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74  h the global mut
1bb20 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61  ex. The.** globa
1bb30 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20  l mutex is used 
1bb40 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 77  to protect the w
1bb50 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63  inLockInfo objec
1bb60 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  ts used by.** th
1bb70 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
1bb80 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68 61  which may be sha
1bb90 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20  red by multiple 
1bba0 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46  threads..**.** F
1bbb0 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75  unction winShmMu
1bbc0 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73 65  texHeld() is use
1bbd0 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74 68  d to assert() th
1bbe0 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  at the global mu
1bbf0 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77  tex.** is held w
1bc00 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68  hen required. Th
1bc10 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
1bc20 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74  nly used as part
1bc30 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20   of assert().** 
1bc40 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e  statements. e.g.
1bc50 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45  .**.**   winShmE
1bc60 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20  nterMutex().**  
1bc70 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68     assert( winSh
1bc80 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
1bc90 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  **   winShmLeave
1bca0 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69  Mutex().*/.stati
1bcb0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74  c void winShmEnt
1bcc0 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20  erMutex(void){. 
1bcd0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1bce0 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65  nter(sqlite3Mute
1bcf0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
1bd00 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29  TEX_STATIC_VFS1)
1bd10 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1bd20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1bd30 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
1bd40 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
1bd50 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1bd60 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1bd70 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
1bd80 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
1bd90 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d  atic int winShmM
1bda0 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
1bdb0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1bdc0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
1bdd0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1bde0 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1bdf0 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e  IC_VFS1));.}.#en
1be00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  dif../*.** Objec
1be10 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
1be20 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c  ent a single fil
1be30 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61  e opened and mma
1be40 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a  pped to provide.
1be50 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ** shared memory
1be60 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .  When multiple
1be70 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
1be80 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a  erence the same.
1be90 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20  ** log-summary, 
1bea0 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  each thread has 
1beb0 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20  its own winFile 
1bec0 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
1bed0 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f   all.** point to
1bee0 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e   a single instan
1bef0 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
1bf00 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  t.  In other wor
1bf10 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d  ds, each.** log-
1bf20 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65  summary is opene
1bf30 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  d only once per 
1bf40 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77  process..**.** w
1bf50 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1bf60 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
1bf70 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
1bf80 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
1bf90 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
1bfa0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1bfb0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
1bfc0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
1bfd0 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20        nRef.**   
1bfe0 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54     pNext.**.** T
1bff0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1c000 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c  lds are read-onl
1c010 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65  y after the obje
1c020 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a  ct is created:.*
1c030 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a  *.**      fid.**
1c040 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a        zFilename.
1c050 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e  **.** Either win
1c060 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
1c070 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69  st be held or wi
1c080 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  nShmNode.nRef==0
1c090 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75   and.** winShmMu
1c0a0 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75  texHeld() is tru
1c0b0 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f  e when reading o
1c0c0 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74  r writing any ot
1c0d0 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20  her field.** in 
1c0e0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
1c0f0 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  **.*/.struct win
1c100 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69  ShmNode {.  sqli
1c110 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
1c120 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20  ;      /* Mutex 
1c130 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f  to access this o
1c140 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20  bject */.  char 
1c150 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
1c160 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1c170 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77   the file */.  w
1c180 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20  inFile hFile;   
1c190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1c1a0 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69  e handle from wi
1c1b0 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20  nOpen */..  int 
1c1c0 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
1c1d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1c1e0 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
1c1f0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
1c200 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
1c210 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c220 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
1c230 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68  n */.  struct Sh
1c240 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41  mRegion {.    HA
1c250 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20  NDLE hMap;      
1c260 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68         /* File h
1c270 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74  andle from Creat
1c280 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a  eFileMapping */.
1c290 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a      void *pMap;.
1c2a0 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20    } *aRegion;.  
1c2b0 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1c2c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c2d0 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20  e Windows errno 
1c2e0 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f  from the last I/
1c2f0 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e  O error */..  in
1c300 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1c310 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c320 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a  er of winShm obj
1c330 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
1c340 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68   this */.  winSh
1c350 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  m *pFirst;      
1c360 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e        /* All win
1c370 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
1c380 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
1c390 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e    winShmNode *pN
1c3a0 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ext;         /* 
1c3b0 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20  Next in list of 
1c3c0 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  all winShmNode o
1c3d0 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65  bjects */.#if de
1c3e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1c3f0 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1c400 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
1c410 41 43 45 29 0a 20 20 75 38 20 6e 65 78 74 53 68  ACE).  u8 nextSh
1c420 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  mId;            
1c430 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61    /* Next availa
1c440 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61  ble winShm.id va
1c450 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  lue */.#endif.};
1c460 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c  ../*.** A global
1c470 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69   array of all wi
1c480 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73  nShmNode objects
1c490 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53  ..**.** The winS
1c4a0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75  hmMutexHeld() mu
1c4b0 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c 65  st be true while
1c4c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1c4d0 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a  ing this list..*
1c4e0 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e  /.static winShmN
1c4f0 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c  ode *winShmNodeL
1c500 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
1c510 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
1c520 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
1c530 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
1c540 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
1c550 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
1c560 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
1c570 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
1c580 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
1c590 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
1c5a0 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
1c5b0 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
1c5c0 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
1c5d0 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
1c5e0 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f     winShm.pShmNo
1c5f0 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e  de.**    winShm.
1c600 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68  id.**.** All oth
1c610 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  er fields are re
1c620 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77  ad/write.  The w
1c630 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e  inShm.pShmNode->
1c640 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
1c650 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
1c660 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
1c670 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
1c680 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a  struct winShm {.
1c690 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1c6a0 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20  hmNode;      /* 
1c6b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77  The underlying w
1c6c0 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1c6d0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e   */.  winShm *pN
1c6e0 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1c6f0 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20   /* Next winShm 
1c700 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77 69  with the same wi
1c710 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  nShmNode */.  u8
1c720 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
1c730 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1c740 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
1c750 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  winShmNode mutex
1c760 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
1c770 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1c780 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
1c790 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
1c7a0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
1c7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c7c0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
1c7d0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
1c7e0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1c7f0 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65  ITE_DEBUG) || de
1c800 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
1c810 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38  E_OS_TRACE).  u8
1c820 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
1c830 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
1c840 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
1c850 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53 68  n with its winSh
1c860 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  mNode */.#endif.
1c870 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
1c880 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
1c890 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
1c8a0 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28  WIN_SHM_BASE   (
1c8b0 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  (22+SQLITE_SHM_N
1c8c0 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20  LOCK)*4)        
1c8d0 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
1c8e0 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  te */.#define WI
1c8f0 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49  N_SHM_DMS    (WI
1c900 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54  N_SHM_BASE+SQLIT
1c910 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a  E_SHM_NLOCK)  /*
1c920 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20   deadman switch 
1c930 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20  */../*.** Apply 
1c940 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
1c950 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62  or all n bytes b
1c960 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74  eginning at ofst
1c970 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e  ..*/.#define WIN
1c980 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
1c990 66 69 6e 65 20 57 49 4e 53 48 4d 5f 52 44 4c 43  fine WINSHM_RDLC
1c9a0 4b 20 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e  K  2.#define WIN
1c9b0 53 48 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61  SHM_WRLCK  3.sta
1c9c0 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79  tic int winShmSy
1c9d0 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53  stemLock(.  winS
1c9e0 68 6d 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20  hmNode *pFile,  
1c9f0 20 20 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73    /* Apply locks
1ca00 20 74 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68   to this open sh
1ca10 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d  ared-memory segm
1ca20 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
1ca30 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f  kType,         /
1ca40 2a 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20  * WINSHM_UNLCK, 
1ca50 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72  WINSHM_RDLCK, or
1ca60 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f   WINSHM_WRLCK */
1ca70 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
1ca80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ca90 65 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65  et to first byte
1caa0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e   to be locked/un
1cab0 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20  locked */.  int 
1cac0 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20  nByte           
1cad0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1cae0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  ytes to lock or 
1caf0 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69  unlock */.){.  i
1cb00 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1cb10 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1cb20 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e  ode form Lock/Un
1cb30 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a  lockFileEx() */.
1cb40 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1cb50 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  the winShmNode o
1cb60 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
1cb70 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
1cb80 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  r */.  assert( s
1cb90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cba0 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
1cbb0 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d  || pFile->nRef==
1cbc0 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  0 );..  OSTRACE(
1cbd0 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1cbe0 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66  %p, lock=%d, off
1cbf0 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c  set=%d, size=%d\
1cc00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1cc10 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c  File->hFile.h, l
1cc20 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e  ockType, ofst, n
1cc30 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65  Byte));..  /* Re
1cc40 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68  lease/Acquire th
1cc50 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
1cc60 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  ock */.  if( loc
1cc70 6b 54 79 70 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e  kType==WINSHM_UN
1cc80 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
1cc90 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1cca0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f  File->hFile.h, o
1ccb0 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1ccc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1ccd0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1cce0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1ccf0 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52  ters */.    DWOR
1cd00 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b  D dwFlags = LOCK
1cd10 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
1cd20 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c  ATELY;.    if( l
1cd30 6f 63 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53 48  ockType == WINSH
1cd40 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67  M_WRLCK ) dwFlag
1cd50 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  s |= LOCKFILE_EX
1cd60 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
1cd70 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69    rc = winLockFi
1cd80 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1cd90 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73  .h, dwFlags, ofs
1cda0 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
1cdb0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
1cdc0 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53   0 ){.    rc = S
1cdd0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1cde0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
1cdf0 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74  stErrno =  osGet
1ce00 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1ce10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1ce20 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  Y;.  }..  OSTRAC
1ce30 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
1ce40 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65  e=%p, func=%s, e
1ce50 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c  rrno=%lu, rc=%s\
1ce60 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
1ce70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28  File->hFile.h, (
1ce80 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53  lockType == WINS
1ce90 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e  HM_UNLCK) ? "win
1cea0 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20  UnlockFile" :.  
1ceb0 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63           "winLoc
1cec0 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c  kFile", pFile->l
1ced0 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65  astErrno, sqlite
1cee0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1cef0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1cf00 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1cf10 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
1cf20 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1cf30 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
1cf40 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
1cf50 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
1cf60 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
1cf70 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
1cf80 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
1cf90 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
1cfa0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
1cfb0 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
1cfc0 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1cfd0 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
1cfe0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
1cff0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
1d000 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
1d010 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
1d020 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
1d030 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
1d040 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
1d050 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
1d060 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1d070 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
1d080 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1d090 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
1d0a0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
1d0b0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1d0c0 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
1d0d0 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
1d0e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1d0f0 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20  -PURGE pid=%lu, 
1d100 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22  deleteFlag=%d\n"
1d110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1d120 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1d130 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67  Id(), deleteFlag
1d140 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53  ));.  pp = &winS
1d150 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68  hmNodeList;.  wh
1d160 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d  ile( (p = *pp)!=
1d170 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
1d180 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
1d190 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
1d1a0 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71  ( p->mutex ){ sq
1d1b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1d1c0 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20  (p->mutex); }.  
1d1d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1d1e0 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
1d1f0 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52  .        BOOL bR
1d200 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f  c = osUnmapViewO
1d210 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  fFile(p->aRegion
1d220 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20  [i].pMap);.     
1d230 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1d240 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64  -PURGE-UNMAP pid
1d250 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1d260 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d270 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1d280 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d290 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1d2a0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1d2b0 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1d2c0 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1d2d0 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63  Rc);.        bRc
1d2e0 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   = osCloseHandle
1d2f0 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68  (p->aRegion[i].h
1d300 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1d310 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1d320 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  E-CLOSE pid=%lu,
1d330 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1d340 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1d350 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1d360 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1d370 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1d380 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1d390 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1d3a0 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1d3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d3c0 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55  ( p->hFile.h!=NU
1d3d0 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68  LL && p->hFile.h
1d3e0 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
1d3f0 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
1d400 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d410 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1d420 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71      winClose((sq
1d430 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d  lite3_file *)&p-
1d440 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >hFile);.       
1d450 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d460 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1d470 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
1d480 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  eteFlag ){.     
1d490 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1d4a0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1d4b0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1d4c0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
1d4d0 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65  .        winDele
1d4e0 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c  te(pVfs, p->zFil
1d4f0 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  ename, 0);.     
1d500 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
1d510 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1d520 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1d530 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1d540 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
1d550 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
1d560 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d570 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20  p->aRegion);.   
1d580 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1d590 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
1d5a0 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
1d5b0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
1d5c0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
1d5d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1d5e0 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
1d5f0 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ith database fil
1d600 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57  e pDbFd..**.** W
1d610 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
1d620 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
1d630 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
1d640 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
1d650 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
1d660 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1d670 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
1d680 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
1d690 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
1d6a0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
1d6b0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1d6c0 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
1d6d0 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
1d6e0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1d6f0 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64  nt winOpenShared
1d700 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a  Memory(winFile *
1d710 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1d720 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d740 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1d750 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
1d760 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1d770 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de *pShmNode = 0
1d780 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1d790 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
1d7a0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
1d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1d7d0 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73  sult code */.  s
1d7e0 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1d7f0 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
1d800 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
1d810 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ated winShmNode 
1d820 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d850 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65  of zName in byte
1d860 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1d870 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1d880 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76  ;    /* Not prev
1d890 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f  iously opened */
1d8a0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1d8b0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
1d8c0 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62  w sqlite3_shm ob
1d8d0 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63  ject.  Also spec
1d8e0 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61  ulatively.  ** a
1d8f0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1d900 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f  r a new winShmNo
1d910 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e  de and filename.
1d920 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
1d930 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1d940 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
1d950 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1d960 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d970 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d  MEM_BKPT;.  nNam
1d980 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
1d990 6e 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  n30(pDbFd->zPath
1d9a0 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
1d9b0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1d9c0 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
1d9d0 20 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b   + nName + 17 );
1d9e0 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1d9f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1da00 65 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ee(p);.    retur
1da10 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
1da20 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
1da30 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1da40 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b   = (char*)&pNew[
1da50 31 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  1];.  sqlite3_sn
1da60 70 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c  printf(nName+15,
1da70 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65   pNew->zFilename
1da80 2c 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46  , "%s-shm", pDbF
1da90 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c  d->zPath);.  sql
1daa0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
1dab0 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e  pDbFd->zPath, pN
1dac0 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ew->zFilename);.
1dad0 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65  .  /* Look to se
1dae0 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
1daf0 20 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d   existing winShm
1db00 4e 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65  Node that can be
1db10 20 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e   used..  ** If n
1db20 6f 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68  o matching winSh
1db30 6d 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20  mNode currently 
1db40 65 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61  exists, create a
1db50 20 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   new one..  */. 
1db60 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1db70 78 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e  x();.  for(pShmN
1db80 6f 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ode = winShmNode
1db90 4c 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20  List; pShmNode; 
1dba0 70 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64  pShmNode=pShmNod
1dbb0 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  e->pNext){.    /
1dbc0 2a 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f  * TBD need to co
1dbd0 6d 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65  me up with bette
1dbe0 72 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50  r match here.  P
1dbf0 65 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73  erhaps.    ** us
1dc00 65 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44  e FILE_ID_BOTH_D
1dc10 49 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72  IR_INFO Structur
1dc20 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1dc30 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
1dc40 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65  (pShmNode->zFile
1dc50 6e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  name, pNew->zFil
1dc60 65 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61  ename)==0 ) brea
1dc70 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  k;.  }.  if( pSh
1dc80 6d 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c  mNode ){.    sql
1dc90 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1dca0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53  .  }else{.    pS
1dcb0 68 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20  hmNode = pNew;. 
1dcc0 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20     pNew = 0;.   
1dcd0 20 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53   ((winFile*)(&pS
1dce0 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d  hmNode->hFile))-
1dcf0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
1dd00 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70  DLE_VALUE;.    p
1dd10 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d  ShmNode->pNext =
1dd20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b   winShmNodeList;
1dd30 0a 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  .    winShmNodeL
1dd40 69 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ist = pShmNode;.
1dd50 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1dd60 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1dd70 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
1dd80 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1dd90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1dda0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1ddb0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
1ddc0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
1ddd0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
1dde0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
1ddf0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
1de00 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
1de10 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1de20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72    }.    }..    r
1de30 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
1de40 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20  d->pVfs,.       
1de50 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
1de60 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  de->zFilename,  
1de70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1de80 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28  me of the file (
1de90 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20  UTF-8) */.      
1dea0 20 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69             (sqli
1deb0 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e  te3_file*)&pShmN
1dec0 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20  ode->hFile,  /* 
1ded0 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65  File handle here
1dee0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1def0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
1df00 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50  _WAL | SQLITE_OP
1df10 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1df20 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1df30 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
1df40 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
1df50 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
1df60 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
1df70 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
1df80 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  .    /* Check to
1df90 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
1dfa0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
1dfb0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
1dfc0 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49  switch..    ** I
1dfd0 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20  f not, truncate 
1dfe0 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f  the file to zero
1dff0 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a   length..    */.
1e000 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79      if( winShmSy
1e010 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1e020 65 2c 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c  e, WINSHM_WRLCK,
1e030 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1e040 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e050 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1e060 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1e070 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1e080 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1e090 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1e0b0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1e0c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1e0d0 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1e0e0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1e0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e100 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1e110 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1e120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1e130 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e140 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1e150 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e160 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c  Node, WINSHM_UNL
1e170 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1e180 20 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   1);.      rc = 
1e190 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1e1a0 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1e1b0 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_RDLCK, WIN_SHM
1e1c0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d 0a  _DMS, 1);.    }.
1e1d0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1e1e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1e1f0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74    }..  /* Make t
1e200 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f  he new connectio
1e210 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65  n a child of the
1e220 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1e230 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70   p->pShmNode = p
1e240 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66  ShmNode;.#if def
1e250 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1e260 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1e270 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41  LITE_HAVE_OS_TRA
1e280 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  CE).  p->id = pS
1e290 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
1e2a0 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
1e2b0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
1e2c0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1e2d0 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65  p;.  winShmLeave
1e2e0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
1e2f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
1e300 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
1e310 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1e320 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
1e330 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
1e340 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45 6e   of the winShmEn
1e350 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78  terMutex() mutex
1e360 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72   and the pointer
1e370 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e   from the.  ** n
1e380 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53 68  ew (struct winSh
1e390 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
1e3a0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
1e3b0 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
1e3c0 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
1e3d0 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
1e3e0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
1e3f0 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
1e400 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
1e410 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
1e420 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
1e430 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
1e440 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
1e450 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d  de->mutex.  ** m
1e460 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
1e470 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e480 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1e490 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
1e4a0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e4b0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
1e4c0 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
1e4d0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1e4e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1e4f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1e500 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
1e510 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
1e520 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
1e530 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73 74  rr:.  winShmSyst
1e540 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1e550 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57   WINSHM_UNLCK, W
1e560 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1e570 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1e580 62 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20  bFd->pVfs, 0);  
1e590 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1e5a0 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
1e5b0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
1e5c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1e5d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1e5e0 28 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d  (pNew);.  winShm
1e5f0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
1e600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e610 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
1e620 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
1e630 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
1e640 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1e650 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65  ** storage if de
1e660 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65  leteFlag is true
1e670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e680 77 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  winShmUnmap(.  s
1e690 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1e6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1e6b0 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1e6c0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1e6d0 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20   int deleteFlag 
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1e6f0 65 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73  elete after clos
1e700 69 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ing if true */.)
1e710 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62  {.  winFile *pDb
1e720 46 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Fd;       /* Dat
1e730 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68  abase holding sh
1e740 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared-memory */. 
1e750 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1e760 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
1e770 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63  nnection to be c
1e780 6c 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68  losed */.  winSh
1e790 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
1e7a0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1e7b0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1e7c0 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68   file */.  winSh
1e7d0 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
1e7e0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1e7f0 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e  over sibling con
1e800 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70  nections */..  p
1e810 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1e820 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64  )fd;.  p = pDbFd
1e830 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d  ->pShm;.  if( p=
1e840 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1e850 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64  TE_OK;.  pShmNod
1e860 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
1e870 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
1e880 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
1e890 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
1e8a0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
1e8b0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
1e8c0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
1e8d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1e8e0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1e8f0 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
1e900 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
1e910 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
1e920 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
1e930 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
1e940 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
1e950 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
1e960 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1e970 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
1e980 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
1e990 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1e9a0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
1e9b0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
1e9c0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
1e9d0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
1e9e0 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
1e9f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1ea00 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69  ile, too */.  wi
1ea10 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1ea20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
1ea30 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
1ea40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
1ea50 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
1ea60 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
1ea70 20 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70     winShmPurge(p
1ea80 44 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65  DbFd->pVfs, dele
1ea90 74 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77  teFlag);.  }.  w
1eaa0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1eab0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
1eac0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1ead0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
1eae0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
1eaf0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
1eb00 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1eb10 74 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20  t winShmLock(.  
1eb20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1eb30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
1eb40 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1eb50 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
1eb60 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
1eb70 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
1eb80 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
1eb90 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
1eba0 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1ebb0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1ebc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1ebd0 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
1ebe0 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
1ebf0 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1ec00 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
1ec10 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
1ec20 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
1ec30 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1ec40 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1ec50 2a 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20  *)fd;        /* 
1ec60 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
1ec70 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1ec80 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20   */.  winShm *p 
1ec90 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20  = pDbFd->pShm;  
1eca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ecb0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
1ecc0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
1ecd0 0a 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20  .  winShm *pX;  
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1ed00 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
1ed10 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77   siblings */.  w
1ed20 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1ed30 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64  ode = p->pShmNod
1ed40 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1ed50 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
1ed60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1ed70 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75  sult code */.  u
1ed80 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  16 mask;        
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1edb0 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72  locks to take or
1edc0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61   release */..  a
1edd0 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26  ssert( ofst>=0 &
1ede0 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45  & ofst+n<=SQLITE
1edf0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20  _SHM_NLOCK );.  
1ee00 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a  assert( n>=1 );.
1ee10 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
1ee20 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43  =(SQLITE_SHM_LOC
1ee30 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  K | SQLITE_SHM_S
1ee40 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c  HARED).       ||
1ee50 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1ee60 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1ee70 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1ee80 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1ee90 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1eea0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1eeb0 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
1eec0 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
1eed0 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20  TE_SHM_UNLOCK | 
1eee0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1eef0 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72  SIVE) );.  asser
1ef00 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67  t( n==1 || (flag
1ef10 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  s & SQLITE_SHM_E
1ef20 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a  XCLUSIVE)!=0 );.
1ef30 0a 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28  .  mask = (u16)(
1ef40 28 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d  (1U<<(ofst+n)) -
1ef50 20 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20   (1U<<ofst));.  
1ef60 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
1ef70 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
1ef80 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1ef90 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1efa0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1efb0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1efc0 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
1efd0 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
1efe0 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
1eff0 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
1f000 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
1f010 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
1f020 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
1f030 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
1f040 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1f050 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1f060 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1f070 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
1f080 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1f090 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
1f0a0 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
1f0b0 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
1f0c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
1f0d0 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
1f0e0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
1f0f0 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
1f100 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1f110 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
1f120 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
1f130 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1f140 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1f150 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1f160 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57  HM_UNLCK, ofst+W
1f170 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IN_SHM_BASE, n);
1f180 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f190 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1f1a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1f1b0 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
1f1c0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1f1d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1f1e0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
1f1f0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
1f200 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
1f210 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
1f220 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
1f230 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
1f240 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
1f250 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
1f260 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
1f270 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
1f280 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
1f290 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
1f2a0 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
1f2b0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
1f2c0 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
1f2d0 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
1f2e0 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
1f2f0 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
1f300 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
1f310 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
1f320 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
1f330 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
1f340 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
1f350 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1f360 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1f370 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1f380 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1f390 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1f3a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f3b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1f3c0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f3d0 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
1f3e0 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
1f3f0 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1f400 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
1f410 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
1f420 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
1f430 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
1f440 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f450 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
1f460 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
1f470 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1f480 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1f490 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1f4a0 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 66 73  INSHM_RDLCK, ofs
1f4b0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1f4c0 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1f4d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1f4e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
1f4f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1f500 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
1f510 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  red locks */.   
1f520 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f530 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  OK ){.      p->s
1f540 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
1f550 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1f560 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  {.    /* Make su
1f570 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f  re no sibling co
1f580 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c  nnections hold l
1f590 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ocks that will b
1f5a0 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a  lock this.    **
1f5b0 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64   lock.  If any d
1f5c0 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  o, return SQLITE
1f5d0 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79  _BUSY right away
1f5e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
1f5f0 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1f600 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1f610 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1f620 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
1f630 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28   & mask)!=0 || (
1f640 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  pX->sharedMask &
1f650 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20   mask)!=0 ){.   
1f660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1f670 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62  _BUSY;.        b
1f680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1f690 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1f6a0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1f6b0 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
1f6c0 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69  m level.  Then i
1f6d0 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20  f successful.   
1f6e0 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68   ** also mark th
1f6f0 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69  e local connecti
1f700 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b  on as being lock
1f710 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
1f720 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1f740 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1f750 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d  pShmNode, WINSHM
1f760 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _WRLCK, ofst+WIN
1f770 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1f780 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1f790 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f7a0 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68    assert( (p->sh
1f7b0 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
1f7c0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1f7d0 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
1f7e0 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sk;.      }.    
1f7f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
1f800 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1f810 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1f820 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f  OSTRACE(("SHM-LO
1f830 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d 25  CK pid=%lu, id=%
1f840 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25 30  d, sharedMask=%0
1f850 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30 33  3x, exclMask=%03
1f860 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  x, rc=%s\n",.   
1f870 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f880 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f890 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72 65   p->id, p->share
1f8a0 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61  dMask, p->exclMa
1f8b0 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 73  sk,.           s
1f8c0 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1f8d0 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
1f8e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1f8f0 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
1f900 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
1f910 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
1f920 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41 6c  memory..**.** Al
1f930 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
1f940 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
1f950 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
1f960 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
1f970 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
1f980 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
1f990 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
1f9a0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1f9b0 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73  nShmBarrier(.  s
1f9c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
1f9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1f9e0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  base holding the
1f9f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1fa00 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
1fa10 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73  RAMETER(fd);.  s
1fa20 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72  qlite3MemoryBarr
1fa30 69 65 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d 70  ier();   /* comp
1fa40 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d  iler-defined mem
1fa50 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20  ory barrier */. 
1fa60 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1fa70 78 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  x();       /* Al
1fa80 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65  so mutex, for re
1fa90 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 77 69  dundancy */.  wi
1faa0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1fab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fac0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1fad0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70  ed to obtain a p
1fae0 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e  ointer to region
1faf0 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 0a   iRegion of the.
1fb00 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
1fb10 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1fb20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1fb30 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65  le fd. Shared-me
1fb40 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a 20  mory regions.** 
1fb50 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
1fb60 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
1fb70 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
1fb80 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
1fb90 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73 20  Region.** bytes 
1fba0 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49  in size..**.** I
1fbb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fbc0 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
1fbd0 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
1fbe0 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
1fbf0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ULL..**.** Other
1fc00 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73 57  wise, if the isW
1fc10 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20 69  rite parameter i
1fc20 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75  s 0 and the requ
1fc30 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1fc40 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61  ory.** region ha
1fc50 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
1fc60 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69  ated (by any cli
1fc70 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f  ent, including o
1fc80 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a  ne running in a.
1fc90 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63  ** separate proc
1fca0 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69  ess), then *pp i
1fcb0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e  s set to NULL an
1fcc0 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
1fcd0 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57 72  rned. If.** isWr
1fce0 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ite is non-zero 
1fcf0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
1fd00 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
1fd10 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
1fd20 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  et.** been alloc
1fd30 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
1fd40 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
1fd50 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
1fd60 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
1fd70 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
1fd80 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
1fd90 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
1fda0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
1fdb0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
1fdc0 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
1fdd0 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
1fde0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a 2a  this processes.*
1fdf0 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20  * address space 
1fe00 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1fe10 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73  ready), *pp is s
1fe20 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
1fe30 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65 6d  he mapped.** mem
1fe40 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
1fe50 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
1fe60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1fe70 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
1fe80 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1fe90 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
1fea0 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
1feb0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1fec0 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
1fed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1fee0 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
1fef0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
1ff00 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
1ff10 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1ff20 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
1ff30 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20 20  nt isWrite,     
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ff50 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
1ff60 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
1ff70 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
1ff80 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
1ff90 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1ffa0 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
1ffb0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1ffc0 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1ffd0 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a 70  )fd;.  winShm *p
1ffe0 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68  Shm = pDbFd->pSh
1fff0 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  m;.  winShmNode 
20000 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74  *pShmNode;.  int
20010 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
20020 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29 7b  ..  if( !pShm ){
20030 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65  .    rc = winOpe
20040 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  nSharedMemory(pD
20050 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  bFd);.    if( rc
20060 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
20070 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53 68  turn rc;.    pSh
20080 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  m = pDbFd->pShm;
20090 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65 20  .  }.  pShmNode 
200a0 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64 65  = pShm->pShmNode
200b0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ;..  sqlite3_mut
200c0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
200d0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  e->mutex);.  ass
200e0 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70  ert( szRegion==p
200f0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
20100 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  n || pShmNode->n
20110 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20 20  Region==0 );..  
20120 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
20130 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29  egion<=iRegion )
20140 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68 6d  {.    struct Shm
20150 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20 20  Region *apNew;  
20160 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
20170 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  aRegion[] array 
20180 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
20190 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a 73   = (iRegion+1)*s
201a0 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69 6e  zRegion;  /* Min
201b0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
201c0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
201d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69 7a    /* Current siz
20200 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20 66  e of wal-index f
20210 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  ile */..    pShm
20220 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
20230 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
20240 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
20250 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
20260 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
20270 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20280 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  s space..    ** 
20290 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
202a0 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  it has been allo
202b0 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74  cated (i.e. if t
202c0 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c  he wal-index fil
202d0 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72 67  e is.    ** larg
202e0 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
202f0 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
20300 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 2a  d region)..    *
20310 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  /.    rc = winFi
20320 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
20330 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65  file *)&pShmNode
20340 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a 20  ->hFile, &sz);. 
20350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20370 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
20380 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
20390 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  IZE, osGetLastEr
203a0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
203c0 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62 46  inShmMap1", pDbF
203d0 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
203e0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
203f0 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  t;.    }..    if
20400 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20 20  ( sz<nByte ){.  
20410 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
20420 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
20430 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
20440 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69 73  t. If isWrite is
20450 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a 2a   set to.      **
20460 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72 6c   zero, exit earl
20470 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73  y. *pp will be s
20480 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53  et to NULL and S
20490 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
204a0 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
204b0 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76 65    ** Alternative
204c0 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20 69  ly, if isWrite i
204d0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65 20  s non-zero, use 
204e0 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20 61  ftruncate() to a
204f0 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a 2a  llocate.      **
20500 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
20510 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20 20  emory region..  
20520 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
20530 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74 6f   !isWrite ) goto
20540 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
20550 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
20560 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
20570 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e  le *)&pShmNode->
20580 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20  hFile, nByte);. 
20590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
205a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
205b0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
205c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
205d0 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
205e0 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32 22      "winShmMap2"
20610 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
20620 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
20630 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
20640 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
20650 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
20660 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20670 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
20680 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
20690 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
206a0 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52 65   = (struct ShmRe
206b0 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f 72  gion *)sqlite3_r
206c0 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20  ealloc64(.      
206d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
206e0 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31 29  ion, (iRegion+1)
206f0 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30 5d  *sizeof(apNew[0]
20700 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
20710 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20   !apNew ){.     
20720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
20730 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
20740 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
20750 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
20760 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
20770 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20 20  on = apNew;..   
20780 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65   while( pShmNode
20790 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
207a0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e 44  on ){.      HAND
207b0 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20  LE hMap = NULL; 
207c0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d          /* file-
207d0 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a  mapping handle *
207e0 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  /.      void *pM
207f0 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
20800 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65      /* Mapped me
20810 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a  mory region */..
20820 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20830 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20 3d  NRT.      hMap =
20840 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
20850 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68 6d  pingFromApp(pShm
20860 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
20870 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
20880 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 6e  AGE_READWRITE, n
20890 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20  Byte, NULL.     
208a0 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
208b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
208c0 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20 68  AS_WIDE).      h
208d0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
208e0 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d 4e  leMappingW(pShmN
208f0 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20  ode->hFile.h,.  
20900 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50 41          NULL, PA
20910 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30 2c  GE_READWRITE, 0,
20920 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20   nByte, NULL.   
20930 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69     );.#elif defi
20940 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
20950 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51  _HAS_ANSI) && SQ
20960 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54  LITE_WIN32_CREAT
20970 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20  EFILEMAPPINGA.  
20980 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
20990 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28  ateFileMappingA(
209a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
209b0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
209c0 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
209d0 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
209e0 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64 69  L.      );.#endi
209f0 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  f.      OSTRACE(
20a00 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54 45  ("SHM-MAP-CREATE
20a10 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
20a20 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
20a30 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
20a40 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20a50 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20a60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20a70 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20 20  n, nByte,.      
20a80 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f 20           hMap ? 
20a90 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
20aa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d 61  );.      if( hMa
20ab0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  p ){.        int
20ac0 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d 4e   iOffset = pShmN
20ad0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a 52  ode->nRegion*szR
20ae0 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  egion;.        i
20af0 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
20b00 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
20b10 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
20b20 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
20b30 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
20b40 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61 70  NRT.        pMap
20b50 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69   = osMapViewOfFi
20b60 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c 20  leFromApp(hMap, 
20b70 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20 7c  FILE_MAP_WRITE |
20b80 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c 0a   FILE_MAP_READ,.
20b90 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
20ba0 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69  set - iOffsetShi
20bb0 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69  ft, szRegion + i
20bc0 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20  OffsetShift.    
20bd0 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20      );.#else.   
20be0 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61       pMap = osMa
20bf0 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70  pViewOfFile(hMap
20c00 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45  , FILE_MAP_WRITE
20c10 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44   | FILE_MAP_READ
20c20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30 2c  ,.            0,
20c30 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
20c40 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
20c50 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
20c60 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  .        );.#end
20c70 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  if.        OSTRA
20c80 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41 50  CE(("SHM-MAP-MAP
20c90 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
20ca0 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20  =%d, offset=%d, 
20cb0 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  size=%d, rc=%s\n
20cc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
20cd0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
20ce0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53 68  ProcessId(), pSh
20cf0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c 20  mNode->nRegion, 
20d00 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  iOffset,.       
20d10 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67 69            szRegi
20d20 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22 20  on, pMap ? "ok" 
20d30 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
20d40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
20d50 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  !pMap ){.       
20d60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45   pShmNode->lastE
20d70 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
20d80 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
20d90 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
20da0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
20db0 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65 2d  HMMAP, pShmNode-
20dc0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 33       "winShmMap3
20df0 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
20e00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68 4d  ;.        if( hM
20e10 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e 64  ap ) osCloseHand
20e20 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20 20  le(hMap);.      
20e30 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
20e40 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ut;.      }..   
20e50 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
20e60 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
20e70 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20 70  Region].pMap = p
20e80 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  Map;.      pShmN
20e90 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68  ode->aRegion[pSh
20ea0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e  mNode->nRegion].
20eb0 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20 20  hMap = hMap;.   
20ec0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65     pShmNode->nRe
20ed0 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  gion++;.    }.  
20ee0 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a  }..shmpage_out:.
20ef0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
20f00 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20  nRegion>iRegion 
20f10 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 73  ){.    int iOffs
20f20 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a 52  et = iRegion*szR
20f30 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20 69  egion;.    int i
20f40 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69 4f  OffsetShift = iO
20f50 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49 6e  ffset % winSysIn
20f60 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47  fo.dwAllocationG
20f70 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20 20  ranularity;.    
20f80 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72 20  char *p = (char 
20f90 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67  *)pShmNode->aReg
20fa0 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d 61  ion[iRegion].pMa
20fb0 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76 6f  p;.    *pp = (vo
20fc0 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74 53  id *)&p[iOffsetS
20fd0 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  hift];.  }else{.
20fe0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
20ff0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
21000 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
21010 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
21020 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  n rc;.}..#else.#
21030 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d 61   define winShmMa
21040 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
21050 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20 30   winShmLock    0
21060 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d  .# define winShm
21070 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
21080 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20 20  ne winShmUnmap  
21090 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
210a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
210b0 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
210c0 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61 70  leans up the map
210d0 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74 68  ped region of th
210e0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
210f0 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69 66  , if any..*/.#if
21100 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
21110 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
21120 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28  nt winUnmapfile(
21130 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
21140 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
21150 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
21160 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
21170 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21180 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52 65   hMap=%p, pMapRe
21190 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
211a0 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65 3d        "mmapSize=
211b0 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41 63  %lld, mmapSizeAc
211c0 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  tual=%lld, mmapS
211d0 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c 0a  izeMax=%lld\n",.
211e0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
211f0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
21200 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
21210 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e 70  ->hMap, pFile->p
21220 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20 20  MapRegion,.     
21230 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61        pFile->mma
21240 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d 6d  pSize, pFile->mm
21250 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70 46  apSizeActual, pF
21260 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
21270 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ));.  if( pFile-
21280 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
21290 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70 56     if( !osUnmapV
212a0 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
212b0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b 0a  >pMapRegion) ){.
212c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
212d0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
212e0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
212f0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
21300 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
21310 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
21320 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
21330 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
21340 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
21350 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
21360 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
21370 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
21380 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
21390 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
213a0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
213b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
213c0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
213d0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
213e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
213f0 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20 70  inUnmapfile1", p
21400 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
21410 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70    }.    pFile->p
21420 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
21430 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69     pFile->mmapSi
21440 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ze = 0;.    pFil
21450 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
21460 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  l = 0;.  }.  if(
21470 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e 55   pFile->hMap!=NU
21480 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f  LL ){.    if( !o
21490 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
214a0 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20 20  le->hMap) ){.   
214b0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
214c0 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
214d0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
214e0 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
214f0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
21500 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 72  e=%p, hMap=%p, r
21510 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
21520 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  MAP\n",.        
21530 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
21540 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21550 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d  pFile, pFile->hM
21560 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ap));.      retu
21570 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
21580 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
21590 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
215a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
215c0 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70 46  nUnmapfile2", pF
215d0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
215e0 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d   }.    pFile->hM
215f0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  ap = NULL;.  }. 
21600 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
21610 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
21620 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
21630 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
21640 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21650 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21660 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ile));.  return 
21670 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
21680 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
21690 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
216a0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
216b0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
216c0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
216d0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
216e0 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
216f0 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
21700 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
21710 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65 20  Or, if.** there 
21720 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
21730 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69   mapping for thi
21740 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72  s file, and ther
21750 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20 6f  e are still.** o
21760 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
21770 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
21780 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
21790 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
217a0 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
217b0 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
217c0 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
217d0 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
217e0 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74 68  ed size of.** th
217f0 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65  e mapping to cre
21800 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ate. Otherwise, 
21810 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73  if nByte is less
21820 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
21830 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 65   the.** requeste
21840 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69  d size is the si
21850 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
21860 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75  n disk. The actu
21870 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  al size of the.*
21880 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e  * created mappin
21890 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20  g is either the 
218a0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
218b0 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66  r the value conf
218c0 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67 20  igured.** using 
218d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
218e0 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76 65  P_SIZE, whicheve
218f0 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
21900 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
21910 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
21920 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
21930 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
21940 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
21950 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
21960 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
21970 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
21980 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
21990 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
219a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
219b0 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46   winMapfile(winF
219c0 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74 65  ile *pFd, sqlite
219d0 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
219e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
219f0 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20  nMap = nByte;.  
21a00 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
21a10 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46  t( nMap>=0 || pF
21a20 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
21a30 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d  );.  OSTRACE(("M
21a40 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
21a50 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d   pFile=%p, size=
21a60 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %lld\n",.       
21a70 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
21a80 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
21a90 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69 66  , nByte));..  if
21aa0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
21ab0 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
21ac0 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d  TE_OK;..  if( nM
21ad0 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  ap<0 ){.    rc =
21ae0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71   winFileSize((sq
21af0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64 2c  lite3_file*)pFd,
21b00 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66 28   &nMap);.    if(
21b10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53 54   rc ){.      OST
21b20 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
21b30 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21b40 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
21b50 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20 20  RR_FSTAT\n",.   
21b60 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
21b70 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
21b80 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20 20  d(), pFd));.    
21b90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ba0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
21bb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61   }.  }.  if( nMa
21bc0 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  p>pFd->mmapSizeM
21bd0 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d  ax ){.    nMap =
21be0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
21bf0 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26 3d  x;.  }.  nMap &=
21c00 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34   ~(sqlite3_int64
21c10 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50  )(winSysInfo.dwP
21c20 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a 20  ageSize - 1);.. 
21c30 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26 20   if( nMap==0 && 
21c40 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20  pFd->mmapSize>0 
21c50 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66  ){.    winUnmapf
21c60 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20 20  ile(pFd);.  }.  
21c70 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
21c80 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 76  mapSize ){.    v
21c90 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  oid *pNew = 0;. 
21ca0 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74     DWORD protect
21cb0 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c 59   = PAGE_READONLY
21cc0 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61 67  ;.    DWORD flag
21cd0 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  s = FILE_MAP_REA
21ce0 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70  D;..    winUnmap
21cf0 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66 64 65  file(pFd);.#ifde
21d00 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  f SQLITE_MMAP_RE
21d10 41 44 57 52 49 54 45 0a 20 20 20 20 69 66 28 20  ADWRITE.    if( 
21d20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
21d30 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  & WINFILE_RDONLY
21d40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  )==0 ){.      pr
21d50 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
21d60 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66 6c  DWRITE;.      fl
21d70 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50 5f  ags |= FILE_MAP_
21d80 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 65 6e  WRITE;.    }.#en
21d90 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  dif.#if SQLITE_O
21da0 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64 2d  S_WINRT.    pFd-
21db0 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65  >hMap = osCreate
21dc0 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
21dd0 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c  pp(pFd->h, NULL,
21de0 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c 20   protect, nMap, 
21df0 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
21e00 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
21e10 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20  2_HAS_WIDE).    
21e20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
21e30 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
21e40 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70  (pFd->h, NULL, p
21e50 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20  rotect,.        
21e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e70 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
21e80 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66  (nMap>>32) & 0xf
21e90 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20  fffffff),.      
21ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21eb0 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44            (DWORD
21ec0 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66  )(nMap & 0xfffff
21ed0 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  fff), NULL);.#el
21ee0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
21ef0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
21f00 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  ) && SQLITE_WIN3
21f10 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
21f20 49 4e 47 41 0a 20 20 20 20 70 46 64 2d 3e 68 4d  INGA.    pFd->hM
21f30 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
21f40 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e 68  eMappingA(pFd->h
21f50 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c  , NULL, protect,
21f60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e   (DWORD)((nMap>>
21f90 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66  32) & 0xffffffff
21fa0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20     (DWORD)(nMap 
21fd0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e  & 0xffffffff), N
21fe0 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ULL);.#endif.   
21ff0 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d 3d   if( pFd->hMap==
22000 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 46  NULL ){.      pF
22010 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  d->lastErrno = o
22020 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
22030 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
22040 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
22050 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d 3e  OERR_MMAP, pFd->
22060 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22 2c    "winMapfile1",
22090 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20   pFd->zPath);.  
220a0 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20 65      /* Log the e
220b0 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69 6e  rror, but contin
220c0 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ue normal operat
220d0 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64 2f  ion using xRead/
220e0 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  xWrite */.      
220f0 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49  OSTRACE(("MAP-FI
22100 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c  LE-CREATE pid=%l
22110 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
22120 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
22130 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
22140 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
22150 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  Fd, sqlite3ErrNa
22160 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
22170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
22190 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e 53  rt( (nMap % winS
221a0 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
221b0 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  e)==0 );.    ass
221c0 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a 45  ert( sizeof(SIZE
221d0 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c 69  _T)==sizeof(sqli
221e0 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e 4d  te3_int64) || nM
221f0 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20 29  ap<=0xffffffff )
22200 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
22210 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20 3d  WINRT.    pNew =
22220 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
22230 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d 61  FromApp(pFd->hMa
22240 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53 49  p, flags, 0, (SI
22250 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c 73  ZE_T)nMap);.#els
22260 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  e.    pNew = osM
22270 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 64  apViewOfFile(pFd
22280 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
22290 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
222a0 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  p);.#endif.    i
222b0 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b  f( pNew==NULL ){
222c0 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  .      osCloseHa
222d0 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29 3b  ndle(pFd->hMap);
222e0 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61 70  .      pFd->hMap
222f0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 70   = NULL;.      p
22300 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
22310 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
22320 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
22330 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22340 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
22350 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32 22     "winMapfile2"
22380 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
22390 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
223a0 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
223b0 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
223c0 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
223d0 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
223e0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
223f0 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  ILE-MAP pid=%lu,
22400 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73   pFile=%p, rc=%s
22410 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22420 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22430 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
22440 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
22450 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
22460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22470 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e 70      }.    pFd->p
22480 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65 77  MapRegion = pNew
22490 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
224a0 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20 20  ize = nMap;.    
224b0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
224c0 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d 0a  ual = nMap;.  }.
224d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50  .  OSTRACE(("MAP
224e0 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
224f0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
22500 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
22510 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
22520 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
22530 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d));.  return SQ
22540 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
22550 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
22560 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
22570 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
22580 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
22590 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
225a0 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
225b0 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
225c0 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
225d0 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
225e0 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
225f0 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
22600 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
22610 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
22620 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
22630 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
22640 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
22650 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
22660 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
22670 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
22680 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
22690 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
226a0 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
226b0 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
226c0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
226d0 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
226e0 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
226f0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
22700 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
22710 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
22720 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
22730 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
22740 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
22750 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73 65  ually.** release
22760 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
22770 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e 66  y calling winUnf
22780 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
22790 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28 73  c int winFetch(s
227a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
227b0 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e   i64 iOff, int n
227c0 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b  Amt, void **pp){
227d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
227e0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
227f0 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
22800 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
22810 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
22820 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
22830 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
22840 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  ;..  OSTRACE(("F
22850 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
22860 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
22870 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20  lld, amount=%d, 
22880 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20  pp=%p\n",.      
22890 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
228a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
228b0 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70 70  , iOff, nAmt, pp
228c0 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
228d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
228e0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
228f0 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20  izeMax>0 ){.    
22900 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
22910 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
22920 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70 66  int rc = winMapf
22930 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20  ile(pFd, -1);.  
22940 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22950 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22960 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43 48   OSTRACE(("FETCH
22970 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
22980 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
229a0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
229b0 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c  ssId(), pFd, sql
229c0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
229d0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
229e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
229f0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
22a00 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
22a10 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
22a20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
22a30 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
22a40 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
22a50 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
22a60 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
22a70 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
22a80 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
22a90 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70 3d  =%p, pp=%p, *pp=
22aa0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
22ab0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22ac0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22ad0 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70 2c  essId(), fd, pp,
22ae0 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72 6e   *pp));.  return
22af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22b00 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
22b10 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
22b20 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
22b30 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
22b40 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65 6e  ses a.** referen
22b50 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
22b60 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
22b70 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54 68  o winFetch(). Th
22b80 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
22b90 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
22ba0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  his function mus
22bb0 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
22bc0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
22bd0 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  ng.** argument t
22be0 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20 74  hat was passed t
22bf0 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28 29  o the winFetch()
22c00 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a   invocation..**.
22c10 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68  ** Or, if the th
22c20 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ird argument is 
22c30 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
22c40 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
22c50 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20 69  g called.** to i
22c60 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
22c70 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
22c80 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
22c90 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
22ca0 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  ng.** may now be
22cb0 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
22cc0 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
22cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
22ce0 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  inUnfetch(sqlite
22cf0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
22d00 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
22d10 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
22d20 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e  MAP_SIZE>0.  win
22d30 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69 6e  File *pFd = (win
22d40 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20 54  File*)fd;   /* T
22d50 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
22d60 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
22d70 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e    /* If p==0 (un
22d80 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66  map the entire f
22d90 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20  ile) then there 
22da0 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74  must be no outst
22db0 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65 74  anding.  ** xFet
22dc0 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
22dd0 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
22de0 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
22df0 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
22e00 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
22e10 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
22e20 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
22e30 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22e40 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
22e50 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
22e60 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
22e70 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
22e80 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
22e90 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
22ea0 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
22eb0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
22ec0 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  f] );..  OSTRACE
22ed0 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25  (("UNFETCH pid=%
22ee0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66  lu, pFile=%p, of
22ef0 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70 5c  fset=%lld, p=%p\
22f00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
22f10 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
22f20 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f 66  ssId(), pFd, iOf
22f30 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20 70  f, p));..  if( p
22f40 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65   ){.    pFd->nFe
22f50 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73  tchOut--;.  }els
22f60 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45 3a  e{.    /* FIXME:
22f70 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72 75    If Windows tru
22f80 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65 6e  ly always preven
22f90 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f 72  ts truncating or
22fa0 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20 20   deleting a.    
22fb0 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61 20  ** file while a 
22fc0 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64 2c  mapping is held,
22fd0 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
22fe0 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  ing winUnmapfile
22ff0 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 69  () call.    ** i
23000 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63 61  s unnecessary ca
23010 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20 70  n be omitted - p
23020 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72 6f  otentially impro
23030 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72 66  ving.    ** perf
23040 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20 20  ormance.  */.   
23050 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
23060 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  d);.  }..  asser
23070 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
23080 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  t>=0 );.#endif..
23090 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45    OSTRACE(("UNFE
230a0 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  TCH pid=%lu, pFi
230b0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
230c0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
230d0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
230e0 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29 29  rocessId(), fd))
230f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23100 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
23110 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
23120 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
23130 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
23140 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
23150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23160 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
23170 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
23180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
231a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
231b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
231c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
231d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
231e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
231f0 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64  ** This vector d
23200 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d  efines all the m
23210 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20  ethods that can 
23220 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a  operate on an.**
23230 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f   sqlite3_file fo
23240 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61 74  r win32..*/.stat
23250 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
23260 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49  _io_methods winI
23270 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c  oMethod = {.  3,
23280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
232a0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77   iVersion */.  w
232b0 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  inClose,        
232c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
232d0 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69  * xClose */.  wi
232e0 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  nRead,          
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23300 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57   xRead */.  winW
23310 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
23320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23330 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72  Write */.  winTr
23340 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
23350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
23360 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e  runcate */.  win
23370 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23390 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69  xSync */.  winFi
233a0 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
233b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
233c0 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e  ileSize */.  win
233d0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
233e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
233f0 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55 6e  xLock */.  winUn
23400 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
23410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
23420 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43 68  nlock */.  winCh
23430 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
23440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
23450 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
23460 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e   */.  winFileCon
23470 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
23480 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
23490 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65  ntrol */.  winSe
234a0 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
234b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
234c0 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77  ectorSize */.  w
234d0 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65  inDeviceCharacte
234e0 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f  ristics,       /
234f0 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74  * xDeviceCharact
23500 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69  eristics */.  wi
23510 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20  nShmMap,        
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23530 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69   xShmMap */.  wi
23540 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  nShmLock,       
23550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23560 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77   xShmLock */.  w
23570 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20  inShmBarrier,   
23580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23590 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f  * xShmBarrier */
235a0 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20  .  winShmUnmap, 
235b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235c0 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20     /* xShmUnmap 
235d0 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20  */.  winFetch,  
235e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235f0 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a       /* xFetch *
23600 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20  /.  winUnfetch  
23610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23620 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20      /* xUnfetch 
23630 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  */.};../*.** Thi
23640 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
23650 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
23660 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
23670 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
23680 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
23690 32 20 77 69 74 68 6f 75 74 20 70 65 72 66 6f 72  2 without perfor
236a0 6d 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 69 6e 67  ming any locking
236b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
236c0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
236d0 68 6f 64 73 20 77 69 6e 49 6f 4e 6f 6c 6f 63 6b  hods winIoNolock
236e0 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33 2c 20  Method = {.  3, 
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23710 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 77 69  iVersion */.  wi
23720 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  nClose,         
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23740 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77 69 6e   xClose */.  win
23750 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23770 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e 57 72  xRead */.  winWr
23780 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
23790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57             /* xW
237a0 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54 72 75  rite */.  winTru
237b0 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  ncate,          
237c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72            /* xTr
237d0 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69 6e 53  uncate */.  winS
237e0 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
237f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23800 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Sync */.  winFil
23810 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
23820 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
23830 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 4e  leSize */.  winN
23840 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  olockLock,      
23850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
23860 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c  Lock */.  winNol
23870 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
23880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
23890 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c  lock */.  winNol
238a0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
238b0 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
238c0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
238d0 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f 6e 74  */.  winFileCont
238e0 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
238f0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
23900 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53 65 63  trol */.  winSec
23910 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
23920 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65            /* xSe
23930 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20 77 69  ctorSize */.  wi
23940 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
23950 69 73 74 69 63 73 2c 20 20 20 20 20 20 20 2f 2a  istics,       /*
23960 20 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65   xDeviceCharacte
23970 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77 69 6e  ristics */.  win
23980 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20 20 20  ShmMap,         
23990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239a0 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77 69 6e  xShmMap */.  win
239b0 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ShmLock,        
239c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
239d0 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  xShmLock */.  wi
239e0 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  nShmBarrier,    
239f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23a00 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 0a   xShmBarrier */.
23a10 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c 20 20    winShmUnmap,  
23a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a30 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a    /* xShmUnmap *
23a40 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20 20 20  /.  winFetch,   
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a60 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f      /* xFetch */
23a70 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20 20 20  .  winUnfetch   
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a     /* xUnfetch *
23aa0 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e  /.};..static win
23ab0 56 66 73 41 70 70 44 61 74 61 20 77 69 6e 41 70  VfsAppData winAp
23ac0 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e  pData = {.  &win
23ad0 49 6f 4d 65 74 68 6f 64 2c 20 20 20 20 20 20 20  IoMethod,       
23ae0 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  /* pMethod */.  
23af0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
23b00 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
23b10 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
23b20 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c           /* bNoL
23b30 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  ock */.};..stati
23b40 63 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20  c winVfsAppData 
23b50 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61  winNolockAppData
23b60 20 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4e 6f 6c   = {.  &winIoNol
23b70 6f 63 6b 4d 65 74 68 6f 64 2c 20 2f 2a 20 70 4d  ockMethod, /* pM
23b80 65 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20  ethod */.  0,   
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23ba0 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
23bb0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
23bc0 20 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a      /* bNoLock *
23bd0 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.};../*********
23be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c20 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
23c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
23c50 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
23c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23c70 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
23c80 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
23c90 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
23ca0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
23cb0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
23cc0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 23  fs object..*/..#
23cd0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
23ce0 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43 6f 6e  WIN__)./*.** Con
23cf0 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d 65 20  vert a filename 
23d00 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20 74 68  from whatever th
23d10 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
23d20 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a 2a 2a  rating system.**
23d30 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20 66 69   supports for fi
23d40 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55 54 46  lenames into UTF
23d50 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  -8.  Space to ho
23d60 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  ld the result is
23d70 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  .** obtained fro
23d80 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
23d90 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
23da0 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
23db0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  on..*/.static ch
23dc0 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74 54 6f  ar *winConvertTo
23dd0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
23de0 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
23df0 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  me){.  char *zCo
23e00 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
23e10 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
23e20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
23e30 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
23e40 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
23e50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
23e60 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
23e70 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
23e80 72 74 65 64 20 3d 20 77 69 6e 4d 62 63 73 54 6f  rted = winMbcsTo
23e90 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  Utf8(zFilename, 
23ea0 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
23eb0 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  I());.  }.#endif
23ec0 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c  .  /* caller wil
23ed0 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20  l handle out of 
23ee0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75  memory */.  retu
23ef0 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d  rn zConverted;.}
23f00 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
23f10 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 66  onvert a UTF-8 f
23f20 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61  ilename into wha
23f30 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65 20 75  tever form the u
23f40 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65  nderlying.** ope
23f50 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 77 61  rating system wa
23f60 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e  nts filenames in
23f70 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
23f80 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69   the result.** i
23f90 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
23fa0 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20  malloc and must 
23fb0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
23fc0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
23fd0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
23fe0 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46  oid *winConvertF
23ff0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
24000 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
24010 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a  ename){.  void *
24020 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a  zConverted = 0;.
24030 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
24040 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64  {.    zConverted
24050 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
24060 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
24070 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
24080 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
24090 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f  .  else{.    zCo
240a0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66  nverted = winUtf
240b0 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e 61 6d  8ToMbcs(zFilenam
240c0 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  e, osAreFileApis
240d0 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e  ANSI());.  }.#en
240e0 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20  dif.  /* caller 
240f0 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20  will handle out 
24100 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72  of memory */.  r
24110 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64  eturn zConverted
24120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24130 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
24140 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
24150 20 73 70 65 63 69 66 69 65 64 20 55 54 46 2d 38   specified UTF-8
24160 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 0a 2a   string buffer.*
24170 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20 64 69  * ends with a di
24180 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f  rectory separato
24190 72 20 63 68 61 72 61 63 74 65 72 20 6f 72 20 6f  r character or o
241a0 6e 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  ne was successfu
241b0 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  lly.** added to 
241c0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
241d0 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69  t winMakeEndInDi
241e0 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c 20 63  rSep(int nBuf, c
241f0 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 69 66  har *zBuf){.  if
24200 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20 69 6e  ( zBuf ){.    in
24210 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33  t nLen = sqlite3
24220 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
24230 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30 20 29      if( nLen>0 )
24240 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69 6e 49  {.      if( winI
24250 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e 4c 65  sDirSep(zBuf[nLe
24260 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  n-1]) ){.       
24270 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
24280 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65 6e 2b   }else if( nLen+
24290 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20 20 20  1<nBuf ){.      
242a0 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d 20 77    zBuf[nLen] = w
242b0 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b 0a 20  inGetDirSep();. 
242c0 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
242d0 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  +1] = '\0';.    
242e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
242f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
24300 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
24310 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65  *.** Create a te
24320 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
24330 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  e and store the 
24340 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e 74 65  resulting pointe
24350 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a 2a 2a  r into pzBuf..**
24360 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
24370 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66 20 6d  urned in pzBuf m
24380 75 73 74 20 62 65 20 66 72 65 65 64 20 76 69 61  ust be freed via
24390 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
243a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
243b0 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71  inGetTempname(sq
243c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
243d0 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29 7b 0a   char **pzBuf){.
243e0 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a 43    static char zC
243f0 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
24400 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
24410 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
24420 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
24430 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
24440 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 73  0123456789";.  s
24450 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20 69 6e  ize_t i, j;.  in
24460 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74 65 33  t nPre = sqlite3
24470 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54 45 5f  Strlen30(SQLITE_
24480 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
24490 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c 20 6e  );.  int nMax, n
244a0 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65 6e 3b  Buf, nDir, nLen;
244b0 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a  .  char *zBuf;..
244c0 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
244d0 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
244e0 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
244f0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
24500 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
24510 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
24520 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
24530 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
24540 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
24550 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
24560 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  g..  */.  Simula
24570 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
24580 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
24590 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
245a0 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66   a temporary buf
245b0 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
245c0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
245d0 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20   file.  ** name 
245e0 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72  for the temporar
245f0 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68 69 73  y file.  If this
24600 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e 6e 6f   fails, we canno
24610 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 2a 2f  t continue..  */
24620 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73 2d 3e  .  nMax = pVfs->
24630 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42 75 66  mxPathname; nBuf
24640 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20 20 7a   = nMax + 2;.  z
24650 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Buf = sqlite3Mal
24660 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20 29 3b  locZero( nBuf );
24670 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29 7b 0a  .  if( !zBuf ){.
24680 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
24690 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
246a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
246b0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  M\n"));.    retu
246c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
246d0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
246e0 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
246f0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 74   the effective t
24700 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
24710 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63  ry.  First, chec
24720 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61  k if one.  ** ha
24730 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  s been explicitl
24740 79 20 73 65 74 20 62 79 20 74 68 65 20 61 70 70  y set by the app
24750 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77  lication; otherw
24760 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65  ise, use the one
24770 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
24780 20 62 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e   by the operatin
24790 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  g system..  */. 
247a0 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28   nDir = nMax - (
247b0 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73  nPre + 15);.  as
247c0 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a  sert( nDir>0 );.
247d0 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
247e0 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
247f0 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20      int nDirLen 
24800 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
24810 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  0(sqlite3_temp_d
24820 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69  irectory);.    i
24830 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a  f( nDirLen>0 ){.
24840 20 20 20 20 20 20 69 66 28 20 21 77 69 6e 49 73        if( !winIs
24850 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74  DirSep(sqlite3_t
24860 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44  emp_directory[nD
24870 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20  irLen-1]) ){.   
24880 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a       nDirLen++;.
24890 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
248a0 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29  ( nDirLen>nDir )
248b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
248c0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
248d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
248e0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
248f0 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
24900 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
24910 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
24920 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
24930 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31  "winGetTempname1
24940 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
24950 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
24960 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
24970 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
24980 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
24990 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64  .    }.  }.#if d
249a0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
249b0 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  _).  else{.    s
249c0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
249d0 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
249e0 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
249f0 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
24a00 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  R") */.       0,
24a10 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44   /* getenv("TMPD
24a20 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  IR") */.       0
24a30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50  , /* getenv("TMP
24a40 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
24a50 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22  /* getenv("TEMP"
24a60 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
24a70 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  * getenv("USERPR
24a80 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20  OFILE") */.     
24a90 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
24aa0 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
24ab0 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  .       "/tmp",.
24ac0 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20         ".",.    
24ad0 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
24ae0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
24af0 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73  /.    };.    uns
24b00 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
24b10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
24b20 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  r = 0;..    if( 
24b30 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44  !azDirs[0] ) azD
24b40 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28  irs[0] = getenv(
24b50 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
24b60 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
24b70 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
24b80 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
24b90 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  R");.    if( !az
24ba0 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73  Dirs[2] ) azDirs
24bb0 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [2] = getenv("TM
24bc0 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  P");.    if( !az
24bd0 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73  Dirs[3] ) azDirs
24be0 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45  [3] = getenv("TE
24bf0 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  MP");.    if( !a
24c00 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72  zDirs[4] ) azDir
24c10 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55  s[4] = getenv("U
24c20 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20  SERPROFILE");.  
24c30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
24c40 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
24c50 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
24c60 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
24c70 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43  {.      void *zC
24c80 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
24c90 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f  if( zDir==0 ) co
24ca0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a  ntinue;.      /*
24cb0 20 49 66 20 74 68 65 20 70 61 74 68 20 73 74 61   If the path sta
24cc0 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65  rts with a drive
24cd0 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64   letter followed
24ce0 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20   by the colon.  
24cf0 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72      ** character
24d00 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61  , assume it is a
24d10 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76 65 20  lready a native 
24d20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65  Win32 path; othe
24d30 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
24d40 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65  it must be conve
24d50 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65  rted to a native
24d60 20 57 69 6e 33 32 20 70 61 74 68 20 76 69 61 20   Win32 path via 
24d70 74 68 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20  the Cygwin API. 
24d80 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f       ** prior to
24d90 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20   using it..     
24da0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69   */.      if( wi
24db0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
24dc0 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a  dColon(zDir) ){.
24dd0 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
24de0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
24df0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
24e00 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69  zDir);.        i
24e10 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
24e20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
24e30 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24e40 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
24e50 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24e60 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24e70 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
24e80 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
24e90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24ea0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
24eb0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
24ec0 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
24ed0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
24ee0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
24ef0 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
24f00 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
24f10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24f20 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24f30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
24f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
24f60 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
24f80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c  zConverted = sql
24f90 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
24fa0 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20 20 20  nMax+1 );.      
24fb0 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65    if( !zConverte
24fc0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  d ){.          s
24fd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
24fe0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54  );.          OST
24ff0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
25000 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
25010 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
25020 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
25030 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
25040 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
25050 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
25060 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
25070 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h(.             
25080 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20 43 43     osIsNT() ? CC
25090 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57  P_POSIX_TO_WIN_W
250a0 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   : CCP_POSIX_TO_
250b0 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20 20 20  WIN_A, zDir,.   
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6f               zCo
250d0 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b 31 29  nverted, nMax+1)
250e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
250f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
25100 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
25110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25120 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
25130 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25140 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25150 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41  ITE_IOERR_CONVPA
25160 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  TH\n"));.       
25170 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
25180 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
25190 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44 57  RR_CONVPATH, (DW
251a0 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20 20  ORD)errno,.     
251b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251c0 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
251d0 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69 72 29  empname2", zDir)
251e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
251f0 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
25200 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
25210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
25220 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b  this point, we k
25230 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64 61 74  now the candidat
25240 65 20 64 69 72 65 63 74 6f 72 79 20 65 78 69 73  e directory exis
25250 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a 20 20  ts and should.  
25260 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 75 73          ** be us
25270 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 65  ed.  However, we
25280 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63 6f 6e   may need to con
25290 76 65 72 74 20 74 68 65 20 73 74 72 69 6e 67 20  vert the string 
252a0 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20 20  containing.     
252b0 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61 6d 65       ** its name
252c0 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69 2e 65   into UTF-8 (i.e
252d0 2e 20 69 66 20 69 74 20 69 73 20 55 54 46 2d 31  . if it is UTF-1
252e0 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 20 20  6 right now)..  
252f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
25300 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66 38       char *zUtf8
25310 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f 55   = winConvertToU
25320 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43 6f 6e  tf8Filename(zCon
25330 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
25340 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
25350 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
25360 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
25370 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
25380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25390 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20  zBuf);.         
253a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
253b0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
253c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
253d0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20  \n"));.         
253e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
253f0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25400 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
25410 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25420 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
25430 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
25440 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  8);.          sq
25450 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
25460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
25470 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
25480 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20  rted);.         
25490 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
254a0 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
254b0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
254c0 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d);.      }.    
254d0 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51 4c  }.  }.#elif !SQL
254e0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
254f0 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49  !defined(__CYGWI
25500 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  N__).  else if( 
25510 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
25520 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20 20  char *zMulti;.  
25530 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50 61    LPWSTR zWidePa
25540 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  th = sqlite3Mall
25550 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69 7a  ocZero( nMax*siz
25560 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20  eof(WCHAR) );.  
25570 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 74 68    if( !zWidePath
25580 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
25590 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
255a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
255b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
255c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
255d0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
255e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
255f0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
25600 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65    }.    if( osGe
25610 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61 78 2c  tTempPathW(nMax,
25620 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30 20 29   zWidePath)==0 )
25630 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
25640 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
25650 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
25660 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
25670 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
25680 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
25690 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
256a0 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
256b0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
256c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
256d0 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73  _GETTEMPPATH, os
256e0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74           "winGet
25710 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29 3b 0a  Tempname2", 0);.
25720 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c 74 69      }.    zMulti
25730 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
25740 74 66 38 28 7a 57 69 64 65 50 61 74 68 29 3b 0a  tf8(zWidePath);.
25750 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69 20 29      if( zMulti )
25760 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
25770 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
25780 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75 6c 74  Buf, "%s", zMult
25790 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  i);.      sqlite
257a0 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29 3b 0a  3_free(zMulti);.
257b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
257c0 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20  ee(zWidePath);. 
257d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
257e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
257f0 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
25800 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
25810 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
25820 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
25830 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
25840 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
25850 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25860 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25870 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  T;.    }.  }.#if
25880 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
25890 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
258a0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66  {.    char *zUtf
258b0 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 62  8;.    char *zMb
258c0 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33  csPath = sqlite3
258d0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78  MallocZero( nMax
258e0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 62   );.    if( !zMb
258f0 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20  csPath ){.      
25900 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
25910 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
25920 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25930 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
25940 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
25950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25960 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
25970 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
25980 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  ( osGetTempPathA
25990 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61 74 68  (nMax, zMbcsPath
259a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
259b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
259c0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
259d0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
259e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
259f0 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29  GETTEMPPATH\n"))
25a00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
25a10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
25a20 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
25a30 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
25a40 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
25a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a60 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 33  "winGetTempname3
25a70 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
25a80 20 7a 55 74 66 38 20 3d 20 77 69 6e 4d 62 63 73   zUtf8 = winMbcs
25a90 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61 74 68  ToUtf8(zMbcsPath
25aa0 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  , osAreFileApisA
25ab0 4e 53 49 28 29 29 3b 0a 20 20 20 20 69 66 28 20  NSI());.    if( 
25ac0 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 73  zUtf8 ){.      s
25ad0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
25ae0 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
25af0 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
25b00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
25b10 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  f8);.    }else{.
25b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25b30 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
25b40 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
25b50 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
25b60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22  E_IOERR_NOMEM\n"
25b70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
25b80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
25b90 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
25ba0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
25bb0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
25bc0 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a  NSI */.#endif /*
25bd0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
25be0 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  T */..  /*.  ** 
25bf0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
25c00 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  re the temporary
25c10 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64 73 20   directory ends 
25c20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70 72 69  with an appropri
25c30 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72 61 74  ate.  ** separat
25c40 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20  or.  If it does 
25c50 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20 69 73  not and there is
25c60 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70 61 63   not enough spac
25c70 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a 20 20  e left to add.  
25c80 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a 20 20  ** one, fail..  
25c90 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d 61 6b  */.  if( !winMak
25ca0 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e 44 69  eEndInDirSep(nDi
25cb0 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a 20 20  r+1, zBuf) ){.  
25cc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25cd0 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
25ce0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25cf0 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
25d00 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
25d10 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
25d20 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
25d30 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 34  "winGetTempname4
25d40 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ", 0);.  }..  /*
25d50 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68 61 74  .  ** Check that
25d60 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
25d70 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
25d80 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
25d90 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a 20 6e  rary file.  ** n
25da0 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ame in the follo
25db0 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20 20 2a  wing format:.  *
25dc0 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d 70 6f  *.  **   "<tempo
25dd0 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79 3e 2f  rary_directory>/
25de0 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58 58 58  etilqs_XXXXXXXXX
25df0 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20 2a 2a  XXXXXX\0\0".  **
25e00 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 72 65  .  ** If not, re
25e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
25e20 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20 31  R.  The number 1
25e30 37 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69  7 is used here i
25e40 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a 20  n order to.  ** 
25e50 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20  account for the 
25e60 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68  space used by th
25e70 65 20 31 35 20 63 68 61 72 61 63 74 65 72 20 72  e 15 character r
25e80 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61 6e 64  andom suffix and
25e90 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20 74 72   the.  ** two tr
25ea0 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61 72 61  ailing NUL chara
25eb0 63 74 65 72 73 2e 20 20 54 68 65 20 66 69 6e 61  cters.  The fina
25ec0 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65 70 61  l directory sepa
25ed0 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a  rator character.
25ee0 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
25ef0 20 61 64 64 65 64 20 69 66 20 69 74 20 77 61 73   added if it was
25f00 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70 72 65   not already pre
25f10 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4c 65  sent..  */.  nLe
25f20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
25f30 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69 66 28  n30(zBuf);.  if(
25f40 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20 2b 20   (nLen + nPre + 
25f50 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a 20 20  17) > nBuf ){.  
25f60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25f70 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  Buf);.    OSTRAC
25f80 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25f90 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f  E rc=SQLITE_ERRO
25fa0 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65 74 75  R\n"));.    retu
25fb0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
25fc0 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
25fd0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 35  "winGetTempname5
25fe0 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ", 0);.  }..  sq
25ff0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
26000 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a 42 75  Buf-16-nLen, zBu
26010 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45 5f 54  f+nLen, SQLITE_T
26020 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29  EMP_FILE_PREFIX)
26030 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74 65 33  ;..  j = sqlite3
26040 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
26050 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
26060 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a  ness(15, &zBuf[j
26070 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
26080 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  <15; i++, j++){.
26090 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
260a0 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
260b0 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
260c0 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
260d0 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d 0a 20  ars)-1) ];.  }. 
260e0 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zBuf[j] = 0;.  
260f0 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20  zBuf[j+1] = 0;. 
26100 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66 3b 0a   *pzBuf = zBuf;.
26110 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d  .  OSTRACE(("TEM
26120 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d 65 3d  P-FILENAME name=
26130 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %s, rc=SQLITE_OK
26140 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20 20 72  \n", zBuf));.  r
26150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
26160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
26170 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
26180 65 64 20 66 69 6c 65 20 69 73 20 72 65 61 6c 6c  ed file is reall
26190 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e 20 20  y a directory.  
261a0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 0a  Return false if.
261b0 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74 68 69  ** it is somethi
261c0 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20  ng other than a 
261d0 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20 69 66  directory, or if
261e0 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69   there is any ki
261f0 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  nd of memory.** 
26200 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75  allocation failu
26210 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
26220 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74  t winIsDir(const
26230 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
26240 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  d){.  DWORD attr
26250 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
26260 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
26270 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54  o;..  if( osIsNT
26280 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
26290 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
262a0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
262b0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
262c0 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
262d0 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
262e0 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
262f0 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
26300 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
26310 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
26320 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26340 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
26350 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
26360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26370 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
26380 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
26390 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
263a0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
263b0 0a 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a  .    if( !rc ){.
263c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
263d0 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d 65 3f  /* Invalid name?
263e0 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 61 74   */.    }.    at
263f0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
26400 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
26410 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
26420 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73 65 7b  INCE==0.  }else{
26430 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
26440 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
26450 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
26460 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  ed);.#endif.  }.
26470 20 20 72 65 74 75 72 6e 20 28 61 74 74 72 21 3d    return (attr!=
26480 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
26490 52 49 42 55 54 45 53 29 20 26 26 20 28 61 74 74  RIBUTES) && (att
264a0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
264b0 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d 0a 0a  _DIRECTORY);.}..
264c0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c  /*.** Open a fil
264d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
264e0 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69   winOpen(.  sqli
264f0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
26500 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
26510 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74   get maximum pat
26520 68 20 6c 65 6e 67 74 68 20 61 6e 64 20 41 70 70  h length and App
26530 44 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  Data */.  const 
26540 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
26550 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
26560 68 65 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20  he file (UTF-8) 
26570 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
26580 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f  e *id,         /
26590 2a 20 57 72 69 74 65 20 74 68 65 20 53 51 4c 69  * Write the SQLi
265a0 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68  te file handle h
265b0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
265c0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
265d0 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20     /* Open mode 
265e0 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  flags */.  int *
265f0 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20 20 20  pOutFlags       
26600 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72       /* Status r
26610 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29  eturn flags */.)
26620 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20  {.  HANDLE h;.  
26630 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
26640 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44  = 0;.  DWORD dwD
26650 65 73 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20  esiredAccess;.  
26660 44 57 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64  DWORD dwShareMod
26670 65 3b 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65  e;.  DWORD dwCre
26680 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
26690 3b 0a 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67  ;.  DWORD dwFlag
266a0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
266b0 20 30 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   0;.#if SQLITE_O
266c0 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73  S_WINCE.  int is
266d0 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Temp = 0;.#endif
266e0 0a 20 20 77 69 6e 56 66 73 41 70 70 44 61 74 61  .  winVfsAppData
266f0 20 2a 70 41 70 70 44 61 74 61 3b 0a 20 20 77 69   *pAppData;.  wi
26700 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
26710 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
26720 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26740 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
26750 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
26760 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
26770 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
26780 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
26790 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
267a0 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
267b0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
267c0 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
267d0 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
267e0 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
267f0 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
26800 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
26810 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
26820 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
26830 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
26840 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
26850 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
26860 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
26870 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
26880 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
26890 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
268a0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
268b0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
268c0 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
268d0 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
268e0 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
268f0 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
26900 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
26910 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
26920 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
26930 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
26940 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
26950 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
26960 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
26970 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
26980 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
26990 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
269a0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
269b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
269c0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
269d0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
269e0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
269f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
26a00 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
26a10 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
26a20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
26a30 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
26a40 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
26a50 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
26a60 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
26a70 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
26a80 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
26a90 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
26aa0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
26ab0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
26ac0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
26ad0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
26ae0 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
26af0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
26b00 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
26b10 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
26b20 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
26b30 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
26b40 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
26b50 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
26b60 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
26b70 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
26b80 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
26b90 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
26ba0 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
26bb0 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
26bc0 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
26bd0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
26be0 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
26bf0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
26c00 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
26c10 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
26c20 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
26c30 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
26c40 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
26c50 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
26c60 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
26c70 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
26c80 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
26c90 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
26ca0 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
26cb0 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
26cc0 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
26cd0 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
26ce0 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
26cf0 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
26d00 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
26d10 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
26d20 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
26d30 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
26d40 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
26d50 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
26d60 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
26d70 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
26d80 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
26d90 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
26da0 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  ver.  ** automat
26db0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
26dc0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
26dd0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
26de0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
26df0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
26e00 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
26e10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26e20 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
26e30 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
26e40 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
26e50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
26e60 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
26e70 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
26e80 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
26e90 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
26ea0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
26eb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
26ec0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
26ed0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
26ee0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
26ef0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
26f00 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
26f10 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
26f20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
26f30 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
26f40 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
26f50 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
26f60 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
26f70 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
26f80 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  B.       || eTyp
26f90 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
26fa0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
26fb0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26fc0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20  N_TEMP_JOURNAL. 
26fd0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
26fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
26ff0 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
27000 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
27010 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20  ASTER_JOURNAL.  
27020 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
27030 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
27040 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
27050 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
27060 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
27070 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
27080 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
27090 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
270a0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
270b0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
270c0 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
270d0 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
270e0 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21   !zUtf8Name && !
270f0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
27100 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
27110 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
27120 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20  _ERROR,.        
27130 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  "sqlite3_temp_di
27140 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65  rectory variable
27150 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66   should be set f
27160 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a  or WinRT");.  }.
27170 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
27180 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
27190 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
271a0 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
271b0 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65  nerate a.  ** te
271c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
271d0 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
271e0 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
271f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  {.    assert( is
27200 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
27210 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
27220 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
27230 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e  ame(pVfs, &zTmpn
27240 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
27250 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
27260 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
27270 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
27280 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
27290 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
272a0 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
272b0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
272c0 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
272d0 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
272e0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
272f0 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
27300 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
27310 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
27320 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
27330 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
27340 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
27350 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
27360 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
27370 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
27380 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
27390 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
273a0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
273b0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
273c0 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
273d0 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
273e0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
273f0 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
27400 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
27410 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
27420 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
27430 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
27440 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
27450 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
27460 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
27470 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
27480 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
27490 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
274a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
274b0 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
274c0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
274d0 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
274e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
274f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
27500 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77  PT;.  }..  if( w
27510 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
27520 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ed) ){.    sqlit
27530 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
27540 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
27550 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
27560 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
27570 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
27580 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
27590 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d  ISDIR", zUtf8Nam
275a0 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
275b0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
275c0 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ISDIR;.  }..  if
275d0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
275e0 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
275f0 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
27600 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
27610 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
27620 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
27630 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
27640 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49  ;.  }..  /* SQLI
27650 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
27660 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  E is used to mak
27670 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65  e sure that a ne
27680 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63  w file is.  ** c
27690 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
276a0 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
276b0 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
276c0 73 69 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a  sive access".  *
276d0 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
276e0 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
276f0 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
27700 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
27710 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
27720 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
27730 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
27740 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
27750 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
27760 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
27770 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
27780 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
27790 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
277a0 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
277b0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
277c0 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
277d0 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
277e0 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
277f0 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
27800 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
27810 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
27820 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
27830 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
27840 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
27850 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
27860 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
27870 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
27880 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
27890 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
278a0 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
278b0 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
278c0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
278d0 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
278e0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
278f0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
27900 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
27910 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
27920 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
27930 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
27940 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
27950 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
27960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27970 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
27980 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
27990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279a0 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
279b0 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
279c0 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
279d0 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
279e0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
279f0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
27a00 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
27a10 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
27a20 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
27a30 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
27a40 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
27a50 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
27a60 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
27a70 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
27a80 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
27a90 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
27aa0 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
27ab0 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
27ac0 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
27ad0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
27ae0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
27af0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
27b00 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f      CREATEFILE2_
27b10 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
27b20 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61  ERS extendedPara
27b30 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65  meters;.    exte
27b40 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
27b50 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43  wSize = sizeof(C
27b60 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
27b70 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b  DED_PARAMETERS);
27b80 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
27b90 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74  ameters.dwFileAt
27ba0 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20  tributes =.     
27bb0 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
27bc0 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
27bd0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
27be0 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
27bf0 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
27c00 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41  Flags = dwFlagsA
27c10 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
27c20 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20  ILE_FLAG_MASK;. 
27c30 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
27c40 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79  eters.dwSecurity
27c50 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52  QosFlags = SECUR
27c60 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20  ITY_ANONYMOUS;. 
27c70 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
27c80 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79  eters.lpSecurity
27c90 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c  Attributes = NUL
27ca0 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  L;.    extendedP
27cb0 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c  arameters.hTempl
27cc0 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  ateFile = NULL;.
27cd0 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
27ce0 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c  osCreateFile2((L
27cf0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
27d00 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
27d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d50 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d70 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
27d80 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
27d90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27db0 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74  &extendedParamet
27dc0 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ers))==INVALID_H
27dd0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
27e00 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
27e10 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
27e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27e30 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
27e40 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
27e50 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
27e60 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
27e70 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
27e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e90 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
27ea0 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
27eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ec0 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
27ed0 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
27f00 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
27f30 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
27f40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
27f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f60 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
27f70 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
27fa0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
27fb0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
27fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27fd0 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
27fe0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
27ff0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
28000 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
28010 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
28020 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
28030 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
28040 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
28070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
280a0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280c0 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
280d0 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
280e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280f0 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
28100 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
28110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28120 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
28130 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
28140 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
28170 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
28180 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
28190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
281a0 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  p */.    }.  }.#
281b0 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f  endif.  winLogIo
281c0 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
281d0 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  _);..  OSTRACE((
281e0 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
281f0 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
28200 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
28210 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
28220 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
28230 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
28240 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
28250 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
28260 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
28270 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
28280 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
28290 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
282a0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
282b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
282c0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
282d0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
282e0 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
282f0 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
28300 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
28310 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28320 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
28330 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
28340 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
28350 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
28360 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
28370 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20   zName, id,.    
28380 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
28390 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
283a0 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20  Y) &.           
283b0 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49            ~(SQLI
283c0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
283d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
283e0 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20  RITE)),.        
283f0 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
28400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
28410 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
28420 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
28430 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
28440 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
28450 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
28460 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
28470 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
28480 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
28490 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
284a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
284b0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
284c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41    }.  }..  OSTRA
284d0 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
284e0 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
284f0 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67  ss=%lx, pOutFlag
28500 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73  s=%p, *pOutFlags
28510 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
28520 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20    "rc=%s\n", h, 
28530 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73  zUtf8Name, dwDes
28540 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74  iredAccess, pOut
28550 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  Flags, pOutFlags
28560 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70   ?.           *p
28570 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68  OutFlags : 0, (h
28580 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
28590 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
285a0 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20  d" : "ok"));..  
285b0 70 41 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56  pAppData = (winV
285c0 66 73 41 70 70 44 61 74 61 2a 29 70 56 66 73 2d  fsAppData*)pVfs-
285d0 3e 70 41 70 70 44 61 74 61 3b 0a 0a 23 69 66 20  >pAppData;..#if 
285e0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
285f0 20 20 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65    {.    if( isRe
28600 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65  adWrite && eType
28610 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
28620 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 20 20 26  IN_DB.         &
28630 26 20 28 28 70 41 70 70 44 61 74 61 3d 3d 4e 55  & ((pAppData==NU
28640 4c 4c 29 20 7c 7c 20 21 70 41 70 70 44 61 74 61  LL) || !pAppData
28650 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20  ->bNoLock).     
28660 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e      && (rc = win
28670 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61  ceCreateLock(zNa
28680 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c  me, pFile))!=SQL
28690 49 54 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20  ITE_OK.    ){.  
286a0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
286b0 65 28 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e(h);.      sqli
286c0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
286d0 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
286e0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
286f0 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
28700 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b  E(("OPEN-CE-LOCK
28710 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c   name=%s, rc=%s\
28720 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74  n", zName, sqlit
28730 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
28740 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
28750 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
28760 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20  ( isTemp ){.    
28770 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
28780 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74  Close = zConvert
28790 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ed;.  }else.#end
287a0 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74  if.  {.    sqlit
287b0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
287c0 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  ed);.  }..  sqli
287d0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
287e0 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65  e);.  pFile->pMe
287f0 74 68 6f 64 20 3d 20 70 41 70 70 44 61 74 61 20  thod = pAppData 
28800 3f 20 70 41 70 70 44 61 74 61 2d 3e 70 4d 65 74  ? pAppData->pMet
28810 68 6f 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68  hod : &winIoMeth
28820 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66  od;.  pFile->pVf
28830 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c  s = pVfs;.  pFil
28840 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20  e->h = h;.  if( 
28850 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
28860 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
28870 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44  gs |= WINFILE_RD
28880 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
28890 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
288a0 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77  ean(zName, "psow
288b0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
288c0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
288d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
288e0 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
288f0 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46  E_PSOW;.  }.  pF
28900 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
28910 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69   NO_ERROR;.  pFi
28920 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d  le->zPath = zNam
28930 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  e;.#if SQLITE_MA
28940 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
28950 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55  pFile->hMap = NU
28960 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61  LL;.  pFile->pMa
28970 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70  pRegion = 0;.  p
28980 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
28990 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
289a0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
289b0 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
289c0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
289d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
289e0 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70  ap;.#endif..  Op
289f0 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
28a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
28a10 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
28a20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  named file..**.*
28a30 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64  * Note that Wind
28a40 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  ows does not all
28a50 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20  ow a file to be 
28a60 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20  deleted if some 
28a70 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73  other.** process
28a80 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53   has it open.  S
28a90 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73  ometimes a virus
28aa0 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65   scanner or inde
28ab0 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20  xing program.** 
28ac0 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72  will open a jour
28ad0 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79  nal file shortly
28ae0 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65   after it is cre
28af0 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  ated in order to
28b00 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20   do.** whatever 
28b10 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20  it does.  While 
28b20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65  this other proce
28b30 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
28b40 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20  e.** file open, 
28b50 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c  we will be unabl
28b60 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20  e to delete it. 
28b70 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
28b80 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c  this.** problem,
28b90 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69   we delay 100 mi
28ba0 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74  lliseconds and t
28bb0 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61  ry to delete aga
28bc0 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58  in.  Up.** to MX
28bd0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
28be0 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65  Ts deletion atte
28bf0 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66  mpts are run bef
28c00 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70  ore giving.** up
28c10 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
28c20 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
28c30 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
28c40 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
28c50 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
28c60 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
28c70 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
28c80 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
28c90 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
28ca0 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
28cb0 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72  */.  int syncDir
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
28ce0 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e  win32 */.){.  in
28cf0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  t cnt = 0;.  int
28d00 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74   rc;.  DWORD att
28d10 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  r;.  DWORD lastE
28d20 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
28d30 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
28d40 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
28d50 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44  (pVfs);.  UNUSED
28d60 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44  _PARAMETER(syncD
28d70 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  ir);..  Simulate
28d80 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
28d90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
28da0 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  TE);.  OSTRACE((
28db0 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
28dc0 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20   syncDir=%d\n", 
28dd0 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44  zFilename, syncD
28de0 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ir));..  zConver
28df0 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
28e00 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
28e10 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
28e20 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
28e30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
28e40 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
28e50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
28e60 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
28e70 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
28e80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
28e90 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
28ea0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
28eb0 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20  ){.    do {.#if 
28ec0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
28ed0 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45        WIN32_FILE
28ee0 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20  _ATTRIBUTE_DATA 
28ef0 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20  sAttrData;.     
28f00 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61   memset(&sAttrDa
28f10 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41  ta, 0, sizeof(sA
28f20 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20  ttrData));.     
28f30 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41   if ( osGetFileA
28f40 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f  ttributesExW(zCo
28f50 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65  nverted, GetFile
28f60 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b    &sAttrData) ){
28fa0 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
28fb0 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65  sAttrData.dwFile
28fc0 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20  Attributes;.    
28fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28fe0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
28ff0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
29000 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
29010 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
29020 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
29030 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
29040 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
29050 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
29060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29070 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
29080 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
29090 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
290a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
290b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
290c0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
290d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
290e0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
290f0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
29100 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f  eAttributesW(zCo
29110 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
29120 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72  .      if ( attr
29130 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  ==INVALID_FILE_A
29140 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20  TTRIBUTES ){.   
29150 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
29160 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
29170 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
29180 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
29190 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
291a0 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
291b0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
291c0 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
291d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
291e0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
291f0 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
29200 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
29210 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29220 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29230 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
29240 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
29250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29260 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54  f ( attr&FILE_AT
29270 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52  TRIBUTE_DIRECTOR
29280 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  Y ){.        rc 
29290 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
292a0 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a  /* Files only. *
292b0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
292c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
292d0 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65  f ( osDeleteFile
292e0 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  W(zConverted) ){
292f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29300 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65  LITE_OK; /* Dele
29310 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20  ted OK. */.     
29320 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
29330 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69  }.      if ( !wi
29340 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
29350 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
29360 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
29370 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e  LITE_ERROR; /* N
29380 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20  o more retries. 
29390 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
293a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
293b0 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69  while(1);.  }.#i
293c0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
293d0 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
293e0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
293f0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
29400 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43  leAttributesA(zC
29410 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
29420 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41   if ( attr==INVA
29430 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
29440 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  TES ){.        l
29450 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
29460 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
29470 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
29480 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no==ERROR_FILE_N
29490 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20  OT_FOUND.       
294a0 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d    || lastErrno==
294b0 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46  ERROR_PATH_NOT_F
294c0 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OUND ){.        
294d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
294e0 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
294f0 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e  ; /* Already gon
29500 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  e? */.        }e
29510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
29520 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
29530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
29540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
29550 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74   }.      if ( at
29560 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54  tr&FILE_ATTRIBUT
29570 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20  E_DIRECTORY ){. 
29580 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29590 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c  TE_ERROR; /* Fil
295a0 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20  es only. */.    
295b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
295c0 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73   }.      if ( os
295d0 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e  DeleteFileA(zCon
295e0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
295f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29600 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b  K; /* Deleted OK
29610 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  . */.        bre
29620 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
29630 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79    if ( !winRetry
29640 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
29650 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
29660 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
29670 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65  RROR; /* No more
29680 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20   retries. */.   
29690 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
296a0 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
296b0 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  1);.  }.#endif. 
296c0 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53   if( rc && rc!=S
296d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
296e0 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  TE_NOENT ){.    
296f0 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
29700 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
29710 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  LETE, lastErrno,
29720 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46   "winDelete", zF
29730 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73  ilename);.  }els
29740 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  e{.    winLogIoe
29750 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
29760 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
29770 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29780 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
29790 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72  ELETE name=%s, r
297a0 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  c=%s\n", zFilena
297b0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
297c0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
297d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
297e0 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65  Check the existe
297f0 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f  nce and status o
29800 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  f a file..*/.sta
29810 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73  tic int winAcces
29820 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  s(.  sqlite3_vfs
29830 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
29840 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
29850 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in32 */.  const 
29860 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
29870 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29880 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
29890 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
298b0 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f   Type of test to
298c0 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69   make on this fi
298d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  le */.  int *pRe
298e0 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  sOut            
298f0 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c     /* OUT: Resul
29900 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20  t */.){.  DWORD 
29910 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  attr;.  int rc =
29920 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   0;.  DWORD last
29930 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
29940 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
29950 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29960 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75  R(pVfs);..  Simu
29970 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
29980 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
29990 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53  _ACCESS; );.  OS
299a0 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
299b0 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78  ame=%s, flags=%x
299c0 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c  , pResOut=%p\n",
299d0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  .           zFil
299e0 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52  ename, flags, pR
299f0 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e  esOut));..  zCon
29a00 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76  verted = winConv
29a10 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e  ertFromUtf8Filen
29a20 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
29a30 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
29a40 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
29a50 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
29a60 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%s, rc=SQLITE_I
29a70 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a  OERR_NOMEM\n", z
29a80 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20  Filename));.    
29a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
29aa0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
29ab0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
29ac0 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  () ){.    int cn
29ad0 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32  t = 0;.    WIN32
29ae0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
29af0 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
29b00 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74      memset(&sAtt
29b10 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66  rData, 0, sizeof
29b20 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20  (sAttrData));.  
29b30 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20    while( !(rc = 
29b40 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
29b50 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29  tesExW((LPCWSTR)
29b60 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65           GetFile
29b90 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a  ExInfoStandard,.
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41               &sA
29bc0 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e  ttrData)) && win
29bd0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
29be0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d   &lastErrno) ){}
29bf0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
29c00 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53       /* For an S
29c10 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
29c20 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74  STS query, treat
29c30 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
29c40 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  ile.      ** as 
29c50 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65  if it does not e
29c60 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  xist..      */. 
29c70 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67       if(    flag
29c80 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
29c90 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20  _EXISTS.        
29ca0 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
29cb0 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a  FileSizeHigh==0.
29cc0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
29cd0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
29ce0 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Low==0 ){.      
29cf0 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44    attr = INVALID
29d00 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
29d10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29d20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41         attr = sA
29d30 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74  ttrData.dwFileAt
29d40 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20  tributes;.      
29d50 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
29d60 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
29d70 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  nt, __LINE__);. 
29d80 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
29d90 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e  no!=ERROR_FILE_N
29da0 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74  OT_FOUND && last
29db0 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54  Errno!=ERROR_PAT
29dc0 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
29dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
29de0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
29df0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
29e00 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
29e10 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c  TE_IOERR_ACCESS,
29e20 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e   lastErrno, "win
29e30 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20  Access",.       
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a      zFilename);.
29e60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
29e70 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41       attr = INVA
29e80 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
29e90 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  TES;.      }.   
29ea0 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
29eb0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
29ec0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
29ed0 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
29ee0 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61  AttributesA((cha
29ef0 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  r*)zConverted);.
29f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
29f10 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29f20 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28  rted);.  switch(
29f30 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
29f40 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
29f50 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20  _READ:.    case 
29f60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
29f70 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d  ISTS:.      rc =
29f80 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
29f90 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a  ILE_ATTRIBUTES;.
29fa0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
29fb0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43   case SQLITE_ACC
29fc0 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20  ESS_READWRITE:. 
29fd0 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d       rc = attr!=
29fe0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
29ff0 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20  RIBUTES &&.     
2a000 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20          (attr & 
2a010 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52  FILE_ATTRIBUTE_R
2a020 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20  EADONLY)==0;.   
2a030 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
2a040 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
2a050 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c  ert(!"Invalid fl
2a060 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a  ags argument");.
2a070 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
2a080 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28   rc;.  OSTRACE((
2a090 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
2a0a0 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52   pResOut=%p, *pR
2a0b0 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c  esOut=%d, rc=SQL
2a0c0 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
2a0d0 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c        zFilename,
2a0e0 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f   pResOut, *pResO
2a0f0 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ut));.  return S
2a100 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2a110 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2a120 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2a130 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73  fied path name s
2a140 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
2a150 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c  ve letter.** fol
2a160 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e  lowed by a colon
2a170 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
2a180 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
2a190 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f  DriveLetterAndCo
2a1a0 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  lon(.  const cha
2a1b0 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a  r *zPathname.){.
2a1c0 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74    return ( sqlit
2a1d0 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e  e3Isalpha(zPathn
2a1e0 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68  ame[0]) && zPath
2a1f0 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a  name[1]==':' );.
2a200 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  }../*.** Returns
2a210 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
2a220 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20   specified path 
2a230 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75  name should be u
2a240 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49  sed verbatim.  I
2a250 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  f.** non-zero is
2a260 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74   returned from t
2a270 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  his function, th
2a280 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
2a290 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a  on must simply.*
2a2a0 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64  * use the provid
2a2b0 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72  ed path name ver
2a2c0 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c  batim -OR- resol
2a2d0 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c  ve it into a ful
2a2e0 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75  l path name.** u
2a2f0 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c  sing the GetFull
2a300 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41  PathName Win32 A
2a310 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20  PI function (if 
2a320 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73  available)..*/.s
2a330 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73  tatic BOOL winIs
2a340 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
2a350 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2a360 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f  zPathname.){.  /
2a370 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
2a380 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
2a390 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c  ith a forward sl
2a3a0 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61  ash or a backsla
2a3b0 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72  sh, it is either
2a3c0 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e  .  ** a legal UN
2a3d0 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65  C name, a volume
2a3e0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20   relative path, 
2a3f0 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  or an absolute p
2a400 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a  ath name in the.
2a410 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d    ** "Unix" form
2a420 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20  at on Windows.  
2a430 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79  There is no easy
2a440 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e   way to differen
2a450 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20  tiate between.  
2a460 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f  ** the final two
2a470 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72   cases; therefor
2a480 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65  e, we return the
2a490 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61   safer return va
2a4a0 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a  lue of TRUE.  **
2a4b0 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73   so that callers
2a4c0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a4d0 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73  n will simply us
2a4e0 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20  e it verbatim.. 
2a4f0 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73   */.  if ( winIs
2a500 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65  DirSep(zPathname
2a510 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75  [0]) ){.    retu
2a520 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20  rn TRUE;.  }..  
2a530 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
2a540 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
2a550 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e  with a letter an
2a560 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20  d a colon it is 
2a570 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a  either a volume.
2a580 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61    ** relative pa
2a590 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74  th or an absolut
2a5a0 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73  e path.  Callers
2a5b0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
2a5c0 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20  n must not.  ** 
2a5d0 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74  attempt to treat
2a5e0 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76   it as a relativ
2a5f0 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65  e path name (i.e
2a600 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69  . they should si
2a610 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74  mply use.  ** it
2a620 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f   verbatim)..  */
2a630 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69  .  if ( winIsDri
2a640 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
2a650 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20  (zPathname) ){. 
2a660 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
2a670 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
2a680 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73  f we get to this
2a690 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68   point, the path
2a6a0 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d   name should alm
2a6b0 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65  ost certainly be
2a6c0 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72   a purely.  ** r
2a6d0 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65  elative one (i.e
2a6e0 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65  . not a UNC name
2a6f0 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20  , not absolute, 
2a700 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72  and not volume r
2a710 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20  elative)..  */. 
2a720 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d   return FALSE;.}
2a730 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
2a740 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
2a750 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
2a760 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68  hname.  Write th
2a770 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61  e full.** pathna
2a780 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20  me into zOut[]. 
2a790 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20   zOut[] will be 
2a7a0 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d  at least pVfs->m
2a7b0 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74  xPathname.** byt
2a7c0 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
2a7d0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c  tatic int winFul
2a7e0 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c  lPathname(.  sql
2a7f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2a810 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
2a820 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ect */.  const c
2a830 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20  har *zRelative, 
2a840 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62         /* Possib
2a850 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75  ly relative inpu
2a860 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20  t path */.  int 
2a870 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nFull,          
2a880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2a890 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66  e of output buff
2a8a0 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  er in bytes */. 
2a8b0 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20   char *zFull    
2a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a8d0 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
2a8e0 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54  */.){.#if !SQLIT
2a8f0 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2a900 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2a910 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2a920 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e  WIN__).  DWORD n
2a930 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
2a940 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
2a950 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a   *zOut;.#endif..
2a960 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74    /* If this pat
2a970 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69  h name begins wi
2a980 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20  th "/X:", where 
2a990 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61  "X" is any alpha
2a9a0 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61  betic.  ** chara
2a9b0 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68  cter, discard th
2a9c0 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72  e initial "/" fr
2a9d0 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e  om the pathname.
2a9e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c  .  */.  if( zRel
2a9f0 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26  ative[0]=='/' &&
2aa00 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65   winIsDriveLette
2aa10 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74  rAndColon(zRelat
2aa20 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52  ive+1) ){.    zR
2aa30 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a  elative++;.  }..
2aa40 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
2aa50 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
2aa60 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2aa70 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
2aa80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2aa90 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61  ETER(nFull);.  a
2aaa0 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56  ssert( nFull>=pV
2aab0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29  fs->mxPathname )
2aac0 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33  ;.  if ( sqlite3
2aad0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2aae0 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69  && !winIsVerbati
2aaf0 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74  mPathname(zRelat
2ab00 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20  ive) ){.    /*. 
2ab10 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61     ** NOTE: We a
2ab20 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2ab30 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20  a relative path 
2ab40 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74  name and the dat
2ab50 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64  a.    **       d
2ab60 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2ab70 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72  n set.  Therefor
2ab80 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65  e, use it as the
2ab90 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20   basis.    **   
2aba0 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69      for converti
2abb0 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20  ng the relative 
2abc0 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20  path name to an 
2abd0 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20  absolute.    ** 
2abe0 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65        one by pre
2abf0 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61  pending the data
2ac00 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61   directory and a
2ac10 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   slash..    */. 
2ac20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
2ac30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2ac40 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
2ac50 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
2ac60 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
2ac70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2ac80 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2ac90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
2aca0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49              (osI
2acc0 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
2acd0 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
2ace0 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29  _POSIX_TO_WIN_A)
2acf0 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43   |.            C
2ad00 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65  CP_RELATIVE, zRe
2ad10 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
2ad20 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2ad30 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
2ad40 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2ad50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
2ad60 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2ad70 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
2ad80 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
2ad90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ada0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2adb0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
2adc0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2add0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
2ade0 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
2adf0 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
2ae00 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
2ae10 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
2ae20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ae30 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
2ae40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ae50 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2ae60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ae70 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2ae80 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2ae90 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2aea0 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
2aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aec0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
2aed0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77  ata_directory, w
2aee0 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a  inGetDirSep(), z
2aef0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
2af00 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29  ite3_free(zUtf8)
2af10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2af20 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2af30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  }.  }else{.    c
2af40 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69  har *zOut = sqli
2af50 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70  te3MallocZero( p
2af60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2af70 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f  1 );.    if( !zO
2af80 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ut ){.      retu
2af90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2afa0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2afb0 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
2afc0 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
2afd0 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
2afe0 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
2aff0 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
2b000 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
2b010 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
2b020 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
2b030 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
2b040 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2b050 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
2b060 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2b070 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2b080 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
2b090 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0b0 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2b0c0 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
2b0d0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
2b0e0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
2b0f0 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
2b100 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
2b110 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
2b120 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
2b130 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b140 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
2b150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2b160 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2b170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
2b180 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2b190 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2b1a0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2b1b0 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b  l, "%s", zUtf8);
2b1c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2b1d0 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20  ree(zUtf8);.    
2b1e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b1f0 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Out);.    }.  }.
2b200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2b210 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
2b220 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  (SQLITE_OS_WINCE
2b230 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
2b240 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  NRT) && !defined
2b250 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
2b260 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2b270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2b280 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43  ROR );.  /* WinC
2b290 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74  E has no concept
2b2a0 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70   of a relative p
2b2b0 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49  athname, or so I
2b2c0 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f   am told. */.  /
2b2d0 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77  * WinRT has no w
2b2e0 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20  ay to convert a 
2b2f0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f  relative path to
2b300 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65   an absolute one
2b310 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69  . */.  if ( sqli
2b320 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2b330 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
2b340 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
2b350 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
2b360 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
2b370 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2b380 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
2b390 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
2b3a0 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
2b3b0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
2b3c0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
2b3d0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
2b3e0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
2b3f0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
2b400 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
2b410 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
2b420 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
2b430 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
2b440 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
2b450 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
2b460 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20  d a backslash.. 
2b470 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
2b480 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e  3_snprintf(MIN(n
2b490 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61  Full, pVfs->mxPa
2b4a0 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20  thname), zFull, 
2b4b0 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20  "%s%c%s",.      
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2b4d0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
2b4e0 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72  ctory, winGetDir
2b4f0 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65  Sep(), zRelative
2b500 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2b510 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b520 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2b530 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2b540 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c  Full, "%s", zRel
2b550 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65  ative);.  }.  re
2b560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b570 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
2b580 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2b590 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2b5a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43   && !defined(__C
2b5b0 59 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74  YGWIN__).  /* It
2b5c0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2b5d0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2b5e0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2b5f0 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2b600 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2b610 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2b620 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2b630 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2b640 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2b650 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
2b660 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
2b670 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
2b680 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
2b690 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
2b6a0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2b6b0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
2b6c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2b6d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2b6e0 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
2b6f0 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
2b700 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
2b710 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
2b720 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
2b730 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
2b740 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
2b750 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
2b760 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
2b770 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
2b780 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
2b790 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
2b7a0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
2b7b0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
2b7c0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
2b7d0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
2b7e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2b7f0 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
2b800 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
2b810 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
2b820 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
2b830 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
2b840 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
2b850 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b860 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2b870 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2b880 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
2b8b0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
2b8c0 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
2b8d0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
2b8e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2b8f0 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
2b900 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2b910 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
2b920 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
2b930 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
2b940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b950 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2b960 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
2b970 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  IsNT() ){.    LP
2b980 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
2b990 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2b9a0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2b9b0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2b9c0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2b9d0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2b9e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b9f0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2ba00 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2ba10 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2ba20 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2ba30 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2ba40 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2ba60 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
2ba70 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2ba80 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2ba90 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2baa0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2bab0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2bac0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2bad0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2bae0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2baf0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2bb00 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bb10 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2bb20 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2bb30 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2bb40 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
2bb50 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
2bb60 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
2bb70 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
2bb80 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2bb90 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2bba0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
2bbb0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2bbc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2bbd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bbe0 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
2bbf0 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
2bc00 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
2bc20 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
2bc30 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2bc40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2bc50 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2bc60 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
2bc70 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
2bc80 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
2bc90 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2bca0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2bcb0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2bcc0 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
2bcd0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
2bce0 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2bcf0 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
2bd00 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
2bd10 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
2bd20 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
2bd30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2bd40 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2bd50 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2bd60 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2bd70 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2bd80 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2bd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bda0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2bdb0 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
2bdc0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2bdd0 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
2bde0 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
2bdf0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
2be00 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
2be10 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
2be20 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
2be30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2be40 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2be50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2be60 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2be70 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2be80 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2be90 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2bea0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
2beb0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
2bec0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2bed0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bee0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2bef0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2bf00 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
2bf10 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2bf20 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2bf30 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2bf40 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2bf70 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61  athname4", zRela
2bf80 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2bf90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2bfa0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
2bfb0 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  Out = winMbcsToU
2bfc0 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65  tf8(zTemp, osAre
2bfd0 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
2bfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2bff0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
2c000 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
2c010 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2c020 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2c030 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2c040 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2c050 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
2c060 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2c070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2c080 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2c090 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c0a0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2c0b0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2c0c0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2c0d0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2c0e0 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
2c0f0 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
2c100 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
2c110 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
2c120 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
2c130 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
2c140 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
2c150 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
2c160 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
2c170 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
2c180 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
2c190 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
2c1a0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
2c1b0 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66  ANDLE h;.#if def
2c1c0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
2c1d0 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70  .  int nFull = p
2c1e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2c1f0 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  1;.  char *zFull
2c200 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2c210 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20  Zero( nFull );. 
2c220 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2c230 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75  d = 0;.  if( zFu
2c240 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ll==0 ){.    OST
2c250 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2c260 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2c270 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2c280 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2c290 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2c2a0 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  if( winFullPathn
2c2b0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2c2c0 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c  ame, nFull, zFul
2c2d0 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  l)!=SQLITE_OK ){
2c2e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2c2f0 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53  e(zFull);.    OS
2c300 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2c310 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2c320 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2c330 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2c340 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2c350 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
2c360 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
2c370 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b  Filename(zFull);
2c380 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2c390 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  zFull);.#else.  
2c3a0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
2c3b0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2c3c0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2c3d0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
2c3e0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2c3f0 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  s);.#endif.  if(
2c400 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
2c410 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
2c420 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2c430 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2c440 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2c450 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
2c460 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
2c470 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
2c480 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
2c490 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
2c4a0 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
2c4b0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2c4c0 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
2c4d0 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
2c4e0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
2c4f0 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
2c500 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2c510 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
2c520 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
2c530 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
2c540 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
2c550 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
2c560 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2c570 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2c580 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2c590 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20  , (void*)h));.  
2c5a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2c5b0 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
2c5c0 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
2c5d0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
2c5e0 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2c5f0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2c600 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2c610 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2c620 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
2c630 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
2c640 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
2c650 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
2c660 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
2c670 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
2c680 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
2c690 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
2c6a0 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
2c6b0 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63  {.  FARPROC proc
2c6c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2c6d0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72  ETER(pVfs);.  pr
2c6e0 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64  oc = osGetProcAd
2c6f0 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
2c700 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52  H, zSym);.  OSTR
2c710 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64  ACE(("DLSYM hand
2c720 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73  le=%p, symbol=%s
2c730 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c  , address=%p\n",
2c740 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
2c750 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f  d*)pH, zSym, (vo
2c760 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65  id*)proc));.  re
2c770 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
2c780 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74  id))proc;.}.stat
2c790 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
2c7a0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
2c7b0 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
2c7c0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
2c7d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2c7e0 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
2c7f0 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
2c800 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
2c810 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c  CLOSE handle=%p\
2c820 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64  n", (void*)pHand
2c830 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  le));.}.#else /*
2c840 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
2c850 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
2c860 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
2c870 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
2c880 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
2c890 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
2c8a0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
2c8b0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2c8c0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2c8d0 0a 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  ../* State infor
2c8e0 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  mation for the r
2c8f0 61 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72  andomness gather
2c900 65 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  er. */.typedef s
2c910 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74  truct EntropyGat
2c920 68 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74  herer EntropyGat
2c930 68 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e  herer;.struct En
2c940 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a  tropyGatherer {.
2c950 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2c960 2a 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20  *a;   /* Gather 
2c970 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69  entropy into thi
2c980 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
2c990 74 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20  t na;           
2c9a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d    /* Size of a[]
2c9b0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
2c9c0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2c9d0 20 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69     /* XOR next i
2c9e0 6e 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a  nput into a[i] *
2c9f0 2f 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20  /.  int nXor;   
2ca00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ca10 72 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69  r of XOR operati
2ca20 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a  ons done */.};..
2ca30 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2ca40 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
2ca50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2ca60 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a  T_RANDOMNESS)./*
2ca70 20 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66   Mix sz bytes of
2ca80 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e   entropy into p.
2ca90 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2caa0 78 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70  xorMemory(Entrop
2cab0 79 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e  yGatherer *p, un
2cac0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20  signed char *x, 
2cad0 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a  int sz){.  int j
2cae0 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20  , k;.  for(j=0, 
2caf0 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b  k=p->i; j<sz; j+
2cb00 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b  +){.    p->a[k++
2cb10 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69  ] ^= x[j];.    i
2cb20 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20  f( k>=p->na ) k 
2cb30 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20  = 0;.  }.  p->i 
2cb40 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b  = k;.  p->nXor +
2cb50 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  = sz;.}.#endif /
2cb60 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2cb70 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
2cb80 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2cb90 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a  RANDOMNESS) */..
2cba0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
2cbb0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
2cbc0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
2cbd0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2cbe0 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
2cbf0 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
2cc00 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2cc10 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20  har *zBuf){.#if 
2cc20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2cc30 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
2cc40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2cc50 4f 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44  OMNESS).  UNUSED
2cc60 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2cc70 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
2cc80 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74   0, nBuf);.  ret
2cc90 75 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a  urn nBuf;.#else.
2cca0 20 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65    EntropyGathere
2ccb0 72 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  r e;.  UNUSED_PA
2ccc0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2ccd0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2cce0 20 6e 42 75 66 29 3b 0a 23 69 66 20 64 65 66 69   nBuf);.#if defi
2ccf0 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
2cd00 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 34 30 30 20   _MSC_VER>=1400 
2cd10 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
2cd20 4e 43 45 0a 20 20 72 61 6e 64 5f 73 28 28 75 6e  NCE.  rand_s((un
2cd30 73 69 67 6e 65 64 20 69 6e 74 2a 29 7a 42 75 66  signed int*)zBuf
2cd40 29 3b 20 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69  ); /* rand_s() i
2cd50 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
2cd60 77 69 74 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65  with MinGW */.#e
2cd70 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2cd80 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
2cd90 43 5f 56 45 52 3e 3d 31 34 30 30 20 2a 2f 0a 20  C_VER>=1400 */. 
2cda0 20 65 2e 61 20 3d 20 28 75 6e 73 69 67 6e 65 64   e.a = (unsigned
2cdb0 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65   char*)zBuf;.  e
2cdc0 2e 6e 61 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e  .na = nBuf;.  e.
2cdd0 6e 58 6f 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20  nXor = 0;.  e.i 
2cde0 3d 20 30 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53  = 0;.  {.    SYS
2cdf0 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
2ce00 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2ce10 78 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  x);.    xorMemor
2ce20 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2ce30 63 68 61 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66  char*)&x, sizeof
2ce40 28 53 59 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20  (SYSTEMTIME));. 
2ce50 20 7d 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44   }.  {.    DWORD
2ce60 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
2ce70 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
2ce80 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2ce90 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2cea0 2a 29 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 44  *)&pid, sizeof(D
2ceb0 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20  WORD));.  }.#if 
2cec0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2ced0 20 20 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e    {.    ULONGLON
2cee0 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
2cef0 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
2cf00 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2cf10 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63  nsigned char*)&c
2cf20 6e 74 2c 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  nt, sizeof(ULONG
2cf30 4c 4f 4e 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73  LONG));.  }.#els
2cf40 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
2cf50 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
2cf60 6f 75 6e 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d  ount();.    xorM
2cf70 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2cf80 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20  ned char*)&cnt, 
2cf90 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a  sizeof(DWORD));.
2cfa0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2cfb0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f  LITE_OS_WINRT */
2cfc0 0a 20 20 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  .  {.    LARGE_I
2cfd0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
2cfe0 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
2cff0 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
2d000 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2d010 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2d020 69 2c 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  i, sizeof(LARGE_
2d030 49 4e 54 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23  INTEGER));.  }.#
2d040 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2d050 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
2d060 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
2d070 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44  E_WIN32_USE_UUID
2d080 0a 20 20 7b 0a 20 20 20 20 55 55 49 44 20 69 64  .  {.    UUID id
2d090 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64  ;.    memset(&id
2d0a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  , 0, sizeof(UUID
2d0b0 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72  ));.    osUuidCr
2d0c0 65 61 74 65 28 26 69 64 29 3b 0a 20 20 20 20 78  eate(&id);.    x
2d0d0 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2d0e0 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64  signed char*)&id
2d0f0 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2d100 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c  .    memset(&id,
2d110 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29   0, sizeof(UUID)
2d120 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65  );.    osUuidCre
2d130 61 74 65 53 65 71 75 65 6e 74 69 61 6c 28 26 69  ateSequential(&i
2d140 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  d);.    xorMemor
2d150 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2d160 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f  char*)&id, sizeo
2d170 66 28 55 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65  f(UUID));.  }.#e
2d180 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2d190 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2d1a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2d1b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
2d1c0 5f 55 55 49 44 20 2a 2f 0a 20 20 72 65 74 75 72  _UUID */.  retur
2d1d0 6e 20 65 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20  n e.nXor>nBuf ? 
2d1e0 6e 42 75 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23  nBuf : e.nXor;.#
2d1f0 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
2d200 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
2d210 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d220 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2d230 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   */.}.../*.** Sl
2d240 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
2d250 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
2d260 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
2d270 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
2d280 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
2d290 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2d2a0 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
2d2b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
2d2c0 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
2d2d0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
2d2e0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2d2f0 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2d300 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
2d310 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
2d320 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2d330 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2d340 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2d350 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2d360 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2d370 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2d380 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2d390 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2d3a0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2d3b0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2d3c0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2d3d0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2d3e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2d3f0 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2d400 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2d410 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2d420 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2d430 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2d440 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2d450 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2d460 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2d470 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2d480 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2d490 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2d4a0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2d4b0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2d4c0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2d4d0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2d4e0 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2d4f0 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2d500 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2d510 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2d520 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2d530 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2d540 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2d550 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2d560 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2d570 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2d580 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2d590 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2d5a0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2d5b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2d5c0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2d5d0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2d5e0 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20   date.** cannot 
2d5f0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2d600 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2d610 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2d620 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2d630 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2d640 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2d650 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2d660 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2d670 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2d680 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2d690 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
2d6a0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
2d6b0 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
2d6c0 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
2d6d0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
2d6e0 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
2d6f0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2d700 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
2d710 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
2d720 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2d730 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
2d740 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
2d750 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2d760 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2d770 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2d780 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2d790 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
2d7a0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
2d7b0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
2d7c0 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
2d7d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2d7e0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
2d7f0 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20  32BitValue =.   
2d800 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2d810 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
2d820 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2d830 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
2d840 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2d850 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
2d860 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2d870 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
2d880 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
2d890 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
2d8a0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
2d8b0 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
2d8c0 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
2d8d0 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
2d8e0 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
2d8f0 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
2d900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d910 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2d920 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2d930 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
2d940 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
2d950 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
2d960 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
2d970 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
2d980 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2d990 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
2d9a0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
2d9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d9c0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2d9d0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2d9e0 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2d9f0 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2da00 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2da10 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2da20 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2da30 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2da40 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2da50 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2da60 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2da70 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2da80 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2da90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2daa0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2dab0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2dac0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2dad0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2dae0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2daf0 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2db00 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2db10 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2db20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2db30 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2db40 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2db50 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2db60 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2db70 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2db80 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2db90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2dba0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2dbb0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2dbc0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2dbd0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2dbe0 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2dbf0 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2dc00 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2dc10 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2dc20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2dc30 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2dc40 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2dc50 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2dc60 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2dc70 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2dc80 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2dc90 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2dca0 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2dcb0 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2dcc0 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2dcd0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2dce0 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2dcf0 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2dd00 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2dd10 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2dd20 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2dd30 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2dd40 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2dd50 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2dd60 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2dd70 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2dd80 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2dd90 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2dda0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2ddb0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2ddc0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2ddd0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2dde0 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2ddf0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2de00 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2de10 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2de20 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2de30 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2de40 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2de50 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2de60 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2de70 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2de80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2de90 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2dea0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2deb0 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2dec0 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2ded0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2dee0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2def0 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2df00 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2df10 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2df20 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2df30 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2df40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2df50 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2df60 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2df70 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2df80 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2df90 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2dfa0 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2dfb0 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2dfc0 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2dfd0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2dfe0 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2dff0 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2e000 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2e010 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2e020 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2e030 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2e040 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2e050 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2e060 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2e070 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2e080 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2e090 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2e0a0 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2e0b0 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2e0c0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2e0d0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2e0e0 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2e0f0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2e100 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2e110 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2e120 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2e130 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2e140 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2e150 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2e160 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2e170 75 66 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  uf){.  DWORD e =
2e180 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2e190 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2e1a0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
2e1b0 66 28 20 6e 42 75 66 3e 30 20 29 20 77 69 6e 47  f( nBuf>0 ) winG
2e1c0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 65  etLastErrorMsg(e
2e1d0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20  , nBuf, zBuf);. 
2e1e0 20 72 65 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a   return e;.}../*
2e1f0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2e200 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
2e210 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2e220 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2e230 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
2e240 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
2e250 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2e260 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
2e270 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2e280 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2e290 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2e2a0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2e2b0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2e2c0 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2e2d0 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
2e2e0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2e2f0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2e300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e310 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2e320 77 69 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20  win32",         
2e330 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
2e340 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 44 61 74  /.    &winAppDat
2e350 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  a,           /* 
2e360 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2e370 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2e380 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2e390 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2e3a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2e3b0 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2e3c0 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2e3d0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2e3e0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2e3f0 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
2e400 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2e410 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2e420 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2e430 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2e440 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2e450 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2e460 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2e470 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2e480 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
2e490 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
2e4a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2e4b0 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2e4c0 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2e4d0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2e4e0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2e4f0 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
2e500 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2e510 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2e520 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72  ,        /* xCur
2e530 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2e540 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2e550 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
2e560 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2e570 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2e580 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e  64,   /* xCurren
2e590 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2e5a0 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2e5b0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74  ll,      /* xSet
2e5c0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2e5d0 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2e5e0 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74  ll,      /* xGet
2e5f0 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2e600 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
2e610 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78  all,     /* xNex
2e620 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2e630 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   };.#if defined(
2e640 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2e650 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69 63 20  _WIDE).  static 
2e660 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c  sqlite3_vfs winL
2e670 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b 0a 20  ongPathVfs = {. 
2e680 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20     3,           
2e690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2e6a0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
2e6b0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
2e6c0 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20      /* szOsFile 
2e6d0 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49  */.    SQLITE_WI
2e6e0 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54  NNT_MAX_PATH_BYT
2e6f0 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d  ES, /* mxPathnam
2e700 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e720 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2e730 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
2e740 2c 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  ,      /* zName 
2e750 2a 2f 0a 20 20 20 20 26 77 69 6e 41 70 70 44 61  */.    &winAppDa
2e760 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ta,           /*
2e770 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2e780 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2e790 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e          /* xOpen
2e7a0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74   */.    winDelet
2e7b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2e7c0 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20  * xDelete */.   
2e7d0 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20   winAccess,     
2e7e0 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
2e7f0 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c  ss */.    winFul
2e800 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20  lPathname,      
2e810 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2e820 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
2e830 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2e840 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20  /* xDlOpen */.  
2e850 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20    winDlError,   
2e860 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2e870 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2e880 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2e890 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2e8a0 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2e8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2e8c0 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2e8d0 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2e8e0 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e       /* xRandomn
2e8f0 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c  ess */.    winSl
2e900 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
2e910 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
2e920 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2e930 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75  e,        /* xCu
2e940 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20  rrentTime */.   
2e950 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2e960 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  ,       /* xGetL
2e970 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
2e980 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2e990 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65  t64,   /* xCurre
2e9a0 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20  ntTimeInt64 */. 
2e9b0 20 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43     winSetSystemC
2e9c0 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65  all,      /* xSe
2e9d0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2e9e0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2e9f0 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65  all,      /* xGe
2ea00 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2ea10 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2ea20 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65  Call,     /* xNe
2ea30 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2ea40 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74    };.#endif.  st
2ea50 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2ea60 20 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20   winNolockVfs = 
2ea70 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea90 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  iVersion */.    
2eaa0 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c  sizeof(winFile),
2eab0 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
2eac0 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45  le */.    SQLITE
2ead0 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48 5f  _WIN32_MAX_PATH_
2eae0 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68  BYTES, /* mxPath
2eaf0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20  name */.    0,  
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20     /* pNext */. 
2eb20 20 20 20 22 77 69 6e 33 32 2d 6e 6f 6e 65 22 2c     "win32-none",
2eb30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
2eb40 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f  me */.    &winNo
2eb50 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20  lockAppData,    
2eb60 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a   /* pAppData */.
2eb70 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20      winOpen,    
2eb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2eb90 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2eba0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2ebb0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2ebc0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2ebd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2ebe0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2ebf0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2ec00 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68      /* xFullPath
2ec10 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44  name */.    winD
2ec20 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
2ec30 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
2ec40 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c  .    winDlError,
2ec50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ec60 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  DlError */.    w
2ec70 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20  inDlSym,        
2ec80 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
2ec90 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
2eca0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
2ecb0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20   xDlClose */.   
2ecc0 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20   winRandomness, 
2ecd0 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64          /* xRand
2ece0 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2ecf0 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2ed00 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2ed10 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2ed20 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Time,        /* 
2ed30 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2ed40 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2ed50 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47  ror,       /* xG
2ed60 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20  etLastError */. 
2ed70 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d     winCurrentTim
2ed80 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75  eInt64,   /* xCu
2ed90 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
2eda0 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74  /.    winSetSyst
2edb0 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
2edc0 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xSetSystemCall *
2edd0 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74  /.    winGetSyst
2ede0 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20  emCall,      /* 
2edf0 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
2ee00 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
2ee10 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20  temCall,     /* 
2ee20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20  xNextSystemCall 
2ee30 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69  */.  };.#if defi
2ee40 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2ee50 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61  _HAS_WIDE).  sta
2ee60 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
2ee70 77 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63  winLongPathNoloc
2ee80 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  kVfs = {.    3, 
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eea0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2eeb0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2eec0 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
2eed0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2eee0 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
2eef0 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2ef00 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2ef10 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2ef20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2ef30 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2ef40 2d 6c 6f 6e 67 70 61 74 68 2d 6e 6f 6e 65 22 2c  -longpath-none",
2ef50 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2ef60 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61   &winNolockAppDa
2ef70 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 70 44  ta,     /* pAppD
2ef80 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2ef90 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2efa0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2efb0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2efc0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2efd0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2efe0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2eff0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2f000 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2f010 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
2f020 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2f030 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2f040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f050 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2f060 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2f070 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2f080 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f0a0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2f0b0 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2f0c0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2f0d0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2f0e0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
2f0f0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2f100 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2f110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f120 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2f130 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2f140 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2f150 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2f160 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2f170 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2f180 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2f190 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
2f1a0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2f1b0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2f1c0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2f1d0 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2f1e0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2f1f0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2f200 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2f210 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2f220 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2f230 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
2f240 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2f250 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62  endif..  /* Doub
2f260 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68  le-check that th
2f270 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72  e aSyscall[] arr
2f280 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73  ay has been cons
2f290 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72  tructed.  ** cor
2f2a0 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63  rectly.  See tic
2f2b0 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39 30 63  ket [bb3a86e890c
2f2c0 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73  8e96ab] */.  ass
2f2d0 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 61  ert( ArraySize(a
2f2e0 53 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a  Syscall)==80 );.
2f2f0 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79  .  /* get memory
2f300 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   map allocation 
2f310 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20  granularity */. 
2f320 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49   memset(&winSysI
2f330 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  nfo, 0, sizeof(S
2f340 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69  YSTEM_INFO));.#i
2f350 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2f360 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53  T.  osGetNativeS
2f370 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
2f380 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  sInfo);.#else.  
2f390 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28  osGetSystemInfo(
2f3a0 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2f3b0 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 77  ndif.  assert( w
2f3c0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f  inSysInfo.dwAllo
2f3d0 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74  cationGranularit
2f3e0 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  y>0 );.  assert(
2f3f0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
2f400 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73  geSize>0 );..  s
2f410 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
2f420 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b  ter(&winVfs, 1);
2f430 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
2f440 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2f450 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76  IDE).  sqlite3_v
2f460 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
2f470 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b  LongPathVfs, 0);
2f480 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
2f490 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2f4a0 26 77 69 6e 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30  &winNolockVfs, 0
2f4b0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
2f4c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2f4d0 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
2f4e0 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2f4f0 69 6e 4c 6f 6e 67 50 61 74 68 4e 6f 6c 6f 63 6b  inLongPathNolock
2f500 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
2f510 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2f520 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  _OK;.}..int sqli
2f530 74 65 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29  te3_os_end(void)
2f540 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
2f550 57 49 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65  WINRT.  if( slee
2f560 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj!=NULL ){.  
2f570 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
2f580 73 6c 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73  sleepObj);.    s
2f590 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a  leepObj = NULL;.
2f5a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
2f5b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f5c0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
2f5d0 54 45 5f 4f 53 5f 57 49 4e 20 2a 2f 0a           TE_OS_WIN */.