/ Hex Artifact Content
Login

Artifact c97c79fe19dfb0a14c89b78280beabd9ac28acb1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 57 69 6e 64 6f 77 73 2e  ific to Windows.
01b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
01c0: 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 66 20 53  liteInt.h".#if S
01d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 20 20 20  QLITE_OS_WIN    
01e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
01f0: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
0200: 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
0210: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75   */../*.** Inclu
0220: 64 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20  de code that is 
0230: 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73  common to all os
0240: 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69  _*.c files.*/.#i
0250: 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f  nclude "os_commo
0260: 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c  n.h"../*.** Incl
0270: 75 64 65 20 74 68 65 20 68 65 61 64 65 72 20 66  ude the header f
0280: 69 6c 65 20 66 6f 72 20 74 68 65 20 57 69 6e 64  ile for the Wind
0290: 6f 77 73 20 56 46 53 2e 0a 2a 2f 0a 23 69 6e 63  ows VFS..*/.#inc
02a0: 6c 75 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a  lude "os_win.h".
02b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 69 6e 67  ./*.** Compiling
02c0: 20 61 6e 64 20 75 73 69 6e 67 20 57 41 4c 20 6d   and using WAL m
02d0: 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 65 76  ode requires sev
02e0: 65 72 61 6c 20 41 50 49 73 20 74 68 61 74 20 61  eral APIs that a
02f0: 72 65 20 6f 6e 6c 79 0a 2a 2a 20 61 76 61 69 6c  re only.** avail
0300: 61 62 6c 65 20 69 6e 20 57 69 6e 64 6f 77 73 20  able in Windows 
0310: 70 6c 61 74 66 6f 72 6d 73 20 62 61 73 65 64 20  platforms based 
0320: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
0330: 2e 0a 2a 2f 0a 23 69 66 20 21 53 51 4c 49 54 45  ..*/.#if !SQLITE
0340: 5f 4f 53 5f 57 49 4e 4e 54 20 26 26 20 21 64 65  _OS_WINNT && !de
0350: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
0360: 54 5f 57 41 4c 29 0a 23 20 20 65 72 72 6f 72 20  T_WAL).#  error 
0370: 22 57 41 4c 20 6d 6f 64 65 20 72 65 71 75 69 72  "WAL mode requir
0380: 65 73 20 73 75 70 70 6f 72 74 20 66 72 6f 6d 20  es support from 
0390: 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54 20 6b  the Windows NT k
03a0: 65 72 6e 65 6c 2c 20 63 6f 6d 70 69 6c 65 5c 0a  ernel, compile\.
03b0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49   with SQLITE_OMI
03c0: 54 5f 57 41 4c 2e 22 0a 23 65 6e 64 69 66 0a 0a  T_WAL.".#endif..
03d0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
03e0: 49 4e 4e 54 20 26 26 20 53 51 4c 49 54 45 5f 4d  INNT && SQLITE_M
03f0: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 23  AX_MMAP_SIZE>0.#
0400: 20 20 65 72 72 6f 72 20 22 4d 65 6d 6f 72 79 20    error "Memory 
0410: 6d 61 70 70 65 64 20 66 69 6c 65 73 20 72 65 71  mapped files req
0420: 75 69 72 65 20 73 75 70 70 6f 72 74 20 66 72 6f  uire support fro
0430: 6d 20 74 68 65 20 57 69 6e 64 6f 77 73 20 4e 54  m the Windows NT
0440: 20 6b 65 72 6e 65 6c 2c 5c 0a 20 63 6f 6d 70 69   kernel,\. compi
0450: 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4d  le with SQLITE_M
0460: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3d 30 2e 22  AX_MMAP_SIZE=0."
0470: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
0480: 72 65 20 6d 6f 73 74 20 6f 66 20 74 68 65 20 57  re most of the W
0490: 69 6e 33 32 20 41 4e 53 49 20 41 50 49 73 20 61  in32 ANSI APIs a
04a0: 76 61 69 6c 61 62 6c 65 20 28 69 2e 65 2e 20 77  vailable (i.e. w
04b0: 69 74 68 20 63 65 72 74 61 69 6e 20 65 78 63 65  ith certain exce
04c0: 70 74 69 6f 6e 73 0a 2a 2a 20 62 61 73 65 64 20  ptions.** based 
04d0: 6f 6e 20 74 68 65 20 73 75 62 2d 70 6c 61 74 66  on the sub-platf
04e0: 6f 72 6d 29 3f 0a 2a 2f 0a 23 69 66 20 21 53 51  orm)?.*/.#if !SQ
04f0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
0500: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
0510: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
0520: 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 41 4e  LITE_WIN32_NO_AN
0530: 53 49 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51  SI).#  define SQ
0540: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
0550: 4e 53 49 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  NSI.#endif../*.*
0560: 2a 20 41 72 65 20 6d 6f 73 74 20 6f 66 20 74 68  * Are most of th
0570: 65 20 57 69 6e 33 32 20 55 6e 69 63 6f 64 65 20  e Win32 Unicode 
0580: 41 50 49 73 20 61 76 61 69 6c 61 62 6c 65 20 28  APIs available (
0590: 69 2e 65 2e 20 77 69 74 68 20 63 65 72 74 61 69  i.e. with certai
05a0: 6e 20 65 78 63 65 70 74 69 6f 6e 73 0a 2a 2a 20  n exceptions.** 
05b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 73 75 62  based on the sub
05c0: 2d 70 6c 61 74 66 6f 72 6d 29 3f 0a 2a 2f 0a 23  -platform)?.*/.#
05d0: 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
05e0: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
05f0: 5f 57 49 4e 4e 54 20 7c 7c 20 53 51 4c 49 54 45  _WINNT || SQLITE
0600: 5f 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 5c 0a  _OS_WINRT) && \.
0610: 20 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c      !defined(SQL
0620: 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 57 49 44  ITE_WIN32_NO_WID
0630: 45 29 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c  E).#  define SQL
0640: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
0650: 44 45 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  DE.#endif../*.**
0660: 20 4d 61 6b 65 20 73 75 72 65 20 61 74 20 6c 65   Make sure at le
0670: 61 73 74 20 6f 6e 65 20 73 65 74 20 6f 66 20 57  ast one set of W
0680: 69 6e 33 32 20 41 50 49 73 20 69 73 20 61 76 61  in32 APIs is ava
0690: 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 20 21  ilable..*/.#if !
06a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
06b0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
06c0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
06d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
06e0: 29 0a 23 20 20 65 72 72 6f 72 20 22 41 74 20 6c  ).#  error "At l
06f0: 65 61 73 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  east one of SQLI
0700: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
0710: 49 20 61 6e 64 20 53 51 4c 49 54 45 5f 57 49 4e  I and SQLITE_WIN
0720: 33 32 5f 48 41 53 5f 57 49 44 45 5c 0a 20 6d 75  32_HAS_WIDE\. mu
0730: 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e 22 0a  st be defined.".
0740: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
0750: 66 69 6e 65 20 74 68 65 20 72 65 71 75 69 72 65  fine the require
0760: 64 20 57 69 6e 64 6f 77 73 20 53 44 4b 20 76 65  d Windows SDK ve
0770: 72 73 69 6f 6e 20 63 6f 6e 73 74 61 6e 74 73 20  rsion constants 
0780: 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
0790: 2a 2a 20 61 6c 72 65 61 64 79 20 61 76 61 69 6c  ** already avail
07a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
07b0: 20 4e 54 44 44 49 5f 57 49 4e 38 0a 23 20 20 64   NTDDI_WIN8.#  d
07c0: 65 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 38  efine NTDDI_WIN8
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07e0: 20 20 20 20 20 20 20 20 30 78 30 36 30 32 30 30          0x060200
07f0: 30 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  00.#endif..#ifnd
0800: 65 66 20 4e 54 44 44 49 5f 57 49 4e 42 4c 55 45  ef NTDDI_WINBLUE
0810: 0a 23 20 20 64 65 66 69 6e 65 20 4e 54 44 44 49  .#  define NTDDI
0820: 5f 57 49 4e 42 4c 55 45 20 20 20 20 20 20 20 20  _WINBLUE        
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 78 30               0x0
0840: 36 30 33 30 30 30 30 0a 23 65 6e 64 69 66 0a 0a  6030000.#endif..
0850: 23 69 66 6e 64 65 66 20 4e 54 44 44 49 5f 57 49  #ifndef NTDDI_WI
0860: 4e 54 48 52 45 53 48 4f 4c 44 0a 23 20 20 64 65  NTHRESHOLD.#  de
0870: 66 69 6e 65 20 4e 54 44 44 49 5f 57 49 4e 54 48  fine NTDDI_WINTH
0880: 52 45 53 48 4f 4c 44 20 20 20 20 20 20 20 20 20  RESHOLD         
0890: 20 20 20 20 20 20 20 30 78 30 36 30 34 30 30 30         0x0604000
08a0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
08b0: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
08c0: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
08d0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
08e0: 72 65 20 64 65 70 72 65 63 61 74 65 64 20 6f 6e  re deprecated on
08f0: 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74 20 73   the.** target s
0900: 79 73 74 65 6d 2e 20 20 47 65 74 56 65 72 73 69  ystem.  GetVersi
0910: 6f 6e 45 78 20 77 61 73 20 66 69 72 73 74 20 64  onEx was first d
0920: 65 70 72 65 63 61 74 65 64 20 69 6e 20 57 69 6e  eprecated in Win
0930: 38 2e 31 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  8.1..*/.#ifndef 
0940: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54  SQLITE_WIN32_GET
0950: 56 45 52 53 49 4f 4e 45 58 0a 23 20 20 69 66 20  VERSIONEX.#  if 
0960: 64 65 66 69 6e 65 64 28 4e 54 44 44 49 5f 56 45  defined(NTDDI_VE
0970: 52 53 49 4f 4e 29 20 26 26 20 4e 54 44 44 49 5f  RSION) && NTDDI_
0980: 56 45 52 53 49 4f 4e 20 3e 3d 20 4e 54 44 44 49  VERSION >= NTDDI
0990: 5f 57 49 4e 42 4c 55 45 0a 23 20 20 20 20 64 65  _WINBLUE.#    de
09a0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
09b0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 20 20  2_GETVERSIONEX  
09c0: 20 30 20 20 20 2f 2a 20 47 65 74 56 65 72 73 69   0   /* GetVersi
09d0: 6f 6e 45 78 28 29 20 69 73 20 64 65 70 72 65 63  onEx() is deprec
09e0: 61 74 65 64 20 2a 2f 0a 23 20 20 65 6c 73 65 0a  ated */.#  else.
09f0: 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
0a00: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
0a10: 49 4f 4e 45 58 20 20 20 31 20 20 20 2f 2a 20 47  IONEX   1   /* G
0a20: 65 74 56 65 72 73 69 6f 6e 45 78 28 29 20 69 73  etVersionEx() is
0a30: 20 63 75 72 72 65 6e 74 20 2a 2f 0a 23 20 20 65   current */.#  e
0a40: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
0a50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
0a60: 69 66 20 74 68 65 20 43 72 65 61 74 65 46 69 6c  if the CreateFil
0a70: 65 4d 61 70 70 69 6e 67 41 20 66 75 6e 63 74 69  eMappingA functi
0a80: 6f 6e 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  on is supported 
0a90: 6f 6e 20 74 68 65 0a 2a 2a 20 74 61 72 67 65 74  on the.** target
0aa0: 20 73 79 73 74 65 6d 2e 20 20 49 74 20 69 73 20   system.  It is 
0ab0: 75 6e 61 76 61 69 6c 61 62 6c 65 20 77 68 65 6e  unavailable when
0ac0: 20 75 73 69 6e 67 20 22 6d 69 6e 63 6f 72 65 2e   using "mincore.
0ad0: 6c 69 62 22 20 6f 6e 20 57 69 6e 31 30 2e 0a 2a  lib" on Win10..*
0ae0: 2a 20 57 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * When compiling
0af0: 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 31 30 2c   for Windows 10,
0b00: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 22   always assume "
0b10: 6d 69 6e 63 6f 72 65 2e 6c 69 62 22 20 69 73 20  mincore.lib" is 
0b20: 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64  in use..*/.#ifnd
0b30: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
0b40: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0b50: 47 41 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64  GA.#  if defined
0b60: 28 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e 29 20  (NTDDI_VERSION) 
0b70: 26 26 20 4e 54 44 44 49 5f 56 45 52 53 49 4f 4e  && NTDDI_VERSION
0b80: 20 3e 3d 20 4e 54 44 44 49 5f 57 49 4e 54 48 52   >= NTDDI_WINTHR
0b90: 45 53 48 4f 4c 44 0a 23 20 20 20 20 64 65 66 69  ESHOLD.#    defi
0ba0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
0bb0: 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
0bc0: 47 41 20 20 20 30 0a 23 20 20 65 6c 73 65 0a 23  GA   0.#  else.#
0bd0: 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
0be0: 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
0bf0: 4c 45 4d 41 50 50 49 4e 47 41 20 20 20 31 0a 23  LEMAPPINGA   1.#
0c00: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
0c10: 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e 73 74  /*.** This const
0c20: 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ant should alrea
0c30: 64 79 20 62 65 20 64 65 66 69 6e 65 64 20 28 69  dy be defined (i
0c40: 6e 20 74 68 65 20 22 57 69 6e 44 65 66 2e 68 22  n the "WinDef.h"
0c50: 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a 23   SDK file)..*/.#
0c60: 69 66 6e 64 65 66 20 4d 41 58 5f 50 41 54 48 0a  ifndef MAX_PATH.
0c70: 23 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 50 41  #  define MAX_PA
0c80: 54 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20  TH              
0c90: 20 20 20 20 20 20 20 20 28 32 36 30 29 0a 23 65          (260).#e
0ca0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ndif../*.** Maxi
0cb0: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0cc0: 67 74 68 20 28 69 6e 20 63 68 61 72 73 29 20 66  gth (in chars) f
0cd0: 6f 72 20 57 69 6e 33 32 2e 20 20 54 68 69 73 20  or Win32.  This 
0ce0: 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20  should normally 
0cf0: 62 65 0a 2a 2a 20 4d 41 58 5f 50 41 54 48 2e 0a  be.** MAX_PATH..
0d00: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0d10: 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
0d20: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
0d30: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
0d40: 58 5f 50 41 54 48 5f 43 48 41 52 53 20 20 20 28  X_PATH_CHARS   (
0d50: 4d 41 58 5f 50 41 54 48 29 0a 23 65 6e 64 69 66  MAX_PATH).#endif
0d60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6e  ../*.** This con
0d70: 73 74 61 6e 74 20 73 68 6f 75 6c 64 20 61 6c 72  stant should alr
0d80: 65 61 64 79 20 62 65 20 64 65 66 69 6e 65 64 20  eady be defined 
0d90: 28 69 6e 20 74 68 65 20 22 57 69 6e 4e 54 2e 68  (in the "WinNT.h
0da0: 22 20 53 44 4b 20 66 69 6c 65 29 2e 0a 2a 2f 0a  " SDK file)..*/.
0db0: 23 69 66 6e 64 65 66 20 55 4e 49 43 4f 44 45 5f  #ifndef UNICODE_
0dc0: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
0dd0: 0a 23 20 20 64 65 66 69 6e 65 20 55 4e 49 43 4f  .#  define UNICO
0de0: 44 45 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48  DE_STRING_MAX_CH
0df0: 41 52 53 20 20 20 20 20 20 28 33 32 37 36 37 29  ARS      (32767)
0e00: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
0e10: 61 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20  aximum pathname 
0e20: 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72 73  length (in chars
0e30: 29 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68  ) for WinNT.  Th
0e40: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  is should normal
0e50: 6c 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45  ly be.** UNICODE
0e60: 5f 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52  _STRING_MAX_CHAR
0e70: 53 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  S..*/.#ifndef SQ
0e80: 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50  LITE_WINNT_MAX_P
0e90: 41 54 48 5f 43 48 41 52 53 0a 23 20 20 64 65 66  ATH_CHARS.#  def
0ea0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54  ine SQLITE_WINNT
0eb0: 5f 4d 41 58 5f 50 41 54 48 5f 43 48 41 52 53 20  _MAX_PATH_CHARS 
0ec0: 20 20 28 55 4e 49 43 4f 44 45 5f 53 54 52 49 4e    (UNICODE_STRIN
0ed0: 47 5f 4d 41 58 5f 43 48 41 52 53 29 0a 23 65 6e  G_MAX_CHARS).#en
0ee0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
0ef0: 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e 67  um pathname leng
0f00: 74 68 20 28 69 6e 20 62 79 74 65 73 29 20 66 6f  th (in bytes) fo
0f10: 72 20 57 69 6e 33 32 2e 20 20 54 68 65 20 4d 41  r Win32.  The MA
0f20: 58 5f 50 41 54 48 20 6d 61 63 72 6f 20 69 73 20  X_PATH macro is 
0f30: 69 6e 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  in.** characters
0f40: 2c 20 73 6f 20 77 65 20 61 6c 6c 6f 63 61 74 65  , so we allocate
0f50: 20 34 20 62 79 74 65 73 20 70 65 72 20 63 68 61   4 bytes per cha
0f60: 72 61 63 74 65 72 20 61 73 73 75 6d 69 6e 67 20  racter assuming 
0f70: 77 6f 72 73 74 2d 63 61 73 65 20 6f 66 0a 2a 2a  worst-case of.**
0f80: 20 34 2d 62 79 74 65 73 2d 70 65 72 2d 63 68 61   4-bytes-per-cha
0f90: 72 61 63 74 65 72 20 66 6f 72 20 55 54 46 38 2e  racter for UTF8.
0fa0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
0fb0: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54  TE_WIN32_MAX_PAT
0fc0: 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69 6e  H_BYTES.#  defin
0fd0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  e SQLITE_WIN32_M
0fe0: 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20 20  AX_PATH_BYTES   
0ff0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
1000: 58 5f 50 41 54 48 5f 43 48 41 52 53 2a 34 29 0a  X_PATH_CHARS*4).
1010: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1020: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
1030: 65 6e 67 74 68 20 28 69 6e 20 62 79 74 65 73 29  ength (in bytes)
1040: 20 66 6f 72 20 57 69 6e 4e 54 2e 20 20 54 68 69   for WinNT.  Thi
1050: 73 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c  s should normall
1060: 79 20 62 65 0a 2a 2a 20 55 4e 49 43 4f 44 45 5f  y be.** UNICODE_
1070: 53 54 52 49 4e 47 5f 4d 41 58 5f 43 48 41 52 53  STRING_MAX_CHARS
1080: 20 2a 20 73 69 7a 65 6f 66 28 57 43 48 41 52 29   * sizeof(WCHAR)
1090: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
10a0: 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
10b0: 54 48 5f 42 59 54 45 53 0a 23 20 20 64 65 66 69  TH_BYTES.#  defi
10c0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f  ne SQLITE_WINNT_
10d0: 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 20 20  MAX_PATH_BYTES  
10e0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1100: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 2a 20  sizeof(WCHAR) * 
1110: 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58  SQLITE_WINNT_MAX
1120: 5f 50 41 54 48 5f 43 48 41 52 53 29 0a 23 65 6e  _PATH_CHARS).#en
1130: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d  dif../*.** Maxim
1140: 75 6d 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  um error message
1150: 20 6c 65 6e 67 74 68 20 28 69 6e 20 63 68 61 72   length (in char
1160: 73 29 20 66 6f 72 20 57 69 6e 52 54 2e 0a 2a 2f  s) for WinRT..*/
1170: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1180: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
1190: 5f 43 48 41 52 53 0a 23 20 20 64 65 66 69 6e 65  _CHARS.#  define
11a0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
11b0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 20 28  X_ERRMSG_CHARS (
11c0: 31 30 32 34 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  1024).#endif../*
11d0: 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
11e0: 7a 65 72 6f 20 69 66 20 74 68 65 20 63 68 61 72  zero if the char
11f0: 61 63 74 65 72 20 73 68 6f 75 6c 64 20 62 65 20  acter should be 
1200: 74 72 65 61 74 65 64 20 61 73 20 61 20 64 69 72  treated as a dir
1210: 65 63 74 6f 72 79 0a 2a 2a 20 73 65 70 61 72 61  ectory.** separa
1220: 74 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  tor..*/.#ifndef 
1230: 77 69 6e 49 73 44 69 72 53 65 70 0a 23 20 20 64  winIsDirSep.#  d
1240: 65 66 69 6e 65 20 77 69 6e 49 73 44 69 72 53 65  efine winIsDirSe
1250: 70 28 61 29 20 20 20 20 20 20 20 20 20 20 20 20  p(a)            
1260: 20 20 20 20 28 28 28 61 29 20 3d 3d 20 27 2f 27      (((a) == '/'
1270: 29 20 7c 7c 20 28 28 61 29 20 3d 3d 20 27 5c 5c  ) || ((a) == '\\
1280: 27 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ')).#endif../*.*
1290: 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 69 73 20  * This macro is 
12a0: 75 73 65 64 20 77 68 65 6e 20 61 20 6c 6f 63 61  used when a loca
12b0: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  l variable is se
12c0: 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61  t to a value tha
12d0: 74 20 69 73 0a 2a 2a 20 5b 73 6f 6d 65 74 69 6d  t is.** [sometim
12e0: 65 73 5d 20 6e 6f 74 20 75 73 65 64 20 62 79 20  es] not used by 
12f0: 74 68 65 20 63 6f 64 65 20 28 65 2e 67 2e 20 76  the code (e.g. v
1300: 69 61 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 63  ia conditional c
1310: 6f 6d 70 69 6c 61 74 69 6f 6e 29 2e 0a 2a 2f 0a  ompilation)..*/.
1320: 23 69 66 6e 64 65 66 20 55 4e 55 53 45 44 5f 56  #ifndef UNUSED_V
1330: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 0a 23 20  ARIABLE_VALUE.# 
1340: 20 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 56   define UNUSED_V
1350: 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 78 29  ARIABLE_VALUE(x)
1360: 20 20 20 20 20 20 28 76 6f 69 64 29 28 78 29 0a        (void)(x).
1370: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
1380: 74 75 72 6e 73 20 74 68 65 20 63 68 61 72 61 63  turns the charac
1390: 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ter that should 
13a0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 64  be used as the d
13b0: 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61 74  irectory separat
13c0: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 77  or..*/.#ifndef w
13d0: 69 6e 47 65 74 44 69 72 53 65 70 0a 23 20 20 64  inGetDirSep.#  d
13e0: 65 66 69 6e 65 20 77 69 6e 47 65 74 44 69 72 53  efine winGetDirS
13f0: 65 70 28 29 20 20 20 20 20 20 20 20 20 20 20 20  ep()            
1400: 20 20 20 20 27 5c 5c 27 0a 23 65 6e 64 69 66 0a      '\\'.#endif.
1410: 0a 2f 2a 0a 2a 2a 20 44 6f 20 77 65 20 6e 65 65  ./*.** Do we nee
1420: 64 20 74 6f 20 6d 61 6e 75 61 6c 6c 79 20 64 65  d to manually de
1430: 66 69 6e 65 20 74 68 65 20 57 69 6e 33 32 20 66  fine the Win32 f
1440: 69 6c 65 20 6d 61 70 70 69 6e 67 20 41 50 49 73  ile mapping APIs
1450: 20 66 6f 72 20 75 73 65 20 77 69 74 68 20 57 41   for use with WA
1460: 4c 0a 2a 2a 20 6d 6f 64 65 20 6f 72 20 6d 65 6d  L.** mode or mem
1470: 6f 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73  ory mapped files
1480: 20 28 65 2e 67 2e 20 74 68 65 73 65 20 41 50 49   (e.g. these API
1490: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
14a0: 69 6e 20 74 68 65 20 57 69 6e 64 6f 77 73 0a 2a  in the Windows.*
14b0: 2a 20 43 45 20 53 44 4b 3b 20 68 6f 77 65 76 65  * CE SDK; howeve
14c0: 72 2c 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  r, they are not 
14d0: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 68  present in the h
14e0: 65 61 64 65 72 20 66 69 6c 65 29 3f 0a 2a 2f 0a  eader file)?.*/.
14f0: 23 69 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  #if SQLITE_WIN32
1500: 5f 46 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49  _FILEMAPPING_API
1510: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
1520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
1530: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
1540: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1550: 3e 30 29 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 6f 66  >0)./*.** Two of
1560: 20 74 68 65 20 66 69 6c 65 20 6d 61 70 70 69 6e   the file mappin
1570: 67 20 41 50 49 73 20 61 72 65 20 64 69 66 66 65  g APIs are diffe
1580: 72 65 6e 74 20 75 6e 64 65 72 20 57 69 6e 52 54  rent under WinRT
1590: 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  .  Figure out wh
15a0: 69 63 68 0a 2a 2a 20 73 65 74 20 77 65 20 6e 65  ich.** set we ne
15b0: 65 64 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ed..*/.#if SQLIT
15c0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 57 49 4e 42 41  E_OS_WINRT.WINBA
15d0: 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e  SEAPI HANDLE WIN
15e0: 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61  API CreateFileMa
15f0: 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 48 41 4e  ppingFromApp(HAN
1600: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  DLE, \.        L
1610: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
1620: 55 54 45 53 2c 20 55 4c 4f 4e 47 2c 20 55 4c 4f  UTES, ULONG, ULO
1630: 4e 47 36 34 2c 20 4c 50 43 57 53 54 52 29 3b 0a  NG64, LPCWSTR);.
1640: 0a 57 49 4e 42 41 53 45 41 50 49 20 4c 50 56 4f  .WINBASEAPI LPVO
1650: 49 44 20 57 49 4e 41 50 49 20 4d 61 70 56 69 65  ID WINAPI MapVie
1660: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 48  wOfFileFromApp(H
1670: 41 4e 44 4c 45 2c 20 55 4c 4f 4e 47 2c 20 55 4c  ANDLE, ULONG, UL
1680: 4f 4e 47 36 34 2c 20 53 49 5a 45 5f 54 29 3b 0a  ONG64, SIZE_T);.
1690: 23 65 6c 73 65 0a 23 69 66 20 64 65 66 69 6e 65  #else.#if define
16a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
16b0: 41 53 5f 41 4e 53 49 29 0a 57 49 4e 42 41 53 45  AS_ANSI).WINBASE
16c0: 41 50 49 20 48 41 4e 44 4c 45 20 57 49 4e 41 50  API HANDLE WINAP
16d0: 49 20 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  I CreateFileMapp
16e0: 69 6e 67 41 28 48 41 4e 44 4c 45 2c 20 4c 50 53  ingA(HANDLE, LPS
16f0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
1700: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
1710: 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52  ORD, DWORD, DWOR
1720: 44 2c 20 4c 50 43 53 54 52 29 3b 0a 23 65 6e 64  D, LPCSTR);.#end
1730: 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
1740: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
1750: 4e 53 49 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  NSI) */..#if def
1760: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1770: 32 5f 48 41 53 5f 57 49 44 45 29 0a 57 49 4e 42  2_HAS_WIDE).WINB
1780: 41 53 45 41 50 49 20 48 41 4e 44 4c 45 20 57 49  ASEAPI HANDLE WI
1790: 4e 41 50 49 20 43 72 65 61 74 65 46 69 6c 65 4d  NAPI CreateFileM
17a0: 61 70 70 69 6e 67 57 28 48 41 4e 44 4c 45 2c 20  appingW(HANDLE, 
17b0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
17c0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
17d0: 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c 20 44   DWORD, DWORD, D
17e0: 57 4f 52 44 2c 20 4c 50 43 57 53 54 52 29 3b 0a  WORD, LPCWSTR);.
17f0: 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1800: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
1810: 41 53 5f 57 49 44 45 29 20 2a 2f 0a 0a 57 49 4e  AS_WIDE) */..WIN
1820: 42 41 53 45 41 50 49 20 4c 50 56 4f 49 44 20 57  BASEAPI LPVOID W
1830: 49 4e 41 50 49 20 4d 61 70 56 69 65 77 4f 66 46  INAPI MapViewOfF
1840: 69 6c 65 28 48 41 4e 44 4c 45 2c 20 44 57 4f 52  ile(HANDLE, DWOR
1850: 44 2c 20 44 57 4f 52 44 2c 20 44 57 4f 52 44 2c  D, DWORD, DWORD,
1860: 20 53 49 5a 45 5f 54 29 3b 0a 23 65 6e 64 69 66   SIZE_T);.#endif
1870: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   /* SQLITE_OS_WI
1880: 4e 52 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  NRT */../*.** Th
1890: 65 73 65 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ese file mapping
18a0: 20 41 50 49 73 20 61 72 65 20 63 6f 6d 6d 6f 6e   APIs are common
18b0: 20 74 6f 20 62 6f 74 68 20 57 69 6e 33 32 20 61   to both Win32 a
18c0: 6e 64 20 57 69 6e 52 54 2e 0a 2a 2f 0a 0a 57 49  nd WinRT..*/..WI
18d0: 4e 42 41 53 45 41 50 49 20 42 4f 4f 4c 20 57 49  NBASEAPI BOOL WI
18e0: 4e 41 50 49 20 46 6c 75 73 68 56 69 65 77 4f 66  NAPI FlushViewOf
18f0: 46 69 6c 65 28 4c 50 43 56 4f 49 44 2c 20 53 49  File(LPCVOID, SI
1900: 5a 45 5f 54 29 3b 0a 57 49 4e 42 41 53 45 41 50  ZE_T);.WINBASEAP
1910: 49 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20 55 6e  I BOOL WINAPI Un
1920: 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 4c 50  mapViewOfFile(LP
1930: 43 56 4f 49 44 29 3b 0a 23 65 6e 64 69 66 20 2f  CVOID);.#endif /
1940: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 46  * SQLITE_WIN32_F
1950: 49 4c 45 4d 41 50 50 49 4e 47 5f 41 50 49 20 2a  ILEMAPPING_API *
1960: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69  /../*.** Some Mi
1970: 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72  crosoft compiler
1980: 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69  s lack this defi
1990: 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  nition..*/.#ifnd
19a0: 65 66 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  ef INVALID_FILE_
19b0: 41 54 54 52 49 42 55 54 45 53 0a 23 20 64 65 66  ATTRIBUTES.# def
19c0: 69 6e 65 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  ine INVALID_FILE
19d0: 5f 41 54 54 52 49 42 55 54 45 53 20 28 28 44 57  _ATTRIBUTES ((DW
19e0: 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
19f0: 23 69 66 6e 64 65 66 20 46 49 4c 45 5f 46 4c 41  #ifndef FILE_FLA
1a00: 47 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e 65 20  G_MASK.# define 
1a10: 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 20 20  FILE_FLAG_MASK  
1a20: 20 20 20 20 20 20 20 20 28 30 78 46 46 33 43 30          (0xFF3C0
1a30: 30 30 30 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  000).#endif..#if
1a40: 6e 64 65 66 20 46 49 4c 45 5f 41 54 54 52 49 42  ndef FILE_ATTRIB
1a50: 55 54 45 5f 4d 41 53 4b 0a 23 20 64 65 66 69 6e  UTE_MASK.# defin
1a60: 65 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  e FILE_ATTRIBUTE
1a70: 5f 4d 41 53 4b 20 20 20 20 20 28 30 78 30 30 30  _MASK     (0x000
1a80: 33 46 46 46 37 29 0a 23 65 6e 64 69 66 0a 0a 23  3FFF7).#endif..#
1a90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aa0: 49 54 5f 57 41 4c 0a 2f 2a 20 46 6f 72 77 61 72  IT_WAL./* Forwar
1ab0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
1ac0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
1ad0: 66 6f 72 20 57 41 4c 20 2a 2f 0a 74 79 70 65 64  for WAL */.typed
1ae0: 65 66 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  ef struct winShm
1af0: 20 77 69 6e 53 68 6d 3b 20 20 20 20 20 20 20 20   winShm;        
1b00: 20 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74 69     /* A connecti
1b10: 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
1b20: 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ory */.typedef s
1b30: 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1b40: 20 77 69 6e 53 68 6d 4e 6f 64 65 3b 20 20 20 2f   winShmNode;   /
1b50: 2a 20 41 20 72 65 67 69 6f 6e 20 6f 66 20 73 68  * A region of sh
1b60: 61 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 23  ared-memory */.#
1b70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
1b80: 43 45 20 6c 61 63 6b 73 20 6e 61 74 69 76 65 20  CE lacks native 
1b90: 73 75 70 70 6f 72 74 20 66 6f 72 20 66 69 6c 65  support for file
1ba0: 20 6c 6f 63 6b 69 6e 67 20 73 6f 20 77 65 20 68   locking so we h
1bb0: 61 76 65 20 74 6f 20 66 61 6b 65 20 69 74 0a 2a  ave to fake it.*
1bc0: 2a 20 77 69 74 68 20 73 6f 6d 65 20 63 6f 64 65  * with some code
1bd0: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 2a 2f 0a   of our own..*/.
1be0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
1bf0: 4e 43 45 0a 74 79 70 65 64 65 66 20 73 74 72 75  NCE.typedef stru
1c00: 63 74 20 77 69 6e 63 65 4c 6f 63 6b 20 7b 0a 20  ct winceLock {. 
1c10: 20 69 6e 74 20 6e 52 65 61 64 65 72 73 3b 20 20   int nReaders;  
1c20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c30: 66 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20 6f  f reader locks o
1c40: 62 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f  btained */.  BOO
1c50: 4c 20 62 50 65 6e 64 69 6e 67 3b 20 20 20 20 20  L bPending;     
1c60: 20 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 20   /* Indicates a 
1c70: 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73  pending lock has
1c80: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 2a   been obtained *
1c90: 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 73 65 72 76  /.  BOOL bReserv
1ca0: 65 64 3b 20 20 20 20 20 2f 2a 20 49 6e 64 69 63  ed;     /* Indic
1cb0: 61 74 65 73 20 61 20 72 65 73 65 72 76 65 64 20  ates a reserved 
1cc0: 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 6f 62  lock has been ob
1cd0: 74 61 69 6e 65 64 20 2a 2f 0a 20 20 42 4f 4f 4c  tained */.  BOOL
1ce0: 20 62 45 78 63 6c 75 73 69 76 65 3b 20 20 20 20   bExclusive;    
1cf0: 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 61 6e 20  /* Indicates an 
1d00: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 68  exclusive lock h
1d10: 61 73 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  as been obtained
1d20: 20 2a 2f 0a 7d 20 77 69 6e 63 65 4c 6f 63 6b 3b   */.} winceLock;
1d30: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1d40: 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75 63  he winFile struc
1d50: 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c 61  ture is a subcla
1d60: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1d70: 6c 65 2a 20 73 70 65 63 69 66 69 63 20 74 6f 20  le* specific to 
1d80: 74 68 65 20 77 69 6e 33 32 0a 2a 2a 20 70 6f 72  the win32.** por
1d90: 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72 2e 0a  tability layer..
1da0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1db0: 74 20 77 69 6e 46 69 6c 65 20 77 69 6e 46 69 6c  t winFile winFil
1dc0: 65 3b 0a 73 74 72 75 63 74 20 77 69 6e 46 69 6c  e;.struct winFil
1dd0: 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69  e {.  const sqli
1de0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1df0: 70 4d 65 74 68 6f 64 3b 20 2f 2a 2a 2a 20 4d 75  pMethod; /*** Mu
1e00: 73 74 20 62 65 20 66 69 72 73 74 20 2a 2a 2a 2f  st be first ***/
1e10: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1e20: 70 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 54 68  pVfs;      /* Th
1e30: 65 20 56 46 53 20 75 73 65 64 20 74 6f 20 6f 70  e VFS used to op
1e40: 65 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  en this file */.
1e50: 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20    HANDLE h;     
1e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
1e70: 64 6c 65 20 66 6f 72 20 61 63 63 65 73 73 69 6e  dle for accessin
1e80: 67 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  g the file */.  
1e90: 75 38 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 20  u8 locktype;    
1ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
1eb0: 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74 6c  of lock currentl
1ec0: 79 20 68 65 6c 64 20 6f 6e 20 74 68 69 73 20 66  y held on this f
1ed0: 69 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 73  ile */.  short s
1ee0: 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 3b 20 20  haredLockByte;  
1ef0: 20 2f 2a 20 52 61 6e 64 6f 6d 6c 79 20 63 68 6f   /* Randomly cho
1f00: 73 65 6e 20 62 79 74 65 20 75 73 65 64 20 61 73  sen byte used as
1f10: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a   a shared lock *
1f20: 2f 0a 20 20 75 38 20 63 74 72 6c 46 6c 61 67 73  /.  u8 ctrlFlags
1f30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
1f40: 6c 61 67 73 2e 20 20 53 65 65 20 57 49 4e 46 49  lags.  See WINFI
1f50: 4c 45 5f 2a 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  LE_* below */.  
1f60: 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
1f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
1f80: 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f  indows errno fro
1f90: 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65  m the last I/O e
1fa0: 72 72 6f 72 20 2a 2f 0a 23 69 66 6e 64 65 66 20  rror */.#ifndef 
1fb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
1fc0: 20 20 77 69 6e 53 68 6d 20 2a 70 53 68 6d 3b 20    winShm *pShm; 
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
1fe0: 74 61 6e 63 65 20 6f 66 20 73 68 61 72 65 64 20  tance of shared 
1ff0: 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 69 73 20 66  memory on this f
2000: 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ile */.#endif.  
2010: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2020: 68 3b 20 20 20 20 20 20 2f 2a 20 46 75 6c 6c 20  h;      /* Full 
2030: 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 69 73  pathname of this
2040: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73   file */.  int s
2050: 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20  zChunk;         
2060: 20 20 20 2f 2a 20 43 68 75 6e 6b 20 73 69 7a 65     /* Chunk size
2070: 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   configured by F
2080: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
2090: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
20a0: 5f 57 49 4e 43 45 0a 20 20 4c 50 57 53 54 52 20  _WINCE.  LPWSTR 
20b0: 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 3b 20  zDeleteOnClose; 
20c0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
20d0: 20 74 6f 20 64 65 6c 65 74 65 20 77 68 65 6e 20   to delete when 
20e0: 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 48 41 4e  closing */.  HAN
20f0: 44 4c 45 20 68 4d 75 74 65 78 3b 20 20 20 20 20  DLE hMutex;     
2100: 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 75 73       /* Mutex us
2110: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  ed to control ac
2120: 63 65 73 73 20 74 6f 20 73 68 61 72 65 64 20 6c  cess to shared l
2130: 6f 63 6b 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20  ock */.  HANDLE 
2140: 68 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  hShared;        
2150: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
2160: 79 20 73 65 67 6d 65 6e 74 20 75 73 65 64 20 66  y segment used f
2170: 6f 72 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20  or locking */.  
2180: 77 69 6e 63 65 4c 6f 63 6b 20 6c 6f 63 61 6c 3b  winceLock local;
2190: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 73          /* Locks
21a0: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 74 68 69   obtained by thi
21b0: 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 77 69  s instance of wi
21c0: 6e 46 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 63 65  nFile */.  wince
21d0: 4c 6f 63 6b 20 2a 73 68 61 72 65 64 3b 20 20 20  Lock *shared;   
21e0: 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73 68 61     /* Global sha
21f0: 72 65 64 20 6c 6f 63 6b 20 6d 65 6d 6f 72 79 20  red lock memory 
2200: 66 6f 72 20 74 68 65 20 66 69 6c 65 20 20 2a 2f  for the file  */
2210: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
2220: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2230: 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74 63 68 4f  >0.  int nFetchO
2240: 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
2250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2260: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
2270: 63 68 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f  ch references */
2280: 0a 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20  .  HANDLE hMap; 
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f 72 20 61   /* Handle for a
22b0: 63 63 65 73 73 69 6e 67 20 6d 65 6d 6f 72 79 20  ccessing memory 
22c0: 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 76 6f 69  mapping */.  voi
22d0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
22e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22f0: 65 61 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ea memory mapped
2300: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
2310: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
2320: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
2330: 7a 65 20 6f 66 20 6d 61 70 70 65 64 20 72 65 67  ze of mapped reg
2340: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
2350: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
2360: 63 74 75 61 6c 3b 20 2f 2a 20 41 63 74 75 61 6c  ctual; /* Actual
2370: 20 73 69 7a 65 20 6f 66 20 6d 61 70 70 65 64 20   size of mapped 
2380: 72 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  region */.  sqli
2390: 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69  te3_int64 mmapSi
23a0: 7a 65 4d 61 78 3b 20 20 20 20 2f 2a 20 43 6f 6e  zeMax;    /* Con
23b0: 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f 4d 4d  figured FCNTL_MM
23c0: 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20 2a 2f  AP_SIZE value */
23d0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
23e0: 2a 20 54 68 65 20 77 69 6e 56 66 73 41 70 70 44  * The winVfsAppD
23f0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 69 73  ata structure is
2400: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70 41   used for the pA
2410: 70 70 44 61 74 61 20 6d 65 6d 62 65 72 20 66 6f  ppData member fo
2420: 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a 20  r all of the.** 
2430: 57 69 6e 33 32 20 56 46 53 20 76 61 72 69 61 6e  Win32 VFS varian
2440: 74 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ts..*/.typedef s
2450: 74 72 75 63 74 20 77 69 6e 56 66 73 41 70 70 44  truct winVfsAppD
2460: 61 74 61 20 77 69 6e 56 66 73 41 70 70 44 61 74  ata winVfsAppDat
2470: 61 3b 0a 73 74 72 75 63 74 20 77 69 6e 56 66 73  a;.struct winVfs
2480: 41 70 70 44 61 74 61 20 7b 0a 20 20 63 6f 6e 73  AppData {.  cons
2490: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
24a0: 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 3b 20 2f  hods *pMethod; /
24b0: 2a 20 54 68 65 20 66 69 6c 65 20 49 2f 4f 20 6d  * The file I/O m
24c0: 65 74 68 6f 64 73 20 74 6f 20 75 73 65 2e 20 2a  ethods to use. *
24d0: 2f 0a 20 20 76 6f 69 64 20 2a 70 41 70 70 44 61  /.  void *pAppDa
24e0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
24f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
2500: 74 72 61 20 70 41 70 70 44 61 74 61 2c 20 69 66  tra pAppData, if
2510: 20 61 6e 79 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20   any. */.  BOOL 
2520: 62 4e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  bNoLock;        
2530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2540: 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 6c 6f 63   Non-zero if loc
2550: 6b 69 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64  king is disabled
2560: 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  . */.};../*.** A
2570: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66 6f  llowed values fo
2580: 72 20 77 69 6e 46 69 6c 65 2e 63 74 72 6c 46 6c  r winFile.ctrlFl
2590: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ags.*/.#define W
25a0: 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20  INFILE_RDONLY   
25b0: 20 20 20 20 20 20 20 30 78 30 32 20 20 20 2f 2a         0x02   /*
25c0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 72   Connection is r
25d0: 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66  ead only */.#def
25e0: 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 45 52 53  ine WINFILE_PERS
25f0: 49 53 54 5f 57 41 4c 20 20 20 20 20 30 78 30 34  IST_WAL     0x04
2600: 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65 6e 74     /* Persistent
2610: 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23 64 65   WAL mode */.#de
2620: 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50 53 4f  fine WINFILE_PSO
2630: 57 20 20 20 20 20 20 20 20 20 20 20 20 30 78 31  W            0x1
2640: 30 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f  0   /* SQLITE_IO
2650: 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
2660: 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f 2a 0a 20  ERWRITE */../*. 
2670: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
2680: 65 20 62 75 66 66 65 72 20 75 73 65 64 20 62 79  e buffer used by
2690: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
26a0: 72 69 74 65 5f 64 65 62 75 67 28 29 2e 0a 20 2a  rite_debug().. *
26b0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
26c0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
26d0: 49 5a 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  IZE.#  define SQ
26e0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
26f0: 55 46 5f 53 49 5a 45 20 20 20 28 28 69 6e 74 29  UF_SIZE   ((int)
2700: 28 34 30 39 36 2d 73 69 7a 65 6f 66 28 44 57 4f  (4096-sizeof(DWO
2710: 52 44 29 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  RD))).#endif../*
2720: 0a 20 2a 20 54 68 65 20 76 61 6c 75 65 20 75 73  . * The value us
2730: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 5f  ed with sqlite3_
2740: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
2750: 6f 72 79 28 29 20 74 6f 20 73 70 65 63 69 66 79  ory() to specify
2760: 20 74 68 61 74 0a 20 2a 20 74 68 65 20 64 61 74   that. * the dat
2770: 61 20 64 69 72 65 63 74 6f 72 79 20 73 68 6f 75  a directory shou
2780: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  ld be changed.. 
2790: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
27a0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
27b0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 23 20 20 64  ECTORY_TYPE.#  d
27c0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
27d0: 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52  32_DATA_DIRECTOR
27e0: 59 5f 54 59 50 45 20 28 31 29 0a 23 65 6e 64 69  Y_TYPE (1).#endi
27f0: 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c  f../*. * The val
2800: 75 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  ue used with sql
2810: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
2820: 69 72 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70  irectory() to sp
2830: 65 63 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68  ecify that. * th
2840: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
2850: 63 74 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20  ctory should be 
2860: 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a 23 69 66  changed.. */.#if
2870: 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  ndef SQLITE_WIN3
2880: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
2890: 5f 54 59 50 45 0a 23 20 20 64 65 66 69 6e 65 20  _TYPE.#  define 
28a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
28b0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
28c0: 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a   (2).#endif../*.
28d0: 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77   * If compiled w
28e0: 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ith SQLITE_WIN32
28f0: 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64 6f  _MALLOC on Windo
2900: 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65 20  ws, we will use 
2910: 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20 57  the. * various W
2920: 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66 75  in32 API heap fu
2930: 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64 20  nctions instead 
2940: 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f 0a  of our own.. */.
2950: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49  #ifdef SQLITE_WI
2960: 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a 20  N32_MALLOC../*. 
2970: 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 6e  * If this is non
2980: 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61 74  -zero, an isolat
2990: 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ed heap will be 
29a0: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 6e  created by the n
29b0: 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20 61  ative Win32. * a
29c0: 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73 74  llocator subsyst
29d0: 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 74  em; otherwise, t
29e0: 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63 65  he default proce
29f0: 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20  ss heap will be 
2a00: 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20 73  used.  This. * s
2a10: 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65 66  etting has no ef
2a20: 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c  fect when compil
2a30: 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20 20  ing for WinRT.  
2a40: 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69 73  By default, this
2a50: 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20 61   is enabled. * a
2a60: 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20 68  nd an isolated h
2a70: 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65 61  eap will be crea
2a80: 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c 6c  ted to store all
2a90: 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61 2e   allocated data.
2aa0: 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  . *. ***********
2ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af0: 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a 20  ***. * WARNING: 
2b00: 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  It is important 
2b10: 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68 65  to note that whe
2b20: 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20 69  n this setting i
2b30: 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
2b40: 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20 77  he. *          w
2b50: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66 75  inMemShutdown fu
2b60: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b70: 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73 71   (e.g. by the sq
2b80: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a 20  lite3_shutdown. 
2b90: 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63 74  *          funct
2ba0: 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20 74  ion), all data t
2bb0: 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  hat was allocate
2bc0: 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f 6c  d using the isol
2bd0: 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a 20  ated heap will. 
2be0: 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66 72  *          be fr
2bf0: 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  eed immediately 
2c00: 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74 20  and any attempt 
2c10: 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f 66  to access any of
2c20: 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20 20   that freed. *  
2c30: 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69 6c          data wil
2c40: 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  l almost certain
2c50: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ly result in an 
2c60: 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73 73  immediate access
2c70: 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a 2a   violation.. ***
2c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f 0a  ***********. */.
2cd0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
2ce0: 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54 45  IN32_HEAP_CREATE
2cf0: 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54  .#  define SQLIT
2d00: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2d10: 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55 45  ATE        (TRUE
2d20: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2d30: 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78 69  This is the maxi
2d40: 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e 69  mum possible ini
2d50: 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tial size of the
2d60: 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63 20   Win32-specific 
2d70: 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74 65  heap, in. * byte
2d80: 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  s.. */.#ifndef S
2d90: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2da0: 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a 23  _MAX_INIT_SIZE.#
2db0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2dc0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2dd0: 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39 36  NIT_SIZE (429496
2de0: 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a 2f  7295U).#endif../
2df0: 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68 65  *. * This is the
2e00: 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f 72   extra space for
2e10: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a   the initial siz
2e20: 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73  e of the Win32-s
2e30: 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20 2a  pecific heap,. *
2e40: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
2e50: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2e60: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2e70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2e80: 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20 20  P_INIT_EXTRA.#  
2e90: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2ea0: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45 58  N32_HEAP_INIT_EX
2eb0: 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a 23  TRA  (4194304).#
2ec0: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61 6c  endif../*. * Cal
2ed0: 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69 6d  culate the maxim
2ee0: 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20 73  um legal cache s
2ef0: 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20 62  ize, in pages, b
2f00: 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78 69  ased on the maxi
2f10: 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65 20  mum. * possible 
2f20: 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69 7a  initial heap siz
2f30: 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75 6c  e and the defaul
2f40: 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65 74  t page size, set
2f50: 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a 20  ting aside the. 
2f60: 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20 73  * needed extra s
2f70: 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  pace.. */.#ifnde
2f80: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
2f90: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
2fa0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2fb0: 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f 53  IN32_MAX_CACHE_S
2fc0: 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45 5f  IZE   (((SQLITE_
2fd0: 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 49  WIN32_HEAP_MAX_I
2fe0: 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20 20  NIT_SIZE) - \.  
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3010: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
3020: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
3030: 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20 20  EXTRA)) / \.    
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3060: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
3070: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29 29  AULT_PAGE_SIZE))
3080: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
3090: 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
30a0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
30b0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
30c0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
30d0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
30e0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
30f0: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
3100: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
3110: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
3120: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
3130: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
3140: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
3150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3160: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3170: 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46 41      (SQLITE_DEFA
3180: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 0a  ULT_CACHE_SIZE).
3190: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
31a0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
31b0: 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20 20  _CACHE_SIZE     
31c0: 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  (-(SQLITE_DEFAUL
31d0: 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a 23  T_CACHE_SIZE)).#
31e0: 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a    endif.#endif..
31f0: 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*. * Make sure 
3200: 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c 61  that the calcula
3210: 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c 20  ted cache size, 
3220: 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f 74  in pages, cannot
3230: 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69 6e   cause the. * in
3240: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
3250: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
3260: 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64 20   heap to exceed 
3270: 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75  the maximum amou
3280: 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  nt. * of memory 
3290: 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65 63  that can be spec
32a0: 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61 6c  ified in the cal
32b0: 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 2e  l to HeapCreate.
32c0: 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  . */.#if SQLITE_
32d0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
32e0: 3e 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  >=SQLITE_WIN32_M
32f0: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
3300: 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49   undef SQLITE_WI
3310: 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23  N32_CACHE_SIZE.#
3320: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
3330: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
3340: 20 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65         (2000).#e
3350: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
3360: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
3370: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
3380: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
3390: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
33a0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
33b0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
33c0: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
33d0: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
33e0: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
33f0: 20 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32    ((SQLITE_WIN32
3400: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
3410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3430: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
3440: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
3450: 49 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20  IZE) + \.       
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3480: 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f    (SQLITE_WIN32_
3490: 48 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29  HEAP_INIT_EXTRA)
34a0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
34b0: 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
34c0: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
34d0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68  ecific heap.  Th
34e0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  is value may be 
34f0: 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  zero.. */.#ifnde
3500: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
3510: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20  EAP_MAX_SIZE.#  
3520: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
3530: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
3540: 45 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  E    (0).#endif.
3550: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
3560: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
3570: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
3580: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
3590: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
35a0: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
35b0: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
35c0: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
35d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
35e0: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
35f0: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
3600: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20  EAP_FLAGS       
3610: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (0).#endif.../*.
3620: 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74  ** The winMemDat
3630: 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72  a structure stor
3640: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  es information r
3650: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57  equired by the W
3660: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a  in32-specific.**
3670: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
3680: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  hods implementat
3690: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
36a0: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
36b0: 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74  a winMemData;.st
36c0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
36d0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
36e0: 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20  .  u32 magic1;  
36f0: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
3700: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
3710: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
3720: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e   */.#endif.  HAN
3730: 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68  DLE hHeap; /* Th
3740: 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20  e handle to our 
3750: 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20  heap. */.  BOOL 
3760: 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77  bOwned;  /* Do w
3770: 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28  e own the heap (
3780: 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20  i.e. destroy it 
3790: 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f  on shutdown)? */
37a0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
37b0: 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20    u32 magic2;   
37c0: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
37d0: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
37e0: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
37f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  */.#endif.};..#i
3800: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
3810: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
3820: 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30  C1     0x42b2830
3830: 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  b.#define WINMEM
3840: 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64  _MAGIC2     0xbd
3850: 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73  4d7cf4.#endif..s
3860: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
3870: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
3880: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
3890: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
38a0: 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a  _MAGIC1,.#endif.
38b0: 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69    NULL, FALSE.#i
38c0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c  fndef NDEBUG.  ,
38d0: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65  WINMEM_MAGIC2.#e
38e0: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
38f0: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
3900: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3910: 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c1() assert( win
3920: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31  _mem_data.magic1
3930: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
3940: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
3950: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61  AssertMagic2() a
3960: 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64  ssert( win_mem_d
3970: 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ata.magic2==WINM
3980: 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66  EM_MAGIC2 ).#def
3990: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
39a0: 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41  Magic()  winMemA
39b0: 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77  ssertMagic1(); w
39c0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
39d0: 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69  2();.#else.#defi
39e0: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
39f0: 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23  agic().#endif..#
3a00: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
3a10: 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f  DataPtr()  &win_
3a20: 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65  mem_data.#define
3a30: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
3a40: 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74       win_mem_dat
3a50: 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20  a.hHeap.#define 
3a60: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
3a70: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
3a80: 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20  .bOwned..static 
3a90: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
3aa0: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  oc(int nBytes);.
3ab0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
3ac0: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
3ad0: 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ior);.static voi
3ae0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
3af0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
3b00: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
3b10: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
3b20: 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74  e(void *p);.stat
3b30: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
3b40: 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61  ndup(int n);.sta
3b50: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
3b60: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
3b70: 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  a);.static void 
3b80: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
3b90: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
3ba0: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
3bb0: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
3bc0: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
3bd0: 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  oid);.#endif /* 
3be0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
3bf0: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
3c00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
3c10: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
3c20: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
3c30: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
3c40: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
3c50: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3c60: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
3c70: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a  ystem is Win9x.*
3c80: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
3c90: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
3ca0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
3cb0: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
3cc0: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
3cd0: 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  9x..** 2:   Oper
3ce0: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
3cf0: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
3d00: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
3d10: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
3d20: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
3d30: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
3d40: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
3d50: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
3d60: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
3d70: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
3d80: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3d90: 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45  TEST.LONG SQLITE
3da0: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20  _WIN32_VOLATILE 
3db0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
3dc0: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
3dd0: 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49  c LONG SQLITE_WI
3de0: 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c  N32_VOLATILE sql
3df0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
3e00: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
3e10: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
3e20: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
3e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
3e40: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3e50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
3e60: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
3e70: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
3e80: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
3e90: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3ea0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
3eb0: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
3ec0: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
3ed0: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
3ee0: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3ef0: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
3f00: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
3f10: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
3f20: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
3f30: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
3f40: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
3f50: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
3f60: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
3f70: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
3f80: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
3f90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
3fa0: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
3fb0: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
3fc0: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
3fd0: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3fe0: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
3ff0: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
4000: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
4010: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
4020: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4030: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
4040: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
4050: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
4060: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
4070: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
4080: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
4090: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
40a0: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
40b0: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
40c0: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69  Syscall[] = {.#i
40d0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
40e0: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
40f0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46  _WINRT.  { "AreF
4100: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
4110: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41        (SYSCALL)A
4120: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20  reFileApisANSI, 
4130: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4140: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
4150: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
4160: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4190: 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69  .#ifndef osAreFi
41a0: 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69  leApisANSI.#defi
41b0: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
41c0: 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ANSI ((BOOL(WINA
41d0: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
41e0: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
41f0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
4200: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4210: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4220: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4230: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
4250: 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72  YSCALL)CharLower
4260: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
4270: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4280: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
4290: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
42a0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
42c0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
42d0: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28   osCharLowerW ((
42e0: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
42f0: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
4300: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [1].pCurrent)..#
4310: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4320: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4330: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4340: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70  IDE).  { "CharUp
4350: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
4360: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
4370: 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20  rUpperW,        
4380: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4390: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
43a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
43b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
43e0: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70  define osCharUpp
43f0: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
4400: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
4410: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
4420: 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48  nt)..  { "CloseH
4430: 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20  andle",         
4440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f      (SYSCALL)Clo
4450: 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  seHandle,       
4460: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
4470: 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  ine osCloseHandl
4480: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
4490: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
44a0: 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[3].pCurrent).
44b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
44c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
44d0: 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  SI).  { "CreateF
44e0: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
44f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4500: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
4510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4520: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
4530: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4540: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4570: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4580: 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leA ((HANDLE(WIN
4590: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
45a0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
45b0: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
45c0: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
45d0: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
45e0: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
45f0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4600: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4610: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4620: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4630: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
4640: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4650: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c  ALL)CreateFileW,
4660: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4670: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
4680: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
4690: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
46a0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
46b0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
46c0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
46d0: 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41  CreateFileW ((HA
46e0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
46f0: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
4700: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
4710: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4720: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
4730: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4740: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4750: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
4760: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
4770: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
4780: 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20  NSI) && \.      
4790: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
47a0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
47b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
47c0: 53 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20  SIZE>0) && \.   
47d0: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
47e0: 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
47f0: 49 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65  INGA.  { "Create
4800: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
4810: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4820: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c  ateFileMappingA,
4830: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4840: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4850: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
4860: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4890: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
48a0: 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41  ileMappingA ((HA
48b0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
48c0: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
48d0: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
48e0: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
48f0: 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29  D,DWORD,LPCSTR))
4900: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
4910: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4920: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21  E_OS_WINCE || (!
4930: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4940: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
4950: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
4960: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  ) && \.        (
4970: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4980: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
4990: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
49a0: 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74  E>0)).  { "Creat
49b0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
49c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
49d0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
49e0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
49f0: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
4a00: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
4a10: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4a30: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4a40: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
4a50: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
4a60: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
4a70: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
4a80: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
4a90: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
4aa0: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
4ab0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
4ac0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4ad0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4ae0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4af0: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4b00: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
4b10: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4b20: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
4b30: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
4b40: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4b50: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
4b60: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4b70: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4b90: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4ba0: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
4bb0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
4bc0: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
4bd0: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
4be0: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
4bf0: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
4c00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4c10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4c20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4c30: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
4c40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4c50: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4c70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
4c80: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
4c90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4ca0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4cb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4cc0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4cd0: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
4ce0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
4cf0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  TR))aSyscall[9].
4d00: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4d10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4d20: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4d30: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4d50: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
4d60: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
4d70: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4d80: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
4d90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4da0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4db0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4dc0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4dd0: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
4de0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4df0: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4e00: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  10].pCurrent)..#
4e10: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4e20: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
4e30: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
4e40: 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54  , (SYSCALL)FileT
4e50: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4e60: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
4e70: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
4e80: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
4e90: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4eb0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4ec0: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
4ed0: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28  oLocalFileTime (
4ee0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
4ef0: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
4f00: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4f10: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4f20: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4f30: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4f40: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4f50: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
4f60: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4f70: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20  meToSystemTime, 
4f80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4f90: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
4fa0: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
4fb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4fd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4fe0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4ff0: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f  SystemTime ((BOO
5000: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
5010: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
5020: 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49        LPSYSTEMTI
5030: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d  ME))aSyscall[12]
5040: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5050: 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  "FlushFileBuffer
5060: 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  s",        (SYSC
5070: 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66  ALL)FlushFileBuf
5080: 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d  fers,        0 }
5090: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  ,..#define osFlu
50a0: 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28  shFileBuffers ((
50b0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
50c0: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  NDLE))aSyscall[1
50d0: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
50e0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
50f0: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5100: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
5110: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
5120: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
5130: 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20  essageA,        
5140: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5150: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
5160: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
5170: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5190: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51a0: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
51b0: 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geA ((DWORD(WINA
51c0: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
51d0: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
51e0: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
51f0: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
5200: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
5210: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5220: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5230: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5240: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
5250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5260: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
5270: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
5280: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
5290: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
52a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
52b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
52c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
52d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
52e0: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28  ormatMessageW ((
52f0: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
5300: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
5310: 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  RD,DWORD,LPWSTR,
5320: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5330: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
5340: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
5350: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
5360: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
5370: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
5380: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
5390: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
53a0: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
53c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65  ,.#else.  { "Fre
53d0: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
53e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
53f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5400: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5410: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5420: 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f  FreeLibrary ((BO
5430: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OL(WINAPI*)(HMOD
5440: 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ULE))aSyscall[16
5450: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5460: 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63   "GetCurrentProc
5470: 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53  essId",     (SYS
5480: 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50  CALL)GetCurrentP
5490: 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20  rocessId,     0 
54a0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
54b0: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
54c0: 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  d ((DWORD(WINAPI
54d0: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
54e0: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
54f0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5500: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
5510: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5520: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
5530: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
5540: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5550: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
5560: 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  A,       0 },.#e
5570: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
5580: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
5590: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
55a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
55c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
55d0: 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28  iskFreeSpaceA ((
55e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
55f0: 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  CSTR,LPDWORD,LPD
5600: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5610: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
5620: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
5630: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5640: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
5650: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
5660: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
5670: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5680: 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  DE).  { "GetDisk
5690: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
56a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
56b0: 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20  iskFreeSpaceW,  
56c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
56d0: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
56e0: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
56f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5720: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
5730: 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c  reeSpaceW ((BOOL
5740: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
5750: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
5760: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
5770: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
5780: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
5790: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
57a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
57b0: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
57c0: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
57d0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
57e0: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
57f0: 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esA,      0 },.#
5800: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5810: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
5820: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5850: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5860: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20  FileAttributesA 
5870: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5880: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
5890: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
58a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
58b0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
58c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
58d0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
58e0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
58f0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
5900: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5910: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
5920: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5930: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
5940: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5960: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5970: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
5980: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
5990: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
59a0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
59b0: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
59c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
59d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
59e0: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
59f0: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
5a00: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5a10: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
5a20: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
5a30: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5a40: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
5a50: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5a80: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
5a90: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
5aa0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
5ab0: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
5ac0: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
5ad0: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
5ae0: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
5af0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5b00: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5b10: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
5b20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5b30: 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c  ALL)GetFileSize,
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5b50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5b60: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
5b70: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5b80: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5b90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5ba0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5bb0: 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57  GetFileSize ((DW
5bc0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5bd0: 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79  DLE,LPDWORD))aSy
5be0: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
5bf0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5c00: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
5c10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5c20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5c30: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
5c40: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
5c50: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
5c60: 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d  ameA,        0 }
5c70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5c80: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
5c90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5ca0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5cb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5cc0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5cd0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5ce0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5cf0: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c  )(LPCSTR,DWORD,L
5d00: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
5d10: 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  LPSTR*))aSyscall
5d20: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
5d30: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5d40: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5d50: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
5d60: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5d70: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5d80: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5d90: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5da0: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5db0: 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meW,        0 },
5dc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5dd0: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
5de0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5df0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5e00: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5e10: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5e20: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20  etFullPathNameW 
5e30: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5e40: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c  (LPCWSTR,DWORD,L
5e50: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
5e60: 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61   LPWSTR*))aSysca
5e70: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
5e80: 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72  ..  { "GetLastEr
5e90: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
5ea0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73   (SYSCALL)GetLas
5eb0: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
5ec0: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5ed0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20   osGetLastError 
5ee0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5ef0: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5f00: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
5f10: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5f20: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
5f30: 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49  ENSION).#if SQLI
5f40: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
5f50: 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
5f60: 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
5f70: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
5f80: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20   on Windows CE. 
5f90: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
5fa0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5fb0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
5fc0: 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20  ocAddressA,     
5fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5fe0: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69   /* All other Wi
5ff0: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
6000: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
6010: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
6020: 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72    ** an ANSI str
6030: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
6040: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
6050: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47  etting */.  { "G
6060: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
6070: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6080: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
6090: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
60a0: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b  #endif.#else.  {
60b0: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
60c0: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
60d0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
60f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6100: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
6110: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
6120: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
6130: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
6140: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  R))aSyscall[27].
6150: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6160: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6170: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
6180: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
6190: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
61a0: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
61b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
61c0: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
61d0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
61e0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6200: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6210: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
6220: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
6230: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
6240: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
6250: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
6260: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
6270: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6280: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
6290: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
62a0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
62b0: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
62c0: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
62d0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
62e0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
62f0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6300: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
6310: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
6320: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
6330: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
6340: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
6350: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
6360: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
6370: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
63a0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
63b0: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
63c0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
63d0: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
63e0: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
63f0: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
6400: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6410: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
6420: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
6430: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
6440: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
6450: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
6460: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6470: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
6480: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6490: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
64b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
64c0: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
64d0: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
64e0: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
64f0: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
6500: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6510: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6520: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6530: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
6540: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
6550: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6560: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
6570: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
6580: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6590: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
65a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
65b0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
65d0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
65e0: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
65f0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6600: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
6610: 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72  Syscall[32].pCur
6620: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6630: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6640: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
6650: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6660: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
6670: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
6680: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6690: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
66a0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
66b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
66c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
66d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
66e0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
66f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
6700: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d  ID))aSyscall[33]
6710: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6720: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6730: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
6740: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
6750: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
6760: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
6770: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6780: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
6790: 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  A,           0 }
67a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
67b0: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
67c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
67d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
67e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
67f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6800: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28  GetVersionExA ((
6810: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
6820: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
6830: 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63  SIONINFOA))aSysc
6840: 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74  all[34].pCurrent
6850: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
6860: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
6870: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
6880: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
6890: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
68a0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
68b0: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
68c0: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
68d0: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
68e0: 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20  ionExW,         
68f0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6900: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
6910: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6920: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6940: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6950: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
6960: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
6970: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
6980: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29  OSVERSIONINFOW))
6990: 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75  aSyscall[35].pCu
69a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
69b0: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
69c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
69d0: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
69e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
69f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
6a00: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6a10: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6a20: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6a30: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36  E_T))aSyscall[36
6a40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6a50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6a60: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
6a70: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6a80: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
6a90: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
6aa0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6ab0: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6ad0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6af0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6b00: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
6b10: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
6b20: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
6b30: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6b40: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e  T))aSyscall[37].
6b50: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
6b60: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
6b70: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
6b80: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
6b90: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
6ba0: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
6bb0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6bc0: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6be0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6c00: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6c10: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
6c20: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6c30: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
6c40: 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [38].pCurrent)..
6c50: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6c70: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
6c80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6c90: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6ca0: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
6cb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6cc0: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
6cd0: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
6ce0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6cf0: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
6d00: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6d10: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
6d20: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6d30: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
6d40: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
6d50: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6d60: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
6d70: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6d80: 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65  scall[40].pCurre
6d90: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
6da0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
6db0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6dc0: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
6dd0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6de0: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
6df0: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
6e00: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
6e10: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
6e20: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
6e30: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6e40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6e50: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
6e60: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6e70: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
6e80: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6e90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6ea0: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6eb0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6ec0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6ee0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6ef0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
6f00: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6f10: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6f20: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6f30: 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43  )aSyscall[42].pC
6f40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6f50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
6f60: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6f70: 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61  T.  { "HeapCompa
6f80: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ct",            
6f90: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f   (SYSCALL)HeapCo
6fa0: 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20  mpact,          
6fb0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6fc0: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6fe0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7000: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7010: 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63  ine osHeapCompac
7020: 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a  t ((UINT(WINAPI*
7030: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29  )(HANDLE,DWORD))
7040: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
7050: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
7060: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
7070: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
7080: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
7090: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
70a0: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
70b0: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
70c0: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
70d0: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
70e0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
70f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
7100: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7110: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7140: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
7150: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
7160: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
7170: 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72  Syscall[44].pCur
7180: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7190: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
71a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
71b0: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
71c0: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
71d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
71e0: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
71f0: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
7200: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
7210: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
7220: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
7230: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7240: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
7250: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7260: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7280: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7290: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
72a0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
72b0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
72c0: 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65  scall[45].pCurre
72d0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
72e0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
72f0: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
7300: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7310: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
7320: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7330: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
7340: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
7350: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7370: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7380: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
7390: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
73a0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
73b0: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
73c0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
73d0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
73e0: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
73f0: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
7400: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7410: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
7420: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7430: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7440: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7460: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7480: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
7490: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
74a0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
74b0: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
74c0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
74d0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
74e0: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
74f0: 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72  yscall[47].pCurr
7500: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7510: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7520: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
7530: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
7540: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
7550: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
7560: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7570: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7590: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
75b0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
75c0: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
75d0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
75e0: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
75f0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7600: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
7610: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7620: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7630: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
7640: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7650: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7660: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
7670: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
7680: 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c     (!defined(SQL
7690: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
76a0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
76b0: 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d  _SIZE>0)).  { "M
76c0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
76d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
76e0: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
76f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7700: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7710: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7720: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7750: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
7760: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
7770: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
7780: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
7790: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
77a0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
77b0: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
77c0: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
77d0: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
77e0: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
77f0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
7800: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7810: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
7820: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
7830: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
7840: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
7850: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
7860: 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  t))aSyscall[50].
7870: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
7880: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
7890: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
78a0: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
78b0: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
78c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
78d0: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
78e0: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
78f0: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
7900: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
7910: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
7920: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
7930: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7940: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
7950: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
7960: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
7970: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
7980: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
7990: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
79a0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
79b0: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
79c0: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
79d0: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
79e0: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
79f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7a00: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
7a10: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
7a20: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7a30: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
7a40: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7a50: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d  LE))aSyscall[53]
7a60: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7a70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7a80: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7a90: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
7aa0: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7ab0: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
7ac0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ad0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7ae0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7af0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7b10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7b20: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
7b30: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
7b40: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
7b50: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
7b60: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
7b70: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
7b80: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7b90: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
7ba0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7bb0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
7bc0: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
7bd0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7be0: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c20: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7c30: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
7c40: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
7c50: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7c60: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  55].pCurrent).. 
7c70: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
7c80: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
7c90: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
7ca0: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
7cb0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7cc0: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7cd0: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
7ce0: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
7cf0: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
7d00: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
7d10: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
7d20: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7d30: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
7d40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7d50: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7d70: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
7d80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7d90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7da0: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7db0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7dc0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7de0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7df0: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
7e00: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7e10: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7e20: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7e30: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7e40: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7e50: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
7e60: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7e70: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7e80: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
7e90: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7ea0: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7eb0: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
7ec0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7ed0: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7ee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7ef0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7f10: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7f20: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
7f30: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7f40: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7f50: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7f60: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
7f70: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  PED))aSyscall[58
7f80: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7f90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7fa0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7fb0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
7fc0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7fd0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d  _SIZE>0.  { "Unm
7fe0: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7ff0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8000: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
8010: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8020: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
8030: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
8040: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8060: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8070: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
8080: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
8090: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
80a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  OID))aSyscall[59
80b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
80c0: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
80d0: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
80e0: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
80f0: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
8100: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
8110: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
8120: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
8130: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
8140: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
8150: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
8160: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
8170: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
8180: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
8190: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
81a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
81b0: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
81c0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
81d0: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
81e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
81f0: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
8200: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
8210: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
8220: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  PED))aSyscall[61
8230: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8240: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
8250: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
8260: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
8270: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
8280: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
8290: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
82a0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
82b0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
82c0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
82e0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
82f0: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
8300: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
8310: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
8320: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
8330: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
8340: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
8350: 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e  call[62].pCurren
8360: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
8370: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
8380: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
8390: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
83a0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
83b0: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
83c0: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
83d0: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
83e0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
83f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8400: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8410: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
8420: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8430: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8440: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
8450: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
8460: 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74  all[63].pCurrent
8470: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
8480: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69  S_WINCE.  { "Wai
8490: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
84a0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
84b0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
84c0: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
84d0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
84e0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
84f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8520: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8530: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
8540: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
8550: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
8560: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
8570: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
8580: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8590: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
85a0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
85b0: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
85c0: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
85d0: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
85e0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
85f0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
8600: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8610: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8620: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8630: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8640: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
8650: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
8660: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
8670: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
8680: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
8690: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
86a0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
86b0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
86c0: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
86d0: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
86e0: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
86f0: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
8700: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
8710: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8720: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
8730: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
8740: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8750: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8760: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8770: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
8780: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
8790: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
87a0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
87b0: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
87c0: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
87d0: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
87e0: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
87f0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8800: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8810: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8820: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8830: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8840: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
8850: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
8860: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
8870: 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30  ileFromApp,    0
8880: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
8890: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
88a0: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
88b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
88c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
88d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
88e0: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
88f0: 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28  romApp ((LPVOID(
8900: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8910: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c  ULONG,ULONG64, \
8920: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
8930: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
8940: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8950: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
8960: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
8970: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
8980: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32  CALL)CreateFile2
8990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
89a0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
89b0: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
89c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
89d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
89e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
89f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8a00: 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48  sCreateFile2 ((H
8a10: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
8a20: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
8a30: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
8a40: 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45      LPCREATEFILE
8a50: 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
8a60: 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b  ETERS))aSyscall[
8a70: 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  68].pCurrent)..#
8a80: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
8a90: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
8aa0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
8ab0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
8ac0: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
8ad0: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
8ae0: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
8af0: 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c  ibrary,     0 },
8b00: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
8b10: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
8b20: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8b30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8b40: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8b50: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
8b60: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8b70: 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  ry ((HMODULE(WIN
8b80: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c  API*)(LPCWSTR, \
8b90: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
8ba0: 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75  aSyscall[69].pCu
8bb0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8bc0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8bd0: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8be0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8bf0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
8c00: 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  64,          0 }
8c10: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8c20: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
8c30: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8c40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8c50: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8c60: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8c70: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28  GetTickCount64 (
8c80: 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50  (ULONGLONG(WINAP
8c90: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
8ca0: 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[70].pCurrent)
8cb0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
8cc0: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61  WINRT.  { "GetNa
8cd0: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8ce0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
8cf0: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8d00: 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  o,     0 },.#els
8d10: 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  e.  { "GetNative
8d20: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
8d30: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8d60: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74  #define osGetNat
8d70: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  iveSystemInfo ((
8d80: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
8d90: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
8da0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
8db0: 5b 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [71].pCurrent)..
8dc0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8dd0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
8de0: 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  I).  { "OutputDe
8df0: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
8e00: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8e10: 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20  tDebugStringA,  
8e20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8e30: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8e40: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
8e50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8e80: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8e90: 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44  ugStringA ((VOID
8ea0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
8eb0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70  ))aSyscall[72].p
8ec0: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
8ed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8ee0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
8ef0: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
8f00: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
8f10: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
8f20: 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20  StringW,      0 
8f30: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
8f40: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8f50: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8f60: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8f70: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8f80: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8f90: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8fa0: 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngW ((VOID(WINAP
8fb0: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
8fc0: 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65  scall[73].pCurre
8fd0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f  nt)..  { "GetPro
8fe0: 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20  cessHeap",      
8ff0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
9000: 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20  ProcessHeap,    
9010: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
9020: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73  ine osGetProcess
9030: 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49  Heap ((HANDLE(WI
9040: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
9050: 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65  scall[74].pCurre
9060: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
9070: 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65  OS_WINRT && (!de
9080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
9090: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
90a0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
90b0: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
90c0: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
90d0: 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74  , (SYSCALL)Creat
90e0: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
90f0: 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  App, 0 },.#else.
9100: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
9110: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
9120: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
9150: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
9160: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
9170: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
9180: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
9190: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
91a0: 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47  ATTRIBUTES,ULONG
91b0: 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52  ,ULONG64,LPCWSTR
91c0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70  ))aSyscall[75].p
91d0: 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20  Current)../*.** 
91e0: 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75  NOTE: On some su
91f0: 62 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65  b-platforms, the
9200: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70   InterlockedComp
9210: 61 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e  areExchange "fun
9220: 63 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20  ction".**       
9230: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
9240: 20 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73   macro that uses
9250: 20 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72   a compiler intr
9260: 69 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29  insic (e.g. x64)
9270: 2e 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f  ..**       So do
9280: 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65   not try to make
9290: 20 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20   this is into a 
92a0: 72 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65  redefinable inte
92b0: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  rface..*/.#if de
92c0: 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65  fined(Interlocke
92d0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
92e0: 29 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b  ).  { "Interlock
92f0: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
9300: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
9330: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
9340: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e  mpareExchange In
9350: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
9360: 45 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20  Exchange.#else. 
9370: 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43   { "InterlockedC
9380: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c  ompareExchange",
9390: 20 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c   (SYSCALL)Interl
93a0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
93b0: 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  ange, 0 },..#def
93c0: 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  ine osInterlocke
93d0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
93e0: 20 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29   ((LONG(WINAPI*)
93f0: 28 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20  (LONG \.        
9400: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
9410: 41 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e  ATILE*, LONG,LON
9420: 47 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e  G))aSyscall[76].
9430: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
9440: 20 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65   /* defined(Inte
9450: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
9460: 63 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20  change) */..#if 
9470: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9480: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9490: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
94a0: 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
94b0: 7b 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20  { "UuidCreate", 
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
94d0: 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74  YSCALL)UuidCreat
94e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
94f0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
9500: 75 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20  uidCreate",     
9510: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9520: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9530: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9540: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
9550: 6f 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52  osUuidCreate ((R
9560: 50 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e  PC_STATUS(RPC_EN
9570: 54 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79  TRY*)(UUID*))aSy
9580: 73 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65  scall[77].pCurre
9590: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
95a0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
95b0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
95c0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
95d0: 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64  E_UUID.  { "Uuid
95e0: 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
95f0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
9600: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
9610: 74 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  tial,   0 },.#el
9620: 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  se.  { "UuidCrea
9630: 74 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20  teSequential",  
9640: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
9670: 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43  .#define osUuidC
9680: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20  reateSequential 
9690: 5c 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f  \.        ((RPC_
96a0: 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59  STATUS(RPC_ENTRY
96b0: 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61  *)(UUID*))aSysca
96c0: 6c 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[78].pCurrent)
96d0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
96e0: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26  QLITE_NO_SYNC) &
96f0: 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  & SQLITE_MAX_MMA
9700: 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c  P_SIZE>0.  { "Fl
9710: 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  ushViewOfFile", 
9720: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9730: 4c 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c  L)FlushViewOfFil
9740: 65 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  e,        0 },.#
9750: 65 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56  else.  { "FlushV
9760: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
9770: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
9780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9790: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
97a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  f..#define osFlu
97b0: 73 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20  shViewOfFile \. 
97c0: 20 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49         ((BOOL(WI
97d0: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53  NAPI*)(LPCVOID,S
97e0: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
97f0: 37 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  79].pCurrent)..}
9800: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
9810: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
9820: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
9830: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
9840: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
9850: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
9860: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
9870: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
9880: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
9890: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
98a0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
98b0: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
98c0: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
98d0: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
98e0: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
98f0: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
9900: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
9910: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
9920: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
9930: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
9940: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
9950: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
9960: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
9970: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
9980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9990: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
99a0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
99b0: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
99c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
99d0: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
99e0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
99f0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
9a00: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
9a10: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
9a20: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9a30: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
9a40: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
9a50: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
9a60: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
9a70: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
9a80: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
9a90: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
9aa0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
9ab0: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
9ac0: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
9ad0: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
9ae0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9b00: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9b10: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9b20: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
9b30: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9b40: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
9b50: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
9b60: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
9b70: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
9b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9b90: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
9ba0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
9bb0: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
9bc0: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
9bd0: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
9be0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
9bf0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
9c00: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
9c10: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
9c20: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
9c30: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
9c40: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
9c50: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
9c60: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
9c70: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
9c80: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
9c90: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9ca0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
9cb0: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
9cc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
9cd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9ce0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
9cf0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
9d00: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
9d10: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
9d20: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9d30: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
9d40: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9d50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9d60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9d70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
9d90: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
9da0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
9db0: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
9dc0: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
9dd0: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
9de0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
9df0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
9e00: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
9e10: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
9e20: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
9e30: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
9e40: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
9e50: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
9e60: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
9e70: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
9e80: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
9e90: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
9ea0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
9eb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
9ec0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
9ed0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
9ee0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
9ef0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
9f00: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
9f10: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
9f20: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
9f30: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
9f40: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9f50: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
9f60: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
9f70: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
9f80: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
9f90: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
9fa0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
9fb0: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
9fc0: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
9fd0: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
9fe0: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
9ff0: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
a000: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
a010: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
a020: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
a030: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
a040: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
a050: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
a060: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
a070: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
a080: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
a090: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
a0a0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
a0b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
a0c0: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
a0d0: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
a0e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
a0f0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
a100: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
a110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
a120: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
a130: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
a140: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
a150: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
a160: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
a170: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
a180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
a190: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
a1a0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
a1b0: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
a1c0: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
a1d0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
a1e0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
a1f0: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
a200: 20 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70   compact it.  Up
a210: 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
a220: 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65  TE_OK will be re
a230: 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61  turned.  Upon fa
a240: 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66  ilure, one.** of
a250: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53   SQLITE_NOMEM, S
a260: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20  QLITE_ERROR, or 
a270: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
a280: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
a290: 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72  .  The.** "pnLar
a2a0: 67 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20  gest" argument, 
a2b0: 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c  if non-zero, wil
a2c0: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  l be used to ret
a2d0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
a2e0: 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63  the.** largest c
a2f0: 6f 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c  ommitted free bl
a300: 6f 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c  ock in the heap,
a310: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e   in bytes..*/.in
a320: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
a330: 63 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55  compact_heap(LPU
a340: 49 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a  INT pnLargest){.
a350: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a360: 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61  E_OK;.  UINT nLa
a370: 72 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e  rgest = 0;.  HAN
a380: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
a390: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a3a0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
a3b0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
a3c0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
a3d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
a3e0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
a3f0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
a400: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a410: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
a420: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a430: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
a440: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
a450: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
a460: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a470: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
a480: 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
a490: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
a4a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
a4b0: 66 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48  f( (nLargest=osH
a4c0: 65 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70  eapCompact(hHeap
a4d0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a4e0: 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29  EAP_FLAGS))==0 )
a4f0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  {.    DWORD last
a500: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
a510: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66  tError();.    if
a520: 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f  ( lastErrno==NO_
a530: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73  ERROR ){.      s
a540: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a550: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a560: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
a570: 28 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70  (no space), heap
a580: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
a590: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
a5a0: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Heap);.      rc 
a5b0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
a5c0: 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
a5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
a5e0: 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  g(SQLITE_ERROR, 
a5f0: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
a600: 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65  ompact (%lu), he
a610: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
a620: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
a630: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
a640: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
a650: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
a660: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
a670: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  lse.  sqlite3_lo
a680: 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  g(SQLITE_NOTFOUN
a690: 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  D, "failed to He
a6a0: 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d  apCompact, heap=
a6b0: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a6c0: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
a6d0: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
a6e0: 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66  NOTFOUND;.#endif
a6f0: 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74  .  if( pnLargest
a700: 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20   ) *pnLargest = 
a710: 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75  nLargest;.  retu
a720: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a730: 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76  If a Win32 nativ
a740: 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20  e heap has been 
a750: 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73  configured, this
a760: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
a770: 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73  ttempt to.** des
a780: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
a790: 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69  e it.  If the Wi
a7a0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
a7b0: 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20  is not isolated 
a7c0: 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71  and/or.** the sq
a7d0: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
a7e0: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  d() function doe
a7f0: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72  s not return zer
a800: 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  o, SQLITE_BUSY w
a810: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
a820: 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65  ed and no change
a830: 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  s will be made t
a840: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  o the Win32 nati
a850: 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20  ve heap..*/.int 
a860: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65  sqlite3_win32_re
a870: 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e  set_heap(){.  in
a880: 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  t rc;.  MUTEX_LO
a890: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
a8a0: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f  ex *pMaster; ) /
a8b0: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
a8c0: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
a8d0: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
a8e0: 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29  3_mutex *pMem; )
a8f0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79      /* The memsy
a900: 73 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  s static mutex *
a910: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
a920: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
a930: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a940: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a950: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55  _MASTER); ).  MU
a960: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20  TEX_LOGIC( pMem 
a970: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
a980: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a990: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a  _STATIC_MEM); ).
a9a0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a9b0: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
a9c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a9d0: 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77  enter(pMem);.  w
a9e0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
a9f0: 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d  ();.  if( winMem
aa00: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
aa10: 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  && winMemGetOwne
aa20: 64 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d  d() && sqlite3_m
aa30: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
aa40: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
aa50: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
aa60: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
aa70: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  no outstanding m
aa80: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
aa90: 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  s on.    ** the 
aaa0: 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e  heap.  Also, sin
aab0: 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74  ce both the mast
aac0: 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f  er and memsys lo
aad0: 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  cks are currentl
aae0: 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68  y.    ** being h
aaf0: 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74  eld by us, no ot
ab00: 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  her function (i.
ab10: 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  e. from another 
ab20: 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20  thread) should. 
ab30: 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f     ** be able to
ab40: 20 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65   even access the
ab50: 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20   heap.  Attempt 
ab60: 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  to destroy and r
ab70: 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20  ecreate our.    
ab80: 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33  ** isolated Win3
ab90: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f  2 native heap no
aba0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
abb0: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
abc0: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
abd0: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
abe0: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
abf0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
ac00: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
ac10: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65  ==0 );.    winMe
ac20: 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d  mShutdown(winMem
ac30: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
ac40: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
ac50: 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c  mGetHeap()==NULL
ac60: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ac70: 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28  !winMemGetOwned(
ac80: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
ac90: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
aca0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
acb0: 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74   rc = winMemInit
acc0: 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74  (winMemGetDataPt
acd0: 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r());.    assert
ace0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
acf0: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  || winMemGetHeap
ad00: 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()!=NULL );.    
ad10: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ad20: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
ad30: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
ad40: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ad50: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
ad60: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
ad70: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
ad80: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
ad90: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
ada0: 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64  ap cannot be mod
adb0: 69 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74  ified because it
adc0: 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a   may be in use..
add0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
ade0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
adf0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ae00: 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20  _leave(pMem);.  
ae10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ae20: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
ae30: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ae40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
ae50: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
ae60: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ae70: 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73  on outputs the s
ae80: 70 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20  pecified (ANSI) 
ae90: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69  string to the Wi
aea0: 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n32 debugger.** 
aeb0: 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
aec0: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
aed0: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
aee0: 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ug(const char *z
aef0: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
af00: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
af10: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
af20: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
af30: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
af40: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
af50: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
af60: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
af70: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
af80: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
af90: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
afa0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
afb0: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
afc0: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
afd0: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
afe0: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
aff0: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
b000: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
b010: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
b020: 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20  f( !zBuf ){.    
b030: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
b040: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
b050: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
b060: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b070: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
b080: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
b090: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
b0a0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
b0b0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
b0c0: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
b0d0: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
b0e0: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
b0f0: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
b100: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
b110: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
b120: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
b130: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
b140: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b150: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
b160: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
b170: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
b180: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
b190: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
b1a0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
b1b0: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
b1c0: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
b1d0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
b1e0: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
b1f0: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
b200: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
b210: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
b220: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
b230: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
b240: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
b250: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
b260: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
b270: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
b280: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
b290: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
b2a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
b2b0: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
b2c0: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
b2d0: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
b2e0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
b2f0: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
b300: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
b310: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
b320: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
b330: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
b340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
b350: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
b360: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
b370: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
b380: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
b390: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
b3a0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
b3b0: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
b3c0: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
b3d0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
b3e0: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
b3f0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
b400: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
b410: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
b420: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
b430: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
b440: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
b450: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
b460: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
b470: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
b480: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
b490: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
b4a0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
b4d0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b4e0: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
b4f0: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
b500: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
b510: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
b520: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
b530: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
b540: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
b550: 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  if.}..#if SQLITE
b560: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
b570: 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45  ADS>0 && !SQLITE
b580: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
b590: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b5a0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
b5b0: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44  E_THREADSAFE>0.D
b5c0: 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33  WORD sqlite3Win3
b5d0: 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62  2Wait(HANDLE hOb
b5e0: 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72  ject){.  DWORD r
b5f0: 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20  c;.  while( (rc 
b600: 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
b610: 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63  eObjectEx(hObjec
b620: 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20  t, INFINITE,.   
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54      TRUE))==WAIT
b660: 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29  _IO_COMPLETION )
b670: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  {}.  return rc;.
b680: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b690: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
b6a0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
b6b0: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
b6c0: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
b6d0: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
b6e0: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
b6f0: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
b700: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
b710: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
b720: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
b730: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
b740: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
b750: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
b760: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
b770: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
b780: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
b790: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
b7a0: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
b7b0: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
b7c0: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
b7d0: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
b7e0: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
b7f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
b800: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
b810: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
b820: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
b830: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
b840: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
b850: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b860: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
b870: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
b880: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a  leEx() API..*/..
b890: 23 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33  #if !SQLITE_WIN3
b8a0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23  2_GETVERSIONEX.#
b8b0: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b8c0: 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49    (1).#elif SQLI
b8d0: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
b8e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c  QLITE_OS_WINRT |
b8f0: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
b900: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b910: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
b920: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21  T()  (1).#elif !
b930: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b940: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23  IN32_HAS_WIDE).#
b950: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b960: 20 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65    (0).#else.# de
b970: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
b980: 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  (sqlite3_os_type
b990: 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f  ==2) || sqlite3_
b9a0: 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23  win32_is_nt()).#
b9b0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
b9c0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
b9d0: 6d 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63  mines if the mac
b9e0: 68 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20  hine is running 
b9f0: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e  a version of Win
ba00: 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  dows.** based on
ba10: 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a   the NT kernel..
ba20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
ba30: 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29  in32_is_nt(void)
ba40: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
ba50: 57 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINRT.  /*.  ** 
ba60: 4e 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20  NOTE: The WinRT 
ba70: 73 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20  sub-platform is 
ba80: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74  always assumed t
ba90: 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  o be based on th
baa0: 65 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20  e NT.  **       
bab0: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
bac0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53  eturn 1;.#elif S
bad0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
bae0: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
baf0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
bb00: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
bb10: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
bb20: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65   0)==0 ){.#if de
bb30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bb40: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
bb50: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
bb60: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
bb70: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
bb80: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
bb90: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
bba0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
bbb0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
bbc0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
bbd0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
bbe0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
bbf0: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
bc00: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
bc10: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
bc20: 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64  : 1, 0);.#elif d
bc30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
bc40: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
bc50: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57    OSVERSIONINFOW
bc60: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66   sInfo;.    sInf
bc70: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
bc80: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
bc90: 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74  Info);.    osGet
bca0: 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66  VersionExW(&sInf
bcb0: 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c  o);.    osInterl
bcc0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
bcd0: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
bce0: 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28  _type,.        (
bcf0: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
bd00: 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f  Id == VER_PLATFO
bd10: 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32  RM_WIN32_NT) ? 2
bd20: 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66   : 1, 0);.#endif
bd30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73  .  }.  return os
bd40: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bd50: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bd60: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
bd70: 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c  2)==2;.#elif SQL
bd80: 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72  ITE_TEST.  retur
bd90: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
bda0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
bdb0: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
bdc0: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65   2, 2)==2;.#else
bdd0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
bde0: 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72   All sub-platfor
bdf0: 6d 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74  ms where the Get
be00: 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75  VersionEx[AW] fu
be10: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a  nctions are.  **
be20: 20 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65         deprecate
be30: 64 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73  d are always ass
be40: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
be50: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
be60: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  l..  */.  return
be70: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
be80: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
be90: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
bea0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
beb0: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
bec0: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
bed0: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
bee0: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
bef0: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
bf00: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bf10: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bf20: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bf30: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bf40: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bf50: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bf60: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bf70: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bf80: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bf90: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bfa0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bfb0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bfc0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
bfd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bfe0: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
bff0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
c000: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
c010: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
c020: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
c030: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
c040: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
c050: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
c060: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
c070: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
c080: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
c090: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
c0a0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c0b0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
c0c0: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
c0d0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
c0e0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
c0f0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
c100: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
c110: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
c120: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
c130: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
c140: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
c150: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
c160: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
c170: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
c180: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
c190: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
c1a0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
c1b0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
c1c0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
c1d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
c1e0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
c1f0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
c200: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
c210: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
c220: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
c230: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
c240: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
c250: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
c260: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
c270: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
c280: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
c290: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
c2a0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c2b0: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
c2c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
c2d0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
c2e0: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
c2f0: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
c300: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c310: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c320: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
c330: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
c340: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
c350: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
c360: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
c370: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c380: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
c390: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
c3a0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
c3b0: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
c3c0: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
c3d0: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
c3e0: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
c3f0: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
c400: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
c410: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
c420: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c430: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
c440: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
c450: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
c460: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c470: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
c480: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
c490: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
c4a0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c4b0: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c4c0: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
c4d0: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
c4e0: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
c4f0: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
c500: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
c510: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c520: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
c530: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
c540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
c550: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
c560: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c570: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
c580: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
c590: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
c5a0: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
c5b0: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
c5c0: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
c5d0: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
c5e0: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
c600: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
c610: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
c620: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
c630: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
c650: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
c660: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
c670: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c680: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
c690: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
c6a0: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
c6b0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
c6c0: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
c6d0: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
c6e0: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
c6f0: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
c700: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
c710: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
c720: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c730: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
c740: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
c750: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
c760: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
c770: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
c780: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
c790: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
c7a0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c7b0: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
c7c0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c7d0: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
c7e0: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
c7f0: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
c800: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
c810: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c820: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
c830: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
c840: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c850: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c860: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c870: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
c880: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c8a0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c8b0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c8c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c8d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
c8e0: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
c8f0: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
c900: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
c910: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
c920: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
c930: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
c940: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
c950: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c960: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
c970: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
c980: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
c990: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
c9a0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c9b0: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c9c0: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c9d0: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c9e0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c9f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
ca00: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
ca10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
ca20: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
ca30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
ca40: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
ca50: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
ca60: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
ca70: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
ca80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
ca90: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
caa0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
cab0: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
cac0: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
cad0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
cae0: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
caf0: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
cb00: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
cb10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
cb20: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
cb30: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
cb40: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
cb50: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
cb60: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
cb70: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
cb80: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
cb90: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
cba0: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
cbb0: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
cbc0: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
cbd0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
cbe0: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
cbf0: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
cc00: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
cc40: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
cc50: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
cc60: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
cc70: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
cc80: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
cc90: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
cca0: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
ccb0: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
ccc0: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
ccd0: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
cce0: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
ccf0: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
cd00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
cd10: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
cd20: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
cd30: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
cd40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cd50: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
cd60: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
cd70: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
cd80: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
cd90: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cda0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
cdb0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cdc0: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
cdd0: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
cde0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cdf0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
ce00: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
ce10: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
ce20: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
ce30: 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47  Heap (%lu)", osG
ce40: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
ce50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ce60: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
ce70: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
ce80: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
ce90: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
cea0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
ceb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
cec0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
ced0: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
cee0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
cef0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
cf00: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
cf10: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
cf20: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
cf30: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
cf40: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
cf50: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
cf60: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
cf70: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
cf80: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
cf90: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
cfa0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
cfb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
cfc0: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
cfd0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
cfe0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
cff0: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
d000: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
d010: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
d020: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
d030: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
d040: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
d050: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
d060: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
d070: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
d080: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
d090: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
d0a0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
d0b0: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
d0c0: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
d0d0: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
d0e0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d0f0: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
d100: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
d110: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
d120: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
d130: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
d140: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
d150: 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  ).    assert( os
d160: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
d170: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
d180: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
d190: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
d1a0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
d1b0: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
d1c0: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
d1d0: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
d1e0: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
d1f0: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
d200: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
d210: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
d220: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
d230: 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  y (%lu), heap=%p
d240: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d250: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
d260: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
d270: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
d280: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
d290: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
d2a0: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
d2b0: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
d2c0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
d2d0: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
d2e0: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
d2f0: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
d300: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
d310: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
d320: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
d330: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
d340: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
d350: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
d360: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
d370: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
d380: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
d390: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
d3a0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d3b0: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
d3c0: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
d3d0: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
d3e0: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
d3f0: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
d400: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
d410: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
d420: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
d430: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
d440: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
d450: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
d460: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
d470: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
d480: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
d490: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
d4a0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
d4b0: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
d4c0: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
d4d0: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
d4e0: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
d4f0: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
d500: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
d510: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
d520: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
d530: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
d540: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
d550: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
d560: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
d570: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
d580: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
d590: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d5a0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
d5b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
d5c0: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
d5d0: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
d5e0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ode..**.** Space
d5f0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
d600: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d610: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d620: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d630: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
d640: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
d650: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
d660: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ext){.  int nCha
d670: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
d680: 65 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20  eText;..  nChar 
d690: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
d6a0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
d6b0: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e   0, zText, -1, N
d6c0: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
d6d0: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
d6e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d6f0: 57 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74  WideText = sqlit
d700: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
d710: 68 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  har*sizeof(WCHAR
d720: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
d730: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
d740: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d750: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
d760: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
d770: 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20  UTF8, 0, zText, 
d780: 2d 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20  -1, zWideText,. 
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d7b0: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
d7c0: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
d7d0: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54  ite3_free(zWideT
d7e0: 65 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54  ext);.    zWideT
d7f0: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
d800: 65 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b  eturn zWideText;
d810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d820: 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  t a Microsoft Un
d830: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20  icode string to 
d840: 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  UTF-8..**.** Spa
d850: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d860: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d870: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d8a0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
d8b0: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
d8c0: 54 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79  Text){.  int nBy
d8d0: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  te;.  char *zTex
d8e0: 74 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  t;..  nByte = os
d8f0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d900: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d910: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30  zWideText, -1, 0
d920: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d930: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d940: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d950: 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69  }.  zText = sqli
d960: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d970: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54  Byte );.  if( zT
d980: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d990: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
d9a0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d9b0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d9c0: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d9d0: 74 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42  t, -1, zText, nB
d9e0: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
da10: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
da20: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
da30: 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65  (zText);.    zTe
da40: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
da50: 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f  turn zText;.}../
da60: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
da70: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
da80: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
da90: 2c 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49  , using the ANSI
daa0: 20 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20   or OEM.** code 
dab0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
dac0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
dad0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
dae0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
daf0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
db00: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
db10: 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  R winMbcsToUnico
db20: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
db30: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
db40: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
db50: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54  .  LPWSTR zMbcsT
db60: 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ext;.  int codep
db70: 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20  age = useAnsi ? 
db80: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
db90: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
dba0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
dbb0: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
dbc0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c   zText, -1, NULL
dbd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbf0: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
dc00: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
dc10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dc20: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54   0;.  }.  zMbcsT
dc30: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ext = sqlite3Mal
dc40: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
dc50: 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
dc60: 20 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d    if( zMbcsText=
dc70: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dc80: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
dc90: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
dca0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
dcb0: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
dcc0: 7a 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20  zMbcsText,.     
dcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dce0: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
dcf0: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
dd00: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
dd10: 5f 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29  _free(zMbcsText)
dd20: 3b 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20  ;.    zMbcsText 
dd30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
dd40: 6e 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a  n zMbcsText;.}..
dd50: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
dd60: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
dd70: 65 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  e string to a mu
dd80: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
dd90: 65 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73  er string,.** us
dda0: 69 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20  ing the ANSI or 
ddb0: 4f 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a  OEM code page..*
ddc0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
ddd0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
dde0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
ddf0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
de00: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
de10: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
de20: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
de30: 54 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e  TR zWideText, in
de40: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
de50: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
de60: 2a 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f  *zText;.  int co
de70: 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69  depage = useAnsi
de80: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
de90: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
dea0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
deb0: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
dec0: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
ded0: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
dee0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
def0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
df00: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20  ;.  }.  zText = 
df10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
df20: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
df30: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
df40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
df50: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
df60: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
df70: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
df80: 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78  deText, -1, zTex
df90: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
dfc0: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
dfd0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
dfe0: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
dff0: 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d    zText = 0;.  }
e000: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b  .  return zText;
e010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
e020: 74 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  t a multi-byte c
e030: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
e040: 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20  to UTF-8..**.** 
e050: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
e060: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
e070: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
e080: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
e090: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
e0a0: 68 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74  har *winMbcsToUt
e0b0: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
e0c0: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
e0d0: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
e0e0: 74 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  tUtf8;.  LPWSTR 
e0f0: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
e100: 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54  pWide = winMbcsT
e110: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20  oUnicode(zText, 
e120: 75 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20  useAnsi);.  if( 
e130: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
e140: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e150: 0a 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77  .  zTextUtf8 = w
e160: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e170: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
e180: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
e190: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
e1a0: 65 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  extUtf8;.}../*.*
e1b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
e1c0: 38 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  8 string to a mu
e1d0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
e1e0: 65 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  er string..**.**
e1f0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
e200: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
e210: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
e220: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
e230: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
e240: 63 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d  char *winUtf8ToM
e250: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
e260: 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e  zText, int useAn
e270: 73 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65  si){.  char *zTe
e280: 78 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  xtMbcs;.  LPWSTR
e290: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
e2a0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38  mpWide = winUtf8
e2b0: 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29  ToUnicode(zText)
e2c0: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
e2d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e2e0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
e2f0: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
e300: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
e310: 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71  , useAnsi);.  sq
e320: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
e330: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
e340: 54 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  TextMbcs;.}../*.
e350: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e360: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e370: 74 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  the winUtf8ToUni
e380: 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  code() function.
e390: 0a 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74  .*/.LPWSTR sqlit
e3a0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
e3b0: 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  _unicode(const c
e3c0: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66  har *zText){.#if
e3d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e3e0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e3f0: 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  ( !zText ){.    
e400: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
e410: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
e420: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
e430: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
e440: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
e450: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
e460: 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74  itialize() ) ret
e470: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
e480: 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f  return winUtf8To
e490: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a  Unicode(zText);.
e4a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e4b0: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e4c0: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69  r for the winUni
e4d0: 63 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e  codeToUtf8() fun
e4e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e4f0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e  sqlite3_win32_un
e500: 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50  icode_to_utf8(LP
e510: 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29  CWSTR zWideText)
e520: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e530: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e540: 0a 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78  .  if( !zWideTex
e550: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e560: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e570: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e590: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e5a0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e5b0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e5c0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e5d0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e5e0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
e5f0: 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a  (zWideText);.}..
e600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e610: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e620: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e630: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e640: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e650: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e660: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
e670: 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20  *zText){.#ifdef 
e680: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e690: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e6a0: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e6b0: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e6c0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e6d0: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e6e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e6f0: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e700: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e710: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e720: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e730: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e740: 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c  (zText, osAreFil
e750: 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a  eApisANSI());.}.
e760: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
e770: 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20   public wrapper 
e780: 66 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54  for the winMbcsT
e790: 6f 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e  oUtf8() function
e7a0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
e7b0: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
e7c0: 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63  _utf8_v2(const c
e7d0: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
e7e0: 75 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66  useAnsi){.#ifdef
e7f0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e800: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e810: 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f  zText ){.    (vo
e820: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e830: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e840: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
e850: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e860: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
e870: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
e880: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
e890: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
e8a0: 75 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  urn winMbcsToUtf
e8b0: 38 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69  8(zText, useAnsi
e8c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e8d0: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e8e0: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e8f0: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
e900: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e910: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
e920: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
e930: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23   char *zText){.#
e940: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e950: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e960: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e970: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e980: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e9a0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e9b0: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e9c0: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e9d0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e9e0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e9f0: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
ea00: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73  ToMbcs(zText, os
ea10: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
ea20: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
ea30: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
ea40: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
ea50: 6e 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75  nUtf8ToMbcs() fu
ea60: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
ea70: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
ea80: 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63  tf8_to_mbcs_v2(c
ea90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
eaa0: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
eab0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
eac0: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
ead0: 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20   if( !zText ){. 
eae0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
eaf0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
eb00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
eb10: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
eb20: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
eb30: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
eb40: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
eb50: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
eb60: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66  .  return winUtf
eb70: 38 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75  8ToMbcs(zText, u
eb80: 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  seAnsi);.}../*.*
eb90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eba0: 73 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69  sets the data di
ebb0: 72 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74  rectory or the t
ebc0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
ebd0: 72 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74  ry based on.** t
ebe0: 68 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75  he provided argu
ebf0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65  ments.  The type
ec00: 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62   argument must b
ec10: 65 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  e 1 in order to 
ec20: 73 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20  set the.** data 
ec30: 64 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69  directory or 2 i
ec40: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
ec50: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72  he temporary dir
ec60: 65 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61  ectory.  The zVa
ec70: 6c 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  lue.** argument 
ec80: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
ec90: 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20  he directory to 
eca0: 75 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  use.  The return
ecb0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a   value will be.*
ecc0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  * SQLITE_OK if s
ecd0: 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e  uccessful..*/.in
ece0: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
ecf0: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57  set_directory(DW
ed00: 4f 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54  ORD type, LPCWST
ed10: 52 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61  R zValue){.  cha
ed20: 72 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20  r **ppDirectory 
ed30: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
ed40: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
ed50: 54 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  T.  int rc = sql
ed60: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
ed70: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
ed80: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
ed90: 20 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49    if( type==SQLI
eda0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
edb0: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
edc0: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
edd0: 3d 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  = &sqlite3_data_
ede0: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c  directory;.  }el
edf0: 73 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c  se if( type==SQL
ee00: 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44  ITE_WIN32_TEMP_D
ee10: 49 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b  IRECTORY_TYPE ){
ee20: 0a 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79  .    ppDirectory
ee30: 20 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70   = &sqlite3_temp
ee40: 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a  _directory;.  }.
ee50: 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72    assert( !ppDir
ee60: 65 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d  ectory || type==
ee70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54  SQLITE_WIN32_DAT
ee80: 41 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  A_DIRECTORY_TYPE
ee90: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79  .          || ty
eea0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
eeb0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
eec0: 54 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65  TYPE.  );.  asse
eed0: 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79  rt( !ppDirectory
eee0: 20 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65   || sqlite3Memde
eef0: 62 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69  bugHasType(*ppDi
ef00: 72 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45  rectory, MEMTYPE
ef10: 5f 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20  _HEAP) );.  if( 
ef20: 70 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  ppDirectory ){. 
ef30: 20 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55     char *zValueU
ef40: 74 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tf8 = 0;.    if(
ef50: 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75   zValue && zValu
ef60: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56  e[0] ){.      zV
ef70: 61 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e  alueUtf8 = winUn
ef80: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c  icodeToUtf8(zVal
ef90: 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  ue);.      if ( 
efa0: 7a 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b  zValueUtf8==0 ){
efb0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
efc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
efd0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
efe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
eff0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b  e(*ppDirectory);
f000: 0a 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72  .    *ppDirector
f010: 79 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a  y = zValueUtf8;.
f020: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f030: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  E_OK;.  }.  retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
f050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65  .}../*.** The re
f060: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69  turn value of wi
f070: 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
f080: 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
f090: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
f0a0: 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
f0b0: 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
f0c0: 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
f0d0: 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
f0e0: 73 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f  s truncated)..*/
f0f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
f100: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44  etLastErrorMsg(D
f110: 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20  WORD lastErrno, 
f120: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
f130: 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d  zBuf){.  /* Form
f140: 61 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e  atMessage return
f150: 73 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  s 0 on failure. 
f160: 20 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20   Otherwise it.  
f170: 2a 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ** returns the n
f180: 75 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20  umber of TCHARs 
f190: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f  written to the o
f1a0: 75 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65  utput.  ** buffe
f1b0: 72 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65  r, excluding the
f1c0: 20 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c   terminating nul
f1d0: 6c 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44  l char..  */.  D
f1e0: 57 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a  WORD dwLen = 0;.
f1f0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30    char *zOut = 0
f200: 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  ;..  if( osIsNT(
f210: 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) ){.#if SQLITE_
f220: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48  OS_WINRT.    WCH
f230: 41 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c  AR zTempWide[SQL
f240: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
f250: 52 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20  RMSG_CHARS+1];. 
f260: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
f270: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
f280: 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f  AT_MESSAGE_FROM_
f290: 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20  SYSTEM |.       
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
f2c0: 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45  SAGE_IGNORE_INSE
f2d0: 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RTS,.           
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20    NULL,.        
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a       lastErrno,.
f320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f330: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
f340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 65               zTe
f360: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
f390: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
f3a0: 52 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  RS,.            
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c   0);.#else.    L
f3d0: 50 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20  PWSTR zTempWide 
f3e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65  = NULL;.    dwLe
f3f0: 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73  n = osFormatMess
f400: 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53  ageW(FORMAT_MESS
f410: 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46  AGE_ALLOCATE_BUF
f420: 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20  FER |.          
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
f450: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
f460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
f480: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
f490: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
f4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4b0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
f4e0: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 28 4c 50 57 53 54 52 29 20 26 7a 54      (LPWSTR) &zT
f530: 65 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20  empWide,.       
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 20 20 20 20 20 30 29 3b 0a 23 65 6e 64 69 66        0);.#endif
f580: 0a 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e  .    if( dwLen >
f590: 20 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61   0 ){.      /* a
f5a0: 6c 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72  llocate a buffer
f5b0: 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20   and convert to 
f5c0: 55 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71  UTF8 */.      sq
f5d0: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
f5e0: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
f5f0: 7a 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64  zOut = winUnicod
f600: 65 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64  eToUtf8(zTempWid
f610: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
f620: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
f630: 28 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  ();.#if !SQLITE_
f640: 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f  OS_WINRT.      /
f650: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
f660: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
f670: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
f680: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
f690: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69  ocalFree(zTempWi
f6a0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
f6b0: 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
f6c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
f6d0: 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
f6e0: 68 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c  har *zTemp = NUL
f6f0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
f700: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28  sFormatMessageA(
f710: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
f720: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
f730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
f750: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
f760: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
f790: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
f7a0: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
f7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7e0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
f7f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
f810: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
f830: 4c 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20  LPSTR) &zTemp,. 
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
f860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f870: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
f880: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
f890: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
f8a0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
f8b0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
f8c0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
f8d0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
f8e0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
f8f0: 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  Out = winMbcsToU
f900: 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65  tf8(zTemp, osAre
f910: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
f920: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e  .      sqlite3En
f930: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
f940: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
f950: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
f960: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
f970: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
f980: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
f990: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  (zTemp);.    }. 
f9a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
f9b0: 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20  0 == dwLen ){.  
f9c0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
f9d0: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
f9e0: 4f 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25  OsError 0x%lx (%
f9f0: 6c 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  lu)", lastErrno,
fa00: 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d   lastErrno);.  }
fa10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70  else{.    /* cop
fa20: 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e  y a maximum of n
fa30: 42 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74  Buf chars to out
fa40: 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  put buffer */.  
fa50: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
fa60: 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
fa70: 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20  %s", zOut);.    
fa80: 2f 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38  /* free the UTF8
fa90: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73   buffer */.    s
faa0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
fab0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
fac0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54  0;.}../*.**.** T
fad0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77  his function - w
fae0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
faf0: 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65  () - is only eve
fb00: 72 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65  r called via the
fb10: 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67   macro.** winLog
fb20: 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Error()..**.** T
fb30: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69  his routine is i
fb40: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
fb50: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
fb60: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a  an OS function..
fb70: 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73  ** It logs a mes
fb80: 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74  sage using sqlit
fb90: 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e  e3_log() contain
fba0: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
fbb0: 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f  value of.** erro
fbc0: 72 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70  r code and, if p
fbd0: 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d  ossible, the hum
fbe0: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69  an-readable equi
fbf0: 76 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46  valent from.** F
fc00: 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a  ormatMessage..**
fc10: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
fc20: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
fc30: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
fc40: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
fc50: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
fc60: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
fc70: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
fc80: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
fc90: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
fca0: 4e 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  N)..** The two s
fcb0: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
fcc0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
fcd0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
fce0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
fcf0: 2a 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65  * failed and the
fd00: 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
fd10: 2d 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66  -system path, if
fd20: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
fd30: 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62   winLogError(a,b
fd40: 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72  ,c,d)   winLogEr
fd50: 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c  rorAtLine(a,b,c,
fd60: 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  d,__LINE__).stat
fd70: 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72  ic int winLogErr
fd80: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
fd90: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
fda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
fdb0: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
fdc0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
fdd0: 45 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  Errno,          
fde0: 20 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c        /* Win32 l
fdf0: 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63  ast error */.  c
fe00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
fe10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
fe20: 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e  * Name of OS fun
fe30: 63 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65  ction that faile
fe40: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
fe50: 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20  r *zPath,       
fe60: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70         /* File p
fe70: 61 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77  ath associated w
fe80: 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69  ith error */.  i
fe90: 6e 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20  nt iLine        
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
feb0: 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75  * Source line nu
fec0: 6d 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72  mber where error
fed0: 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a   occurred */.){.
fee0: 20 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d    char zMsg[500]
fef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ff00: 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61    /* Human reada
ff10: 62 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a  ble error text *
ff20: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ff50: 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30  ter */..  zMsg[0
ff60: 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c  ] = 0;.  winGetL
ff70: 61 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74  astErrorMsg(last
ff80: 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d  Errno, sizeof(zM
ff90: 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73  sg), zMsg);.  as
ffa0: 73 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53  sert( errcode!=S
ffb0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66  QLITE_OK );.  if
ffc0: 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61  ( zPath==0 ) zPa
ffd0: 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69  th = "";.  for(i
ffe0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
fff0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20  Msg[i]!='\r' && 
10000 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69  zMsg[i]!='\n'; i
10010 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20  ++){}.  zMsg[i] 
10020 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  = 0;.  sqlite3_l
10030 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20  og(errcode,.    
10040 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20    "os_win.c:%d: 
10050 28 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25  (%lu) %s(%s) - %
10060 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c  s",.      iLine,
10070 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e   lastErrno, zFun
10080 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20  c, zPath, zMsg. 
10090 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
100a0 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
100b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  The number of ti
100c0 6d 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46  mes that a ReadF
100d0 69 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65  ile(), WriteFile
100e0 28 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69  (), and DeleteFi
100f0 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  le().** will be 
10100 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e  retried followin
10110 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f  g a locking erro
10120 72 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75  r - probably cau
10130 73 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69  sed by.** antivi
10140 72 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41  rus software.  A
10150 6c 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20  lso the initial 
10160 64 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65  delay before the
10170 20 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a   first retry..**
10180 20 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65   The delay incre
10190 61 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69  ases linearly wi
101a0 74 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a  th each retry..*
101b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
101c0 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
101d0 52 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  RY.# define SQLI
101e0 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
101f0 45 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23  ETRY 10.#endif.#
10200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49  ifndef SQLITE_WI
10210 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
10220 44 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53  DELAY.# define S
10230 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
10240 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35  R_RETRY_DELAY 25
10250 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69  .#endif.static i
10260 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79  nt winIoerrRetry
10270 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   = SQLITE_WIN32_
10280 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61  IOERR_RETRY;.sta
10290 74 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72  tic int winIoerr
102a0 52 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c  RetryDelay = SQL
102b0 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
102c0 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a  RETRY_DELAY;../*
102d0 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72  .** The "winIoer
102e0 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
102f0 6f 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  o is used to det
10300 65 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74  ermine if a part
10310 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72  icular I/O.** er
10320 72 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65  ror code obtaine
10330 64 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72  d via GetLastErr
10340 6f 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65  or() is eligible
10350 20 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20   to be retried. 
10360 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65   It.** must acce
10370 70 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  pt the error cod
10380 65 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f  e DWORD as its o
10390 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64  nly argument and
103a0 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a   should return.*
103b0 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  * non-zero if th
103c0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
103d0 74 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74  transient in nat
103e0 75 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72  ure and the oper
103f0 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73  ation.** respons
10400 69 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74  ible for generat
10410 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
10420 20 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63   error might suc
10430 63 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a  ceed upon being.
10440 2a 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65  ** retried.  The
10450 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
10460 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62  s macro should b
10470 65 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a  e a variable..**
10480 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  .** Additionally
10490 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20  , a macro named 
104a0 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
104b0 79 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e  y2" may be defin
104c0 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73  ed.  If it.** is
104d0 20 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c   defined, it wil
104e0 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f  l be consulted o
104f0 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63  nly when the mac
10500 72 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  ro "winIoerrCanR
10510 65 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e  etry1".** return
10520 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69  s zero.  The "wi
10530 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22  nIoerrCanRetry2"
10540 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65   macro is comple
10550 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e  tely optional an
10560 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64  d.** may be used
10570 20 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69   to include addi
10580 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64  tional error cod
10590 65 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68  es in the set th
105a0 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73  at should.** res
105b0 75 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69  ult in the faili
105c0 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e  ng I/O operation
105d0 20 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62   being retried b
105e0 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49  y the caller.  I
105f0 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68  f.** defined, th
10600 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  e "winIoerrCanRe
10610 74 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74  try2" macro must
10620 20 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61   exhibit externa
10630 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69  l semantics.** i
10640 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73  dentical to thos
10650 65 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65  e of the "winIoe
10660 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63  rrCanRetry1" mac
10670 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ro..*/.#if !defi
10680 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52  ned(winIoerrCanR
10690 65 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77  etry1).#define w
106a0 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31  inIoerrCanRetry1
106b0 28 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52  (a) (((a)==ERROR
106c0 5f 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20  _ACCESS_DENIED) 
106d0 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20         || \.    
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
10700 45 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49  ERROR_SHARING_VI
10710 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c  OLATION)    || \
10720 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10740 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f  (a)==ERROR_LOCK_
10750 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20  VIOLATION)      
10760 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20   || \.          
10770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10780 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f      ((a)==ERROR_
10790 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20  DEV_NOT_EXIST)  
107a0 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
107d0 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c  RROR_NETNAME_DEL
107e0 45 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a  ETED)      || \.
107f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
10810 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49  a)==ERROR_SEM_TI
10820 4d 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20  MEOUT)          
10830 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10850 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e     ((a)==ERROR_N
10860 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42  ETWORK_UNREACHAB
10870 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  LE)).#endif../*.
10880 2a 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65  ** If a ReadFile
10890 28 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28  () or WriteFile(
108a0 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  ) error occurs, 
108b0 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
108c0 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66  ine.** to see if
108d0 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65   it should be re
108e0 74 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54  tried.  Return T
108f0 52 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52  RUE to retry.  R
10900 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74  eturn FALSE.** t
10910 6f 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61  o give up with a
10920 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74  n error..*/.stat
10930 69 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49  ic int winRetryI
10940 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72  oerr(int *pnRetr
10950 79 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72  y, DWORD *pError
10960 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f  ){.  DWORD e = o
10970 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
10980 0a 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e  .  if( *pnRetry>
10990 3d 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29  =winIoerrRetry )
109a0 7b 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72  {.    if( pError
109b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f   ){.      *pErro
109c0 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20  r = e;.    }.   
109d0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
109e0 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e   if( winIoerrCan
109f0 52 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20  Retry1(e) ){.   
10a00 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
10a10 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74  leep(winIoerrRet
10a20 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65  ryDelay*(1+*pnRe
10a30 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e  try));.    ++*pn
10a40 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72  Retry;.    retur
10a50 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66  n 1;.  }.#if def
10a60 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e  ined(winIoerrCan
10a70 52 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69  Retry2).  else i
10a80 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  f( winIoerrCanRe
10a90 74 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73  try2(e) ){.    s
10aa0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
10ab0 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79  ep(winIoerrRetry
10ac0 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72  Delay*(1+*pnRetr
10ad0 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65  y));.    ++*pnRe
10ae0 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  try;.    return 
10af0 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  1;.  }.#endif.  
10b00 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
10b10 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
10b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10b30 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f  ../*.** Log a I/
10b40 4f 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70  O error retry ep
10b50 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  isode..*/.static
10b60 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72   void winLogIoer
10b70 72 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e  r(int nRetry, in
10b80 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
10b90 20 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73   nRetry ){.    s
10ba0 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
10bb0 45 5f 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20  E_NOTICE,.      
10bc0 22 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f  "delayed %dms fo
10bd0 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63  r lock/sharing c
10be0 6f 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20  onflict at line 
10bf0 25 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f  %d",.      winIo
10c00 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52  errRetryDelay*nR
10c10 65 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f  etry*(nRetry+1)/
10c20 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b  2, lineno.    );
10c30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
10c40 69 73 20 23 69 66 20 64 6f 65 73 20 6e 6f 74 20  is #if does not 
10c50 72 65 6c 79 20 6f 6e 20 74 68 65 20 53 51 4c 49  rely on the SQLI
10c60 54 45 5f 4f 53 5f 57 49 4e 43 45 20 64 65 66 69  TE_OS_WINCE defi
10c70 6e 65 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ne because the.*
10c80 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
10c90 73 65 63 74 69 6f 6e 20 69 6e 20 22 64 61 74 65  section in "date
10ca0 2e 63 22 20 63 61 6e 6e 6f 74 20 75 73 65 20 69  .c" cannot use i
10cb0 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
10cc0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
10cd0 4f 43 41 4c 54 49 4d 45 29 20 26 26 20 64 65 66  OCALTIME) && def
10ce0 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
10cf0 20 26 26 20 5c 0a 20 20 20 20 28 21 64 65 66 69   && \.    (!defi
10d00 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f  ned(SQLITE_MSVC_
10d10 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c  LOCALTIME_API) |
10d20 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  | !SQLITE_MSVC_L
10d30 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 0a 2f 2a  OCALTIME_API)./*
10d40 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54  .** The MSVC CRT
10d50 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d   on Windows CE m
10d60 61 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f  ay not have a lo
10d70 63 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69  caltime() functi
10d80 6f 6e 2e 0a 2a 2a 20 53 6f 20 64 65 66 69 6e 65  on..** So define
10d90 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
10da0 2f 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 74 69  /.#  include <ti
10db0 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20  me.h>.struct tm 
10dc0 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69  *__cdecl localti
10dd0 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20  me(const time_t 
10de0 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73  *t).{.  static s
10df0 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49  truct tm y;.  FI
10e00 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b  LETIME uTm, lTm;
10e10 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54  .  SYSTEMTIME pT
10e20 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  m;.  sqlite3_int
10e30 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
10e40 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
10e50 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
10e60 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
10e70 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
10e80 28 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78  (DWORD)(t64 & 0x
10e90 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d  FFFFFFFF);.  uTm
10ea0 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d  .dwHighDateTime=
10eb0 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20   (DWORD)(t64 >> 
10ec0 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  32);.  osFileTim
10ed0 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65  eToLocalFileTime
10ee0 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f  (&uTm,&lTm);.  o
10ef0 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
10f00 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29  mTime(&lTm,&pTm)
10f10 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20  ;.  y.tm_year = 
10f20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30  pTm.wYear - 1900
10f30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70  ;.  y.tm_mon = p
10f40 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20  Tm.wMonth - 1;. 
10f50 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d   y.tm_wday = pTm
10f60 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79  .wDayOfWeek;.  y
10f70 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_mday = pTm.w
10f80 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72  Day;.  y.tm_hour
10f90 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20   = pTm.wHour;.  
10fa0 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77  y.tm_min = pTm.w
10fb0 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73  Minute;.  y.tm_s
10fc0 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64  ec = pTm.wSecond
10fd0 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d  ;.  return &y;.}
10fe0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
10ff0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a  ITE_OS_WINCE./**
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20  *******.** This 
11050 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  section contains
11060 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20   code for WinCE 
11070 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  only..*/.#define
11080 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49   HANDLE_TO_WINFI
11090 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29  LE(a) (winFile*)
110a0 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e  &((char*)a)[-(in
110b0 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69  t)offsetof(winFi
110c0 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63  le,h)]../*.** Ac
110d0 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20  quire a lock on 
110e0 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a  the handle h.*/.
110f0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
11100 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41  eMutexAcquire(HA
11110 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52  NDLE h){.   DWOR
11120 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b  D dwErr;.   do {
11130 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73  .     dwErr = os
11140 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
11150 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29  ect(h, INFINITE)
11160 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77  ;.   } while (dw
11170 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45  Err != WAIT_OBJE
11180 43 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d  CT_0 && dwErr !=
11190 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29   WAIT_ABANDONED)
111a0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  ;.}./*.** Releas
111b0 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65  e a lock acquire
111c0 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41  d by winceMutexA
111d0 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66  cquire().*/.#def
111e0 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ine winceMutexRe
111f0 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65  lease(h) Release
11200 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20  Mutex(h)../*.** 
11210 43 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78  Create the mutex
11220 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f   and shared memo
11230 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  ry used for lock
11240 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ing in the file.
11250 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
11260 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
11270 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  t winceCreateLoc
11280 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  k(const char *zF
11290 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65  ilename, winFile
112a0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53   *pFile){.  LPWS
112b0 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54  TR zTok;.  LPWST
112c0 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44  R zName;.  DWORD
112d0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f   lastErrno;.  BO
112e0 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c  OL bLogged = FAL
112f0 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74  SE;.  BOOL bInit
11300 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d   = TRUE;..  zNam
11310 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  e = winUtf8ToUni
11320 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
11330 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
11340 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66  ){.    /* out of
11350 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72   memory */.    r
11360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11370 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
11380 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
11390 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ize the local lo
113a0 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73  ckdata */.  mems
113b0 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  et(&pFile->local
113c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c  , 0, sizeof(pFil
113d0 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f  e->local));..  /
113e0 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61  * Replace the ba
113f0 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74  ckslashes from t
11400 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
11410 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a  lowercase it.  *
11420 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75  * to derive a mu
11430 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a  tex name. */.  z
11440 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65  Tok = osCharLowe
11450 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  rW(zName);.  for
11460 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29   (;*zTok;zTok++)
11470 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20  {.    if (*zTok 
11480 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d  == '\\') *zTok =
11490 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   '_';.  }..  /* 
114a0 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20  Create/open the 
114b0 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20  named mutex */. 
114c0 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
114d0 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28   osCreateMutexW(
114e0 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61  NULL, FALSE, zNa
114f0 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c  me);.  if (!pFil
11500 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20  e->hMutex){.    
11510 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11520 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
11530 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  r();.    sqlite3
11540 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20  _free(zName);.  
11550 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
11560 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
11570 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  R, pFile->lastEr
11580 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
11590 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
115a0 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20  ceCreateLock1", 
115b0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
115c0 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68  .  /* Acquire th
115d0 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63  e mutex before c
115e0 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77  ontinuing */.  w
115f0 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65  inceMutexAcquire
11600 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11610 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65  ..  /* Since the
11620 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20   names of named 
11630 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f  mutexes, semapho
11640 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e  res, file mappin
11650 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20  gs etc are.  ** 
11660 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20  case-sensitive, 
11670 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f  take advantage o
11680 66 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63  f that by upperc
11690 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20  asing the mutex 
116a0 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73  name.  ** and us
116b0 69 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20  ing that as the 
116c0 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69  shared filemappi
116d0 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ng name..  */.  
116e0 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61  osCharUpperW(zNa
116f0 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53  me);.  pFile->hS
11700 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65  hared = osCreate
11710 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56  FileMappingW(INV
11720 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
11730 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  E, NULL,.       
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11760 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c   PAGE_READWRITE,
11770 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11780 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20  Lock),.         
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
117b0 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  Name);..  /* Set
117c0 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
117d0 69 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65  icates we're the
117e0 20 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65   first to create
117f0 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69   the memory so i
11800 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a  t.  ** must be z
11810 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20  ero-initialized 
11820 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  */.  lastErrno =
11830 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
11840 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72  );.  if (lastErr
11850 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45  no == ERROR_ALRE
11860 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20  ADY_EXISTS){.   
11870 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a   bInit = FALSE;.
11880 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
11890 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f  ree(zName);..  /
118a0 2a 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65  * If we succeede
118b0 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20  d in making the 
118c0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
118d0 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f  ndle, map it. */
118e0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53  .  if( pFile->hS
118f0 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69  hared ){.    pFi
11900 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69  le->shared = (wi
11910 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69  nceLock*)osMapVi
11920 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
11930 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  hShared,.       
11940 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52        FILE_MAP_R
11950 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49  EAD|FILE_MAP_WRI
11960 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66  TE, 0, 0, sizeof
11970 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20  (winceLock));.  
11980 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20    /* If mapping 
11990 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68  failed, close th
119a0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
119b0 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65  handle and erase
119c0 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21   it */.    if( !
119d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b  pFile->shared ){
119e0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
119f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
11a00 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
11a10 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
11a20 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
11a30 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
11a60 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  2", zFilename);.
11a70 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20        bLogged = 
11a80 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c  TRUE;.      osCl
11a90 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
11aa0 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  >hShared);.     
11ab0 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20   pFile->hShared 
11ac0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
11ad0 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65  }..  /* If share
11ae0 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e  d memory could n
11af0 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74  ot be created, t
11b00 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75  hen close the mu
11b10 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a  tex and fail */.
11b20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
11b30 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  ared==NULL ){.  
11b40 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29    if( !bLogged )
11b50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
11b60 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
11b70 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c  rrno;.      winL
11b80 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
11b90 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  OERR, pFile->las
11ba0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
11bb0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65            "wince
11bc0 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46  CreateLock3", zF
11bd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
11be0 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a  bLogged = TRUE;.
11bf0 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d      }.    winceM
11c00 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
11c10 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
11c20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
11c30 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
11c40 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20    pFile->hMutex 
11c50 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75  = NULL;.    retu
11c60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
11c70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
11c80 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64  alize the shared
11c90 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65   memory if we're
11ca0 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a   supposed to */.
11cb0 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20    if( bInit ){. 
11cc0 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d     memset(pFile-
11cd0 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65  >shared, 0, size
11ce0 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
11cf0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
11d00 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
11d10 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
11d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11d30 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68  /*.** Destroy th
11d40 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c  e part of winFil
11d50 65 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74  e that deals wit
11d60 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f  h wince locks.*/
11d70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
11d80 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69  ceDestroyLock(wi
11d90 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
11da0 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74   if (pFile->hMut
11db0 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75  ex){.    /* Acqu
11dc0 69 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f  ire the mutex */
11dd0 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41  .    winceMutexA
11de0 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
11df0 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  utex);..    /* T
11e00 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
11e10 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61  cks should proba
11e20 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65  bly assert in de
11e30 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68  bug mode, but th
11e40 65 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f  ey.       are to
11e50 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65   cleanup in case
11e60 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69   any locks remai
11e70 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20  ned open */.    
11e80 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11e90 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20  .nReaders){.    
11ea0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
11eb0 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  >nReaders --;.  
11ec0 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
11ed0 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
11ee0 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ed){.      pFile
11ef0 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
11f00 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
11f10 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
11f20 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
11f30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
11f40 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11f50 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
11f60 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
11f70 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29  ocal.bExclusive)
11f80 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11f90 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
11fa0 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d  e = FALSE;.    }
11fb0 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65  ..    /* De-refe
11fc0 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20  rence and close 
11fd0 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20  our copy of the 
11fe0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61  shared memory ha
11ff0 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e  ndle */.    osUn
12000 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
12010 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20  ile->shared);.  
12020 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
12030 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b  pFile->hShared);
12040 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69  ..    /* Done wi
12050 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  th the mutex */.
12060 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65      winceMutexRe
12070 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
12080 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  tex);.    osClos
12090 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
120a0 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c  Mutex);.    pFil
120b0 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c  e->hMutex = NULL
120c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
120d0 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
120e0 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65   of the LockFile
120f0 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77  () API of Window
12100 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74  s for CE.*/.stat
12110 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63  ic BOOL winceLoc
12120 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c  kFile(.  LPHANDL
12130 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52  E phFile,.  DWOR
12140 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f  D dwFileOffsetLo
12150 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  w,.  DWORD dwFil
12160 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44  eOffsetHigh,.  D
12170 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
12180 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20  tesToLockLow,.  
12190 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42  DWORD nNumberOfB
121a0 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29  ytesToLockHigh.)
121b0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
121c0 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  le = HANDLE_TO_W
121d0 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a  INFILE(phFile);.
121e0 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d    BOOL bReturn =
121f0 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45   FALSE;..  UNUSE
12200 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69  D_PARAMETER(dwFi
12210 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20  leOffsetHigh);. 
12220 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12230 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  R(nNumberOfBytes
12240 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  ToLockHigh);..  
12250 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
12260 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
12270 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
12280 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
12290 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69  ex);..  /* Wanti
122a0 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
122b0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64  lock? */.  if (d
122c0 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
122d0 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
122e0 46 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20  FIRST.       && 
122f0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12300 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  LockLow == (DWOR
12310 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a  D)SHARED_SIZE){.
12320 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73      if (pFile->s
12330 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20  hared->nReaders 
12340 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73  == 0 && pFile->s
12350 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
12360 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20  e == 0){.       
12370 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
12380 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
12390 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ;.       pFile->
123a0 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65  local.bExclusive
123b0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20   = TRUE;.       
123c0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
123d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
123e0 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  Want a read-only
123f0 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65   lock? */.  else
12400 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
12410 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  tLow == (DWORD)S
12420 48 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20  HARED_FIRST &&. 
12430 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65            nNumbe
12440 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f  rOfBytesToLockLo
12450 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20  w == 1){.    if 
12460 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
12470 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
12480 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
12490 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b  ocal.nReaders ++
124a0 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c  ;.      if (pFil
124b0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
124c0 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20  s == 1){.       
124d0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
124e0 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20  nReaders ++;.   
124f0 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75     }.      bRetu
12500 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
12510 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20  .  }..  /* Want 
12520 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20  a pending lock? 
12530 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
12540 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
12550 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
12560 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12570 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12580 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
12590 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70  {.    /* If no p
125a0 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20  ending lock has 
125b0 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74  been acquired, t
125c0 68 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a  hen acquire it *
125d0 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  /.    if (pFile-
125e0 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e  >shared->bPendin
125f0 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  g == 0) {.      
12600 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
12610 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a  Pending = TRUE;.
12620 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
12630 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  al.bPending = TR
12640 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  UE;.      bRetur
12650 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
12660 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
12670 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20   reserved lock? 
12680 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
12690 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
126a0 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
126b0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
126c0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
126d0 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  esToLockLow == 1
126e0 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  ){.    if (pFile
126f0 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
12700 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ved == 0) {.    
12710 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12720 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55  >bReserved = TRU
12730 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
12740 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20  local.bReserved 
12750 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
12760 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12770 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65    }.  }..  wince
12780 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
12790 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
127a0 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d  eturn bReturn;.}
127b0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
127c0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
127d0 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20   UnlockFile API 
127e0 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
127f0 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
12800 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65   winceUnlockFile
12810 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
12820 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  ile,.  DWORD dwF
12830 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  ileOffsetLow,.  
12840 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
12850 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
12860 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12870 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f  UnlockLow,.  DWO
12880 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  RD nNumberOfByte
12890 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b  sToUnlockHigh.){
128a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
128b0 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
128c0 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
128d0 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
128e0 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
128f0 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
12900 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
12910 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12920 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
12930 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20  oUnlockHigh);.. 
12940 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75   if (!pFile->hMu
12950 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45  tex) return TRUE
12960 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63  ;.  winceMutexAc
12970 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
12980 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  tex);..  /* Rele
12990 61 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c  asing a reader l
129a0 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  ock or an exclus
129b0 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  ive lock */.  if
129c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
129d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52  w == (DWORD)SHAR
129e0 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f  ED_FIRST){.    /
129f0 2a 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e  * Did we have an
12a00 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f   exclusive lock?
12a10 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
12a20 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
12a30 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ive){.      asse
12a40 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  rt(nNumberOfByte
12a50 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12a60 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49  (DWORD)SHARED_SI
12a70 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ZE);.      pFile
12a80 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
12a90 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ve = FALSE;.    
12aa0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12ab0 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  >bExclusive = FA
12ac0 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
12ad0 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
12ae0 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20  ..    /* Did we 
12af0 6a 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64  just have a read
12b00 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  er lock? */.    
12b10 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e  else if (pFile->
12b20 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b  local.nReaders){
12b30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e  .      assert(nN
12b40 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
12b50 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  lockLow == (DWOR
12b60 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20  D)SHARED_SIZE.  
12b70 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e             || nN
12b80 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e  umberOfBytesToUn
12b90 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20  lockLow == 1);. 
12ba0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
12bb0 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20  l.nReaders --;. 
12bc0 20 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e       if (pFile->
12bd0 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d  local.nReaders =
12be0 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20  = 0).      {.   
12bf0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12c00 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  ed->nReaders --;
12c10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12c20 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12c30 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
12c40 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69  eleasing a pendi
12c50 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73  ng lock */.  els
12c60 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
12c70 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
12c80 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
12c90 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
12ca0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
12cb0 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
12cc0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12cd0 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
12ce0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
12cf0 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
12d00 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
12d10 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d  ared->bPending =
12d20 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52   FALSE;.      bR
12d30 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12d40 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c    }.  }.  /* Rel
12d50 65 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65  easing a reserve
12d60 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  d lock */.  else
12d70 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
12d80 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52  tLow == (DWORD)R
12d90 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20  ESERVED_BYTE.   
12da0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
12db0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
12dc0 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
12dd0 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12de0 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20  .bReserved) {.  
12df0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
12e00 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  .bReserved = FAL
12e10 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
12e20 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
12e30 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
12e40 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
12e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
12e60 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
12e70 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
12e80 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
12e90 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f  n;.}./*.** End o
12ea0 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f  f the special co
12eb0 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a  de for wince.***
12ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
12f10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
12f20 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WINCE */../*.** 
12f30 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69  Lock a file regi
12f40 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  on..*/.static BO
12f50 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a  OL winLockFile(.
12f60 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
12f70 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73  e,.  DWORD flags
12f80 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
12f90 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
12fa0 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
12fb0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12fc0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
12fd0 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
12fe0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
12ff0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
13000 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
13010 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
13020 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
13030 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
13040 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
13050 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  le..  */.  retur
13060 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  n winceLockFile(
13070 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f  phFile, offsetLo
13080 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20  w, offsetHigh,. 
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
130b0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
130c0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73  ;.#else.  if( os
130d0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  IsNT() ){.    OV
130e0 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
130f0 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
13100 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
13110 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
13120 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
13130 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
13140 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
13150 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
13160 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28  rn osLockFileEx(
13170 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  *phFile, flags, 
13180 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20  0, numBytesLow, 
13190 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f  numBytesHigh, &o
131a0 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  vlp);.  }else{. 
131b0 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b     return osLock
131c0 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66  File(*phFile, of
131d0 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48  fsetLow, offsetH
131e0 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  igh, numBytesLow
131f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13200 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
13210 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  High);.  }.#endi
13220 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  f.}../*.** Unloc
13230 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e  k a file region.
13240 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  . */.static BOOL
13250 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a   winUnlockFile(.
13260 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
13270 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65  e,.  DWORD offse
13280 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66  tLow,.  DWORD of
13290 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
132a0 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  D numBytesLow,. 
132b0 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48   DWORD numBytesH
132c0 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54  igh.){.#if SQLIT
132d0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a  E_OS_WINCE.  /*.
132e0 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f    ** NOTE: Windo
132f0 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64  ws CE is handled
13300 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72   differently her
13310 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f  e due its lack o
13320 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a  f the Win32.  **
13330 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63         API Unloc
13340 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65  kFile..  */.  re
13350 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  turn winceUnlock
13360 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66  File(phFile, off
13370 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
13380 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  gh,.            
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
133a0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
133b0 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20  esHigh);.#else. 
133c0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
133d0 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
133e0 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ovlp;.    memset
133f0 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f  (&ovlp, 0, sizeo
13400 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
13410 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20      ovlp.Offset 
13420 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20  = offsetLow;.   
13430 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
13440 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20   = offsetHigh;. 
13450 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f     return osUnlo
13460 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
13470 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
13480 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
13490 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
134a0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
134b0 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  lockFile(*phFile
134c0 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
134d0 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
134e0 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
13500 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d  mBytesHigh);.  }
13510 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a  .#endif.}../****
13520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13560 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65  *********.** The
13570 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72   next group of r
13580 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e  outines implemen
13590 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  t the I/O method
135a0 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  s specified.** b
135b0 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  y the sqlite3_io
135c0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e  _methods object.
135d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
135e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
135f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13620 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63  ../*.** Some Mic
13630 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73  rosoft compilers
13640 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e   lack this defin
13650 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ition..*/.#ifnde
13660 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  f INVALID_SET_FI
13670 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66  LE_POINTER.# def
13680 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  ine INVALID_SET_
13690 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44  FILE_POINTER ((D
136a0 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a  WORD)-1).#endif.
136b0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
136c0 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
136d0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e   of the file han
136e0 64 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68  dle passed as th
136f0 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d  e first.** argum
13700 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f  ent to offset iO
13710 66 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65  ffset within the
13720 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73   file. If succes
13730 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  sful, return 0..
13740 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
13750 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  t pFile->lastErr
13760 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f  no and return no
13770 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
13780 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c  c int winSeekFil
13790 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  e(winFile *pFile
137a0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
137b0 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53  iOffset){.#if !S
137c0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
137d0 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b   LONG upperBits;
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32   /* Most sig. 32
13800 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66   bits of new off
13810 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f  set */.  LONG lo
13820 77 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  werBits;        
13830 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73           /* Leas
13840 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
13850 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
13860 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20    DWORD dwRet;  
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
13890 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f  ned by SetFilePo
138a0 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f  inter() */.  DWO
138b0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  RD lastErrno;   
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
138d0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
138e0 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
138f0 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   */..  OSTRACE((
13900 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f  "SEEK file=%p, o
13910 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70  ffset=%lld\n", p
13920 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74  File->h, iOffset
13930 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73  ));..  upperBits
13940 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73   = (LONG)((iOffs
13950 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66  et>>32) & 0x7fff
13960 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69  ffff);.  lowerBi
13970 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66  ts = (LONG)(iOff
13980 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
13990 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64  );..  /* API odd
139a0 69 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66  ity: If successf
139b0 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74  ul, SetFilePoint
139c0 65 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64  er() returns a d
139d0 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  word.  ** contai
139e0 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33  ning the lower 3
139f0 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65  2-bits of the ne
13a00 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f  w file-offset. O
13a10 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a  r, if it fails,.
13a20 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20    ** it returns 
13a30 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45  INVALID_SET_FILE
13a40 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65  _POINTER. Howeve
13a50 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d  r according to M
13a60 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49  SDN,.  ** INVALI
13a70 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
13a80 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61  ER may also be a
13a90 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65   valid new offse
13aa0 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69  t. So to determi
13ab0 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  ne.  ** whether 
13ac0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74  an error has act
13ad0 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20  ually occurred, 
13ae0 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73  it is also neces
13af0 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a  sary to call.  *
13b00 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  * GetLastError()
13b10 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d  ..  */.  dwRet =
13b20 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
13b30 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65  r(pFile->h, lowe
13b40 72 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74  rBits, &upperBit
13b50 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  s, FILE_BEGIN);.
13b60 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49  .  if( (dwRet==I
13b70 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
13b80 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26  POINTER.      &&
13b90 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
13ba0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
13bb0 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a  !=NO_ERROR)) ){.
13bc0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13bd0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
13be0 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
13bf0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
13c00 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  EEK, pFile->last
13c10 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
13c20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46         "winSeekF
13c30 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ile", pFile->zPa
13c40 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  th);.    OSTRACE
13c50 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
13c60 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
13c70 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  _SEEK\n", pFile-
13c80 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
13c90 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41   1;.  }..  OSTRA
13ca0 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
13cb0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
13cc0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
13cd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
13ce0 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65  e.  /*.  ** Same
13cf0 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70   as above, excep
13d00 74 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c  t that this impl
13d10 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73  ementation works
13d20 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f   for WinRT..  */
13d30 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45  ..  LARGE_INTEGE
13d40 52 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  R x;            
13d50 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
13d60 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20  ffset */.  BOOL 
13d70 62 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  bRet;           
13d80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
13d90 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
13da0 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
13db0 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50  () */..  x.QuadP
13dc0 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20  art = iOffset;. 
13dd0 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c   bRet = osSetFil
13de0 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65  ePointerEx(pFile
13df0 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f  ->h, x, 0, FILE_
13e00 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62  BEGIN);..  if(!b
13e10 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  Ret){.    pFile-
13e20 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
13e30 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
13e40 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
13e50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b  QLITE_IOERR_SEEK
13e60 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
13e70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
13e80 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65      "winSeekFile
13e90 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
13ea0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13eb0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63  SEEK file=%p, rc
13ec0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  =SQLITE_IOERR_SE
13ed0 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  EK\n", pFile->h)
13ee0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
13ef0 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
13f00 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
13f10 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
13f20 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
13f30 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
13f40 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
13f50 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
13f60 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
13f70 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65  ces to VFS helpe
13f80 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66  r methods used f
13f90 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  or memory mapped
13fa0 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
13fb0 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28   int winMapfile(
13fc0 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65  winFile*, sqlite
13fd0 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63  3_int64);.static
13fe0 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c   int winUnmapfil
13ff0 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e  e(winFile*);.#en
14000 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
14010 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49   a file..**.** I
14020 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68  t is reported th
14030 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  at an attempt to
14040 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20   close a handle 
14050 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a  might sometimes.
14060 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69  ** fail.  This i
14070 73 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f  s a very unreaso
14080 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75  nable result, bu
14090 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74  t Windows is not
140a0 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65  orious.** for be
140b0 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65  ing unreasonable
140c0 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75   so I do not dou
140d0 62 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  bt that it might
140e0 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20   happen.  If.** 
140f0 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c  the close fails,
14100 20 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30   we pause for 10
14110 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
14120 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41  nd try again.  A
14130 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f  s.** many as MX_
14140 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74  CLOSE_ATTEMPT at
14150 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20  tempts to close 
14160 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d  the handle are m
14170 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69  ade before.** gi
14180 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75  ving up and retu
14190 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
141a0 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c  */.#define MX_CL
141b0 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74  OSE_ATTEMPT 3.st
141c0 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73  atic int winClos
141d0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
141e0 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63  id){.  int rc, c
141f0 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c  nt = 0;.  winFil
14200 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
14210 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65  ile*)id;..  asse
14220 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66  rt( id!=0 );.#if
14230 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14240 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70  _WAL.  assert( p
14250 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  File->pShm==0 );
14260 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
14270 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c  ( pFile->h!=NULL
14280 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e   && pFile->h!=IN
14290 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
142a0 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  UE );.  OSTRACE(
142b0 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  ("CLOSE pid=%lu,
142c0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
142d0 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %p\n",.         
142e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
142f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
14300 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23  , pFile->h));..#
14310 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
14320 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55  AP_SIZE>0.  winU
14330 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
14340 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20  .#endif..  do{. 
14350 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48     rc = osCloseH
14360 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
14370 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65  .    /* Simulate
14380 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63  IOError( rc=0; c
14390 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  nt=MX_CLOSE_ATTE
143a0 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68  MPT; ); */.  }wh
143b0 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b  ile( rc==0 && ++
143c0 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41  cnt < MX_CLOSE_A
143d0 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74  TTEMPT && (sqlit
143e0 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
143f0 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53  00), 1) );.#if S
14400 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23  QLITE_OS_WINCE.#
14410 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c  define WINCE_DEL
14420 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33  ETION_ATTEMPTS 3
14430 0a 20 20 7b 0a 20 20 20 20 77 69 6e 56 66 73 41  .  {.    winVfsA
14440 70 70 44 61 74 61 20 2a 70 41 70 70 44 61 74 61  ppData *pAppData
14450 20 3d 20 28 77 69 6e 56 66 73 41 70 70 44 61 74   = (winVfsAppDat
14460 61 2a 29 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  a*)pFile->pVfs->
14470 70 41 70 70 44 61 74 61 3b 0a 20 20 20 20 69 66  pAppData;.    if
14480 28 20 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c  ( pAppData==NULL
14490 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62   || !pAppData->b
144a0 4e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  NoLock ){.      
144b0 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b  winceDestroyLock
144c0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
144d0 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
144e0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29  zDeleteOnClose )
144f0 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
14500 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20  0;.    while(.  
14510 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74           osDelet
14520 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44  eFileW(pFile->zD
14530 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30  eleteOnClose)==0
14540 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65  .        && osGe
14550 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
14560 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
14570 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66  nClose)!=0xfffff
14580 66 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63  fff.        && c
14590 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c  nt++ < WINCE_DEL
145a0 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20  ETION_ATTEMPTS. 
145b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
145c0 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
145d0 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20  (100);  /* Wait 
145e0 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20  a little before 
145f0 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a  trying again */.
14600 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
14610 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44  3_free(pFile->zD
14620 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20  eleteOnClose);. 
14630 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
14640 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  rc ){.    pFile-
14650 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20  >h = NULL;.  }. 
14660 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
14670 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  ;.  OSTRACE(("CL
14680 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  OSE pid=%lu, pFi
14690 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
146a0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
146b0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
146c0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
146d0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  ile, pFile->h, r
146e0 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  c ? "ok" : "fail
146f0 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
14700 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  rc ? SQLITE_OK. 
14710 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e             : win
14720 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
14730 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47  IOERR_CLOSE, osG
14740 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c 6f           "winClo
14770 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  se", pFile->zPat
14780 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  h);.}../*.** Rea
14790 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69  d data from a fi
147a0 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  le into a buffer
147b0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
147c0 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79  _OK if all.** by
147d0 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75  tes were read su
147e0 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53  ccessfully and S
147f0 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61  QLITE_IOERR if a
14800 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
14810 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
14820 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20   int winRead(.  
14830 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14840 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
14850 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
14860 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14880 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74  /* Write content
14890 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
148a0 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20  r */.  int amt, 
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
148d0 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a  ytes to read */.
148e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
148f0 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20  offset       /* 
14900 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74  Begin reading at
14910 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a   this offset */.
14920 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
14930 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69  S_WINCE && !defi
14940 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
14950 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
14960 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65    OVERLAPPED ove
14970 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20  rlapped;        
14980 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20    /* The offset 
14990 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f  for ReadFile. */
149a0 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c  .#endif.  winFil
149b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
149c0 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c  ile*)id;  /* fil
149d0 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57  e handle */.  DW
149e0 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20  ORD nRead;      
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a00 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
14a10 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
14a20 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  rom file */.  in
14a30 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20  t nRetry = 0;   
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a50 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79   Number of retry
14a60 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
14a70 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  id!=0 );.  asser
14a80 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
14a90 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
14aa0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
14ab0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
14ac0 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a  TE_IOERR_READ);.
14ad0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
14ae0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
14af0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66  %p, file=%p, buf
14b00 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25  fer=%p, amount=%
14b10 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
14b20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f  "offset=%lld, lo
14b30 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43  ck=%d\n", osGetC
14b40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14b50 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20  ), pFile,.      
14b60 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
14b70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74  Buf, amt, offset
14b80 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
14b90 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  e));..#if SQLITE
14ba0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
14bb0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
14bc0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
14bd0 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
14be0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
14bf0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
14c00 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
14c10 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
14c20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
14c30 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
14c40 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
14c50 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
14c60 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
14c70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
14c80 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
14c90 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
14ca0 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
14cb0 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  amt);.      OSTR
14cc0 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20  ACE(("READ-MMAP 
14cd0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14ce0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14cf0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14d00 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
14d10 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14d20 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14d30 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
14d40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14d50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14d60 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
14d70 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
14d80 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
14d90 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
14da0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
14db0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
14dc0 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
14dd0 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
14de0 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
14df0 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
14e00 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
14e10 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
14e20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
14e30 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14e40 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
14e50 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
14e60 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20  ERLAPPED).  if( 
14e70 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
14e80 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20  e, offset) ){.  
14e90 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
14ea0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
14eb0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
14ec0 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a  SQLITE_FULL\n",.
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14ee0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14ef0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14f00 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14f10 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
14f20 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f  .  }.  while( !o
14f30 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
14f40 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
14f50 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c  nRead, 0) ){.#el
14f60 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65  se.  memset(&ove
14f70 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65  rlapped, 0, size
14f80 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
14f90 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66  .  overlapped.Of
14fa0 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66  fset = (LONG)(of
14fb0 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66  fset & 0xfffffff
14fc0 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64  f);.  overlapped
14fd0 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
14fe0 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
14ff0 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
15000 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61  .  while( !osRea
15010 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  dFile(pFile->h, 
15020 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61  pBuf, amt, &nRea
15030 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20  d, &overlapped) 
15040 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65  &&.         osGe
15050 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52  tLastError()!=ER
15060 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29  ROR_HANDLE_EOF )
15070 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f  {.#endif.    DWO
15080 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
15090 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f    if( winRetryIo
150a0 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61  err(&nRetry, &la
150b0 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69  stErrno) ) conti
150c0 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  nue;.    pFile->
150d0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
150e0 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  Errno;.    OSTRA
150f0 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c  CE(("READ pid=%l
15100 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
15110 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
15120 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20  IOERR_READ\n",. 
15130 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15140 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15150 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15160 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
15170 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
15180 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
15190 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
151a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
151b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52             "winR
151c0 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ead", pFile->zPa
151d0 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f  th);.  }.  winLo
151e0 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f  gIoerr(nRetry, _
151f0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20  _LINE__);.  if( 
15200 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74  nRead<(DWORD)amt
15210 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   ){.    /* Unrea
15220 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
15230 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
15240 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
15250 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
15260 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30  )pBuf)[nRead], 0
15270 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20  , amt-nRead);.  
15280 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
15290 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
152a0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
152b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
152c0 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20  RT_READ\n",.    
152d0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
152e0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
152f0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15300 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
15310 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15320 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20  RT_READ;.  }..  
15330 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70  OSTRACE(("READ p
15340 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
15350 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
15360 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
15370 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
15380 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
15390 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
153a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
153b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
153c0 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20  Write data from 
153d0 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20  a buffer into a 
153e0 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  file.  Return SQ
153f0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
15400 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74  ss.** or some ot
15410 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f  her error code o
15420 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74  n failure..*/.st
15430 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74  atic int winWrit
15440 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e(.  sqlite3_fil
15450 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20  e *id,          
15460 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20       /* File to 
15470 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20  write into */.  
15480 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
15490 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
154a0 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20  /* The bytes to 
154b0 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
154c0 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20  int amt,        
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
154f0 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20  es to write */. 
15500 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
15510 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
15520 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
15530 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69  the file to begi
15540 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
15550 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15570 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
15580 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
15590 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a  ed, else false *
155a0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  /.  winFile *pFi
155b0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
155c0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
155d0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74  le */.  int nRet
155e0 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
155f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
15600 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a  r of retries */.
15610 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
15620 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
15630 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ile );.  Simulat
15640 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
15650 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
15660 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44  TE);.  SimulateD
15670 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74  iskfullError(ret
15680 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29  urn SQLITE_FULL)
15690 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  ;..  OSTRACE(("W
156a0 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
156b0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
156c0 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
156d0 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  nt=%d, ".       
156e0 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64      "offset=%lld
156f0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73  , lock=%d\n", os
15700 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15710 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20  sId(), pFile,.  
15720 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15730 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
15740 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
15750 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64 65  ktype));..#if de
15760 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41  fined(SQLITE_MMA
15770 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20  P_READWRITE) && 
15780 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
15790 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
157a0 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
157b0 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75   this write requ
157c0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
157d0 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
157e0 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
157f0 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
15800 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
15810 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
15820 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
15830 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
15840 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
15850 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
15860 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
15870 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
15880 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
15890 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20   pBuf, amt);.   
158a0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
158b0 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  TE-MMAP pid=%lu,
158c0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
158d0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
158e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
158f0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
15900 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
15910 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
15920 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
15930 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
15940 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
15950 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
15960 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
15970 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
15980 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
15990 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
159a0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e  offset], pBuf, n
159b0 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
159c0 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
159d0 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
159e0 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
159f0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
15a00 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
15a10 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
15a20 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
15a30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
15a40 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
15a50 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b  ).  rc = winSeek
15a60 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  File(pFile, offs
15a70 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  et);.  if( rc==0
15a80 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65   ){.#else.  {.#e
15a90 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45  ndif.#if !SQLITE
15aa0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
15ab0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
15ac0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
15ad0 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  ).    OVERLAPPED
15ae0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
15af0 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
15b00 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e  t for WriteFile.
15b10 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75   */.#endif.    u
15b20 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29  8 *aRem = (u8 *)
15b30 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20  pBuf;        /* 
15b40 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77  Data yet to be w
15b50 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  ritten */.    in
15b60 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20  t nRem = amt;   
15b70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15b80 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79  umber of bytes y
15b90 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  et to be written
15ba0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57   */.    DWORD nW
15bb0 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
15bc0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77        /* Bytes w
15bd0 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57  ritten by each W
15be0 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20  riteFile() call 
15bf0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73  */.    DWORD las
15c00 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
15c10 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65  R;   /* Value re
15c20 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
15c30 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66  tError() */..#if
15c40 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
15c50 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
15c60 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15c70 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d 65  ERLAPPED).    me
15c80 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64  mset(&overlapped
15c90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52  , 0, sizeof(OVER
15ca0 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76  LAPPED));.    ov
15cb0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
15cc0 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
15cd0 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
15ce0 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66     overlapped.Of
15cf0 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47  fsetHigh = (LONG
15d00 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26  )((offset>>32) &
15d10 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65   0x7fffffff);.#e
15d20 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28  ndif..    while(
15d30 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53   nRem>0 ){.#if S
15d40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
15d50 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
15d60 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
15d70 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28 20  PPED).      if( 
15d80 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69  !osWriteFile(pFi
15d90 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65  le->h, aRem, nRe
15da0 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29  m, &nWrite, 0) )
15db0 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66  {.#else.      if
15dc0 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
15dd0 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
15de0 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f  Rem, &nWrite, &o
15df0 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65  verlapped) ){.#e
15e00 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
15e10 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
15e20 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
15e30 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
15e40 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15e50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
15e60 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c  ert( nWrite==0 |
15e70 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44  | nWrite<=(DWORD
15e80 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69  )nRem );.      i
15e90 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20  f( nWrite==0 || 
15ea0 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52  nWrite>(DWORD)nR
15eb0 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  em ){.        la
15ec0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
15ed0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
15ee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
15ef0 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
15f00 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69  S_WINCE && !defi
15f10 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
15f20 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a  _NO_OVERLAPPED).
15f30 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
15f40 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76  nWrite;.      ov
15f50 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
15f60 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
15f70 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
15f80 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e       overlapped.
15f90 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
15fa0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
15fb0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
15fc0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65  #endif.      aRe
15fd0 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20  m += nWrite;.   
15fe0 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74     nRem -= nWrit
15ff0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
16000 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20   nRem>0 ){.     
16010 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16020 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
16030 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
16040 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
16050 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20   ){.    if(   ( 
16060 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16070 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44  ==ERROR_HANDLE_D
16080 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20  ISK_FULL ).     
16090 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61    || ( pFile->la
160a0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44  stErrno==ERROR_D
160b0 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20  ISK_FULL )){.   
160c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
160d0 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
160e0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
160f0 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
16100 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16110 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16120 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16130 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16140 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
16150 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c  Error(SQLITE_FUL
16160 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  L, pFile->lastEr
16170 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16190 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65  inWrite1", pFile
161a0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
161b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
161c0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
161d0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
161e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
161f0 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20  WRITE\n",.      
16200 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16210 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16220 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16230 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
16240 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16250 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46  _IOERR_WRITE, pF
16260 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
16270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16280 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65         "winWrite
16290 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
162a0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
162b0 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74  winLogIoerr(nRet
162c0 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  ry, __LINE__);. 
162d0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57   }.  OSTRACE(("W
162e0 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
162f0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
16300 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
16310 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
16320 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16330 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
16340 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
16350 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16360 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
16370 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
16380 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
16390 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
163a0 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  nTruncate(sqlite
163b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  3_file *id, sqli
163c0 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29  te3_int64 nByte)
163d0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
163e0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
163f0 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  d;  /* File hand
16400 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  le object */.  i
16410 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16420 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
16430 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f  * Return code fo
16440 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
16450 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
16460 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  rrno;..  assert(
16470 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
16480 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
16490 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
164a0 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54  TRUNCATE);.  OST
164b0 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20  RACE(("TRUNCATE 
164c0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
164d0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65  p, file=%p, size
164e0 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  =%lld, lock=%d\n
164f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
16500 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16510 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
16520 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70  ile->h, nByte, p
16530 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16540 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75  ;..  /* If the u
16550 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72  ser has configur
16560 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20  ed a chunk-size 
16570 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74  for this file, t
16580 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a  runcate the.  **
16590 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74   file so that it
165a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20   consists of an 
165b0 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
165c0 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74  f chunks (i.e. t
165d0 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66  he.  ** actual f
165e0 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74  ile size after t
165f0 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79  he operation may
16600 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20   be larger than 
16610 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20  the requested.  
16620 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20  ** size)..  */. 
16630 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
16640 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79  unk>0 ){.    nBy
16650 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70  te = ((nByte + p
16660 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20  File->szChunk - 
16670 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  1)/pFile->szChun
16680 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68  k) * pFile->szCh
16690 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  unk;.  }..  /* S
166a0 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65  etEndOfFile() re
166b0 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77  turns non-zero w
166c0 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20  hen successful, 
166d0 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20  or zero when it 
166e0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20  fails. */.  if( 
166f0 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c  winSeekFile(pFil
16700 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20  e, nByte) ){.   
16710 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
16720 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  r(SQLITE_IOERR_T
16730 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e  RUNCATE, pFile->
16740 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16760 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20  "winTruncate1", 
16770 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
16780 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73   }else if( 0==os
16790 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69  SetEndOfFile(pFi
167a0 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20  le->h) &&.      
167b0 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e        ((lastErrn
167c0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
167d0 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45  or())!=ERROR_USE
167e0 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29  R_MAPPED_FILE) )
167f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16800 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
16810 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e  no;.    rc = win
16820 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
16830 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
16840 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16850 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16860 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63         "winTrunc
16870 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ate2", pFile->zP
16880 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ath);.  }..#if S
16890 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
168a0 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68  IZE>0.  /* If th
168b0 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63  e file was trunc
168c0 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73  ated to a size s
168d0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
168e0 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d  currently.  ** m
168f0 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
16900 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
16910 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
16920 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
16930 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65  will.  ** use re
16940 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
16950 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
16960 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
16970 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20  t from now on.. 
16980 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16990 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e  >pMapRegion && n
169a0 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
169b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  Size ){.    pFil
169c0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42  e->mmapSize = nB
169d0 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  yte;.  }.#endif.
169e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55  .  OSTRACE(("TRU
169f0 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  NCATE pid=%lu, p
16a00 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
16a10 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
16a20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16a30 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16a40 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
16a50 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
16a60 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
16a70 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
16a80 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
16a90 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
16aa0 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
16ab0 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
16ac0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
16ad0 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
16ae0 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
16af0 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61  s are occuring a
16b00 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65  t the right time
16b10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
16b20 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  3_sync_count = 0
16b30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75  ;.int sqlite3_fu
16b40 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30  llsync_count = 0
16b50 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
16b60 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
16b70 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
16b80 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
16b90 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
16ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16bb0 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  inSync(sqlite3_f
16bc0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
16bd0 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  gs){.#ifndef SQL
16be0 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a  ITE_NO_SYNC.  /*
16bf0 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20  .  ** Used only 
16c00 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  when SQLITE_NO_S
16c10 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  YNC is not defin
16c20 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c  ed..   */.  BOOL
16c30 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
16c40 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
16c50 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
16c60 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20  ITE_NO_SYNC) || 
16c70 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51  \.    defined(SQ
16c80 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41  LITE_HAVE_OS_TRA
16c90 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  CE).  /*.  ** Us
16ca0 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e  ed when SQLITE_N
16cb0 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65  O_SYNC is not de
16cc0 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65  fined and by the
16cd0 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72   assert() and/or
16ce0 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20  .  ** OSTRACE() 
16cf0 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20  macros..   */.  
16d00 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
16d10 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23   (winFile*)id;.#
16d20 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
16d30 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e  RAMETER(id);.#en
16d40 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
16d50 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65  File );.  /* Che
16d60 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
16d70 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
16d80 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
16d90 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
16da0 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
16db0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
16dc0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
16dd0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
16de0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
16df0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
16e00 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
16e10 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
16e20 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
16e30 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
16e40 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
16e50 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
16e60 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
16e70 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
16e80 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
16e90 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
16ea0 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
16eb0 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
16ec0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
16ed0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67  p, file=%p, flag
16ee0 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  s=%x, lock=%d\n"
16ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
16f00 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16f10 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
16f20 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20  le->h, flags,.  
16f30 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
16f40 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66  locktype));..#if
16f50 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  ndef SQLITE_TEST
16f60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
16f70 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73  TER(flags);.#els
16f80 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30  e.  if( (flags&0
16f90 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
16fa0 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71  C_FULL ){.    sq
16fb0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
16fc0 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  ount++;.  }.  sq
16fd0 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
16fe0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  ++;.#endif..  /*
16ff0 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20   If we compiled 
17000 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
17010 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68  NO_SYNC flag, th
17020 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a  en syncing is a.
17030 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a    ** no-op.  */.
17040 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  #ifdef SQLITE_NO
17050 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28  _SYNC.  OSTRACE(
17060 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25  ("SYNC-NOP pid=%
17070 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
17080 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
17090 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
170a0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
170b0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
170c0 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
170d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
170e0 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51 4c  K;.#else.#if SQL
170f0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
17100 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  E>0.  if( pFile-
17110 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20  >pMapRegion ){. 
17120 20 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56 69     if( osFlushVi
17130 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ewOfFile(pFile->
17140 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20 29  pMapRegion, 0) )
17150 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
17160 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d  ("SYNC-MMAP pid=
17170 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
17180 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
171a0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
171b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
171c0 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20  cessId(),.      
171d0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20           pFile, 
171e0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
171f0 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n));.    }else{.
17200 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
17210 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17220 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
17230 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d   OSTRACE(("SYNC-
17240 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46  MMAP pid=%lu, pF
17250 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69  ile=%p, pMapRegi
17260 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20  on=%p, ".       
17270 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49          "rc=SQLI
17280 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
17290 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
172a0 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20  ocessId(),.     
172b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c            pFile,
172c0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
172d0 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  on));.      retu
172e0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
172f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
17300 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
17310 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17320 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
17330 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e  nSync1", pFile->
17340 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
17350 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20  }.#endif.  rc = 
17360 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65  osFlushFileBuffe
17370 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20  rs(pFile->h);.  
17380 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
17390 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69   rc=FALSE );.  i
173a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54  f( rc ){.    OST
173b0 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d  RACE(("SYNC pid=
173c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
173d0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
173e0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
173f0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
17400 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
17410 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
17420 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17430 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
17440 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
17450 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17460 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53  tError();.    OS
17470 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
17480 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
17490 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
174a0 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e  TE_IOERR_FSYNC\n
174b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
174c0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
174d0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
174e0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
174f0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
17500 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
17510 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSYNC, pFile->la
17520 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 22 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c  "winSync2", pFil
17550 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23  e->zPath);.  }.#
17560 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
17570 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
17580 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
17590 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
175a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69  static int winFi
175b0 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
175c0 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
175d0 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a  _int64 *pSize){.
175e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
175f0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
17600 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17610 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
17620 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
17630 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b  ert( pSize!=0 );
17640 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
17650 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
17660 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20  _IOERR_FSTAT);. 
17670 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
17680 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
17690 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
176a0 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51  pSize));..#if SQ
176b0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
176c0 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44  {.    FILE_STAND
176d0 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20  ARD_INFO info;. 
176e0 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65     if( osGetFile
176f0 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
17700 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20  dleEx(pFile->h, 
17710 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f  FileStandardInfo
17720 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73 69         &info, si
17750 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20  zeof(info)) ){. 
17760 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e       *pSize = in
17770 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61  fo.EndOfFile.Qua
17780 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65  dPart;.    }else
17790 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
177a0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
177b0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
177c0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
177d0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
177e0 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c  _FSTAT, pFile->l
177f0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20   "winFileSize", 
17820 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
17830 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
17840 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70   {.    DWORD upp
17850 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
17860 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20  D lowerBits;.   
17870 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
17880 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73  ;..    lowerBits
17890 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65   = osGetFileSize
178a0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65  (pFile->h, &uppe
178b0 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69  rBits);.    *pSi
178c0 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f  ze = (((sqlite3_
178d0 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29  int64)upperBits)
178e0 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
178f0 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f  s;.    if(   (lo
17900 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c  werBits == INVAL
17910 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20  ID_FILE_SIZE).  
17920 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72       && ((lastEr
17930 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
17940 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f  rror())!=NO_ERRO
17950 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  R) ){.      pFil
17960 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
17970 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
17980 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
17990 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
179a0 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  TAT, pFile->last
179b0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
179d0 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69  inFileSize", pFi
179e0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
179f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  }.  }.#endif.  O
17a00 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69  STRACE(("SIZE fi
17a10 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c  le=%p, pSize=%p,
17a20 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63   *pSize=%lld, rc
17a30 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
17a40 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69     pFile->h, pSi
17a50 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69  ze, *pSize, sqli
17a60 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
17a70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17a80 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45  ../*.** LOCKFILE
17a90 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
17aa0 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f  Y is undefined o
17ab0 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73  n some Windows s
17ac0 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64  ystems..*/.#ifnd
17ad0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ef LOCKFILE_FAIL
17ae0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64  _IMMEDIATELY.# d
17af0 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46  efine LOCKFILE_F
17b00 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20  AIL_IMMEDIATELY 
17b10 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  1.#endif..#ifnde
17b20 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  f LOCKFILE_EXCLU
17b30 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69  SIVE_LOCK.# defi
17b40 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ne LOCKFILE_EXCL
17b50 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e  USIVE_LOCK 2.#en
17b60 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f  dif../*.** Histo
17b70 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20  rically, SQLite 
17b80 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68  has used both th
17b90 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c  e LockFile and L
17ba0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
17bb0 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ons..** When the
17bc0 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69   LockFile functi
17bd0 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20  on was used, it 
17be0 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63  was always expec
17bf0 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69  ted to fail.** i
17c00 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68  mmediately if th
17c10 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  e lock could not
17c20 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41   be obtained.  A
17c30 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65  lso, it always e
17c40 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62  xpected to.** ob
17c50 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
17c60 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66  e lock.  These f
17c70 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69  lags are used wi
17c80 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45  th the LockFileE
17c90 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e  x function.** an
17ca0 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20  d reflect those 
17cb0 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68  expectations; th
17cc0 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68  erefore, they sh
17cd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e  ould not be chan
17ce0 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ged..*/.#ifndef 
17cf0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
17d00 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53  FLAGS.# define S
17d10 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
17d20 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45  LAGS   (LOCKFILE
17d30 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
17d40 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20  Y | \.          
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c 45          LOCKFILE
17d70 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29  _EXCLUSIVE_LOCK)
17d80 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
17d90 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65  urrently, SQLite
17da0 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65   never calls the
17db0 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
17dc0 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e  tion without wan
17dd0 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  ting the.** call
17de0 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61   to fail immedia
17df0 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  tely if the lock
17e00 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
17e10 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
17e20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
17e30 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  X_FLAGS.# define
17e40 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17e50 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49  EX_FLAGS (LOCKFI
17e60 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
17e70 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ELY).#endif../*.
17e80 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
17e90 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66  der lock..** Dif
17ea0 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69  ferent API routi
17eb0 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64  nes are called d
17ec0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
17ed0 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a  her or not this.
17ee0 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57  ** is Win9x or W
17ef0 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  inNT..*/.static 
17f00 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  int winGetReadLo
17f10 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  ck(winFile *pFil
17f20 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  e){.  int res;. 
17f30 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
17f40 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
17f50 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
17f60 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
17f70 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
17f80 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
17f90 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20  ITE_OS_WINCE.   
17fa0 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
17fb0 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68   Windows CE is h
17fc0 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74  andled different
17fd0 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20  ly here due its 
17fe0 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33  lack of the Win3
17ff0 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41  2.    **       A
18000 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20  PI LockFileEx.. 
18010 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20     */.    res = 
18020 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70  winceLockFile(&p
18030 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
18040 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b  FIRST, 0, 1, 0);
18050 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d  .#else.    res =
18060 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
18070 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
18080 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
18090 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
180a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
180b0 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53          SHARED_S
180c0 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  IZE, 0);.#endif.
180d0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
180e0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
180f0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74  .  else{.    int
18100 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   lk;.    sqlite3
18110 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
18120 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
18130 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c    pFile->sharedL
18140 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74  ockByte = (short
18150 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66  )((lk & 0x7fffff
18160 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45  ff)%(SHARED_SIZE
18170 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20   - 1));.    res 
18180 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
18190 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
181a0 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a  LOCKFILE_FLAGS,.
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
181d0 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  ST+pFile->shared
181e0 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20  LockByte, 0, 1, 
181f0 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  0);.  }.#endif. 
18200 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b   if( res == 0 ){
18210 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
18220 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
18230 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a  tError();.    /*
18240 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20   No need to log 
18250 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63  a failure to loc
18260 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41  k */.  }.  OSTRA
18270 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66  CE(("READ-LOCK f
18280 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
18290 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
182a0 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  res));.  return 
182b0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  res;.}../*.** Un
182c0 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f  do a readlock.*/
182d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55  .static int winU
182e0 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69  nlockReadLock(wi
182f0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
18300 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52   int res;.  DWOR
18310 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f  D lastErrno;.  O
18320 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e  STRACE(("READ-UN
18330 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
18340 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  ck=%d\n", pFile-
18350 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  >h, pFile->lockt
18360 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49  ype));.  if( osI
18370 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73  sNT() ){.    res
18380 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
18390 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
183a0 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41  ED_FIRST, 0, SHA
183b0 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20  RED_SIZE, 0);.  
183c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
183d0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
183e0 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d   else{.    res =
183f0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
18400 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
18410 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68  _FIRST+pFile->sh
18420 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c  aredLockByte, 0,
18430 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   1, 0);.  }.#end
18440 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  if.  if( res==0 
18450 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
18460 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18470 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f  ))!=ERROR_NOT_LO
18480 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69  CKED) ){.    pFi
18490 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
184a0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
184b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
184c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20  E_IOERR_UNLOCK, 
184d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
184e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
184f0 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64    "winUnlockRead
18500 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Lock", pFile->zP
18510 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  ath);.  }.  OSTR
18520 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43  ACE(("READ-UNLOC
18530 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c  K file=%p, resul
18540 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  t=%d\n", pFile->
18550 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75  h, res));.  retu
18560 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
18570 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
18580 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
18590 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
185a0 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f  ter locktype - o
185b0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
185c0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
185d0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
185e0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
185f0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
18600 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
18610 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
18620 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
18630 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
18640 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
18650 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
18660 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
18670 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
18680 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
18690 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
186a0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
186b0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
186c0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
186d0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
186e0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
186f0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
18700 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
18710 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
18720 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
18730 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
18740 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
18750 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
18760 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
18770 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
18780 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
18790 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
187a0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
187b0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
187c0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
187d0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
187e0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
187f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
18800 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
18810 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
18820 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18830 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
18840 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20  se a lock.  The 
18850 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74  winUnlock() rout
18860 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c  ine.** erases al
18870 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20  l locks at once 
18880 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69  and returns us i
18890 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f  mmediately to lo
188a0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a  cking level 0..*
188b0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
188c0 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68  ible to lower th
188d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
188e0 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69  one step at a ti
188f0 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74  me.  You.** must
18900 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20   go straight to 
18910 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
18920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18930 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  inLock(sqlite3_f
18940 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63  ile *id, int loc
18950 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
18960 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
18970 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
18980 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73  from subroutines
18990 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20   */.  int res = 
189a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  1;           /* 
189b0 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64  Result of a Wind
189c0 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f  ows lock call */
189d0 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79  .  int newLockty
189e0 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74  pe;       /* Set
189f0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18a00 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62   to this value b
18a10 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f  efore exiting */
18a20 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e  .  int gotPendin
18a30 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75  gLock = 0;/* Tru
18a40 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64  e if we acquired
18a50 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
18a60 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77  this time */.  w
18a70 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
18a80 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
18a90 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20  DWORD lastErrno 
18aa0 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61  = NO_ERROR;..  a
18ab0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
18ac0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
18ad0 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
18ae0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
18af0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
18b00 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
18b10 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
18b20 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
18b30 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
18b40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
18b50 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f   is already a lo
18b60 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20  ck of this type 
18b70 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74  or more restrict
18b80 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ive on the.  ** 
18b90 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  OsFile, do nothi
18ba0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
18bb0 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  e end_lock: exit
18bc0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73   path, as.  ** s
18bd0 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74  qlite3OsEnterMut
18be0 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
18bf0 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
18c00 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  /.  if( pFile->l
18c10 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70  ocktype>=locktyp
18c20 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  e ){.    OSTRACE
18c30 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c  (("LOCK-HELD fil
18c40 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
18c50 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
18c60 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
18c70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
18c80 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20  /* Do not allow 
18c90 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69 74  any kind of writ
18ca0 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64  e-lock on a read
18cb0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20  -only database. 
18cc0 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
18cd0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49  ->ctrlFlags & WI
18ce0 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30  NFILE_RDONLY)!=0
18cf0 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45   && locktype>=RE
18d00 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
18d10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18d20 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d  _IOERR_LOCK;.  }
18d30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
18d40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
18d50 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
18d60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18d70 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21  pFile->locktype!
18d80 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b  =NO_LOCK || lock
18d90 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
18da0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
18db0 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47  ocktype!=PENDING
18dc0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
18dd0 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53  t( locktype!=RES
18de0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
18df0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
18e00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
18e10 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e   /* Lock the PEN
18e20 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
18e30 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71  f we need to acq
18e40 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
18e50 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48  ock or.  ** a SH
18e60 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77  ARED lock.  If w
18e70 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20  e are acquiring 
18e80 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  a SHARED lock, t
18e90 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f  he acquisition o
18ea0 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49  f.  ** the PENDI
18eb0 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20  NG_LOCK byte is 
18ec0 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a  temporary..  */.
18ed0 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20    newLocktype = 
18ee0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b  pFile->locktype;
18ef0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
18f00 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a  cktype==NO_LOCK.
18f10 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d     || (locktype=
18f20 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18f30 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  && pFile->lockty
18f40 70 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe<=RESERVED_LOC
18f50 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
18f60 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69  cnt = 3;.    whi
18f70 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
18f80 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
18f90 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
18fa0 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
18fb0 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  GS,.            
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45 4e               PEN
18fe0 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
18ff0 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   0))==0 ){.     
19000 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20   /* Try 3 times 
19010 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69  to get the pendi
19020 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69  ng lock.  This i
19030 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b  s needed to work
19040 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64  .      ** around
19050 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64   problems caused
19060 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64   by indexing and
19070 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73  /or anti-virus s
19080 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20  oftware on.     
19090 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74   ** Windows syst
190a0 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  ems..      ** If
190b0 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74   you are using t
190c0 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f  his code as a mo
190d0 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74  del for alternat
190e0 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f  ive VFSes, do no
190f0 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20  t.      ** copy 
19100 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63  this retry logic
19110 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20  .  It is a hack 
19120 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e  intended for Win
19130 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20  dows only..     
19140 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72   */.      lastEr
19150 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
19160 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53  rror();.      OS
19170 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e  TRACE(("LOCK-PEN
19180 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25  DING-FAIL file=%
19190 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73  p, count=%d, res
191a0 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ult=%d\n",.     
191b0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
191c0 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a  >h, cnt, res));.
191d0 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
191e0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c  rno==ERROR_INVAL
191f0 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20  ID_HANDLE ){.   
19200 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
19210 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
19220 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  o;.        rc = 
19230 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
19240 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  K;.        OSTRA
19250 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66  CE(("LOCK-FAIL f
19260 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64  ile=%p, count=%d
19270 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
19280 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69               pFi
19290 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69  le->h, cnt, sqli
192a0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
192b0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
192c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
192d0 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c     if( cnt ) sql
192e0 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
192f0 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  (1);.    }.    g
19300 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
19310 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65  res;.    if( !re
19320 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  s ){.      lastE
19330 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
19340 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
19350 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
19360 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
19370 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
19380 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
19390 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
193a0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
193b0 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  ktype==NO_LOCK )
193c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47  ;.    res = winG
193d0 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
193e0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
193f0 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
19400 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ype = SHARED_LOC
19410 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
19420 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
19430 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
19440 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
19450 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
19460 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  RVED lock.  */. 
19470 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52   if( locktype==R
19480 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20  ESERVED_LOCK && 
19490 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72  res ){.    asser
194a0 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t( pFile->lockty
194b0 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
194c0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
194d0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
194e0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
194f0 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52  ILE_FLAGS, RESER
19500 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
19510 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
19520 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
19530 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
19540 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
19550 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
19560 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
19570 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  r();.    }.  }..
19580 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50    /* Acquire a P
19590 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f  ENDING lock.  */
195a0 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
195b0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
195c0 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65  && res ){.    ne
195d0 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44  wLocktype = PEND
195e0 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f  ING_LOCK;.    go
195f0 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
19600 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  ;.  }..  /* Acqu
19610 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
19620 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
19630 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55   locktype==EXCLU
19640 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73  SIVE_LOCK && res
19650 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19660 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
19670 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
19680 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
19690 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
196a0 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69  e);.    res = wi
196b0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
196c0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
196d0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52  FILE_FLAGS, SHAR
196e0 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
19710 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  0);.    if( res 
19720 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
19730 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
19740 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
19750 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
19760 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
19770 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47  or();.      winG
19780 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
19790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
197a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
197b0 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
197c0 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
197d0 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
197e0 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
197f0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
19800 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
19810 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
19820 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
19830 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
19840 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
19850 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
19860 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70  0);.  }..  /* Up
19870 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f  date the state o
19880 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68  f the lock has h
19890 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  eld in the file 
198a0 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a  descriptor then.
198b0 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20    ** return the 
198c0 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75  appropriate resu
198d0 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  lt code..  */.  
198e0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72  if( res ){.    r
198f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
19910 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
19920 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63  astErrno;.    rc
19930 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
19940 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
19950 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  CK-FAIL file=%p,
19960 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d   wanted=%d, got=
19970 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
19980 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f      pFile->h, lo
19990 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74  cktype, newLockt
199a0 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69  ype));.  }.  pFi
199b0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28  le->locktype = (
199c0 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a  u8)newLocktype;.
199d0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
199e0 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
199f0 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
19a00 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
19a10 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
19a20 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
19a30 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
19a40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19a50 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
19a60 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
19a70 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
19a80 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
19a90 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
19aa0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
19ab0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
19ac0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
19ad0 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e  d, return.** non
19ae0 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65  -zero, otherwise
19af0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
19b00 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73   int winCheckRes
19b10 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
19b20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
19b30 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
19b40 20 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20   res;.  winFile 
19b50 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
19b60 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
19b70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19b80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
19b90 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
19ba0 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ; );.  OSTRACE((
19bb0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
19bc0 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
19bd0 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  p\n", pFile->h, 
19be0 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73  pResOut));..  as
19bf0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
19c00 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   if( pFile->lock
19c10 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
19c20 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  OCK ){.    res =
19c30 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   1;.    OSTRACE(
19c40 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
19c50 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
19c60 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46  d (local)\n", pF
19c70 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
19c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20   }else{.    res 
19c90 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
19ca0 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
19cb0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
19cc0 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30  ,RESERVED_BYTE,0
19cd0 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72  ,1,0);.    if( r
19ce0 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55  es ){.      winU
19cf0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
19d00 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
19d10 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
19d20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72    }.    res = !r
19d30 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  es;.    OSTRACE(
19d40 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
19d50 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25  ile=%p, result=%
19d60 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70  d (remote)\n", p
19d70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
19d80 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d    }.  *pResOut =
19d90 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
19da0 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
19db0 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
19dc0 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
19dd0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
19de0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
19df0 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20  le->h, pResOut, 
19e00 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65  *pResOut));.  re
19e10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19e20 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
19e30 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
19e40 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
19e50 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79  tor id to lockty
19e60 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a  pe.  locktype.**
19e70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
19e80 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
19e90 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
19ea0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
19eb0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
19ec0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
19ed0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
19ee0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
19ef0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
19f00 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
19f10 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
19f20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
19f30 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  le for this rout
19f40 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74  ine to fail if t
19f50 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19f60 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b  nt.** is NO_LOCK
19f70 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
19f80 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41   argument is SHA
19f90 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68  RED_LOCK then th
19fa0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69  is routine.** mi
19fb0 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ght return SQLIT
19fc0 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74  E_IOERR;.*/.stat
19fd0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
19fe0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19ff0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
1a000 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20  {.  int type;.  
1a010 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
1a020 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
1a030 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a040 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
1a050 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  File!=0 );.  ass
1a060 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53  ert( locktype<=S
1a070 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1a080 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
1a090 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63   file=%p, oldLoc
1a0a0 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63  k=%d(%d), newLoc
1a0b0 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
1a0c0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
1a0d0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70  ile->locktype, p
1a0e0 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
1a0f0 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29  Byte, locktype))
1a100 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65  ;.  type = pFile
1a110 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
1a120 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56  ( type>=EXCLUSIV
1a130 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  E_LOCK ){.    wi
1a140 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
1a150 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
1a160 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
1a170 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  IZE, 0);.    if(
1a180 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
1a190 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65  D_LOCK && !winGe
1a1a0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
1a1b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1a1c0 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
1a1d0 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
1a1e0 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
1a1f0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
1a200 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
1a210 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
1a220 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
1a230 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
1a240 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  CK, osGetLastErr
1a250 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1a270 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d  nUnlock", pFile-
1a280 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
1a290 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52   }.  if( type>=R
1a2a0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
1a2b0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
1a2c0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
1a2d0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
1a2e0 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
1a2f0 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
1a300 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
1a310 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69  D_LOCK ){.    wi
1a320 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
1a330 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pFile);.  }.  if
1a340 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f  ( type>=PENDING_
1a350 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
1a360 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1a370 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ->h, PENDING_BYT
1a380 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
1a390 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  .  pFile->lockty
1a3a0 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70  pe = (u8)locktyp
1a3b0 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  e;.  OSTRACE(("U
1a3c0 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
1a3d0 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ock=%d, rc=%s\n"
1a3e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1a3f0 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f  le->h, pFile->lo
1a400 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45  cktype, sqlite3E
1a410 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1a420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1a430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1a480 2a 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 20 4e 6f 2d  ************ No-
1a4a0 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
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 0a 2a 2a  *************.**
1a4d0 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
1a4e0 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
1a4f0 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
1a500 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
1a510 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
1a520 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
1a530 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
1a540 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
1a550 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
1a560 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
1a570 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1a580 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
1a590 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
1a5a0 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
1a5b0 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
1a5c0 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
1a5d0 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
1a5e0 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
1a5f0 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
1a600 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
1a610 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
1a620 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
1a630 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
1a640 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
1a650 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
1a660 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
1a670 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
1a680 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
1a690 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
1a6a0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
1a6b0 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
1a6c0 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
1a6d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
1a6e0 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
1a6f0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
1a700 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
1a710 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
1a720 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
1a730 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
1a740 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
1a750 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
1a760 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
1a770 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
1a780 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
1a790 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
1a7a0 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
1a7b0 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63  int winNolockLoc
1a7c0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1a7d0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
1a7e0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
1a7f0 4d 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55  METER(id);.  UNU
1a800 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f  SED_PARAMETER(lo
1a810 63 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72  cktype);.  retur
1a820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1a830 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f  static int winNo
1a840 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
1a850 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
1a860 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
1a870 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
1a880 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20  PARAMETER(id);. 
1a890 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a8a0 52 28 70 52 65 73 4f 75 74 29 3b 0a 20 20 72 65  R(pResOut);.  re
1a8b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a8c0 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  }..static int wi
1a8d0 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71  nNolockUnlock(sq
1a8e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a8f0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
1a900 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a910 52 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(id);.  UNUSED_
1a920 50 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79  PARAMETER(lockty
1a930 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pe);.  return SQ
1a940 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a  LITE_OK;.}../***
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a960 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f   End of the no-o
1a970 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  p lock implement
1a980 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a9a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
1a9f0 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69  ** If *pArg is i
1aa00 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76  nitially negativ
1aa10 65 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61  e then this is a
1aa20 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41   query.  Set *pA
1aa30 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20  rg to.** 1 or 0 
1aa40 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
1aa50 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20  ther or not bit 
1aa60 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63  mask of pFile->c
1aa70 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e  trlFlags is set.
1aa80 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  .**.** If *pArg 
1aa90 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20  is 0 or 1, then 
1aaa0 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65  clear or set the
1aab0 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69   mask bit of pFi
1aac0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a  le->ctrlFlags..*
1aad0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1aae0 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65  nModeBit(winFile
1aaf0 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65   *pFile, unsigne
1ab00 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74  d char mask, int
1ab10 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a   *pArg){.  if( *
1ab20 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70  pArg<0 ){.    *p
1ab30 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74  Arg = (pFile->ct
1ab40 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21  rlFlags & mask)!
1ab50 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  =0;.  }else if( 
1ab60 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  (*pArg)==0 ){.  
1ab70 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
1ab80 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d  gs &= ~mask;.  }
1ab90 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
1aba0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61  >ctrlFlags |= ma
1abb0 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f  sk;.  }.}../* Fo
1abc0 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1abd0 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d   to VFS helper m
1abe0 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20  ethods used for 
1abf0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
1ac00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1ac10 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c  nGetTempname(sql
1ac20 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72  ite3_vfs *, char
1ac30 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74   **);.static int
1ac40 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20   winIsDir(const 
1ac50 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20  void *);.static 
1ac60 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c  BOOL winIsDriveL
1ac70 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f  etterAndColon(co
1ac80 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a  nst char *);../*
1ac90 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20  .** Control and 
1aca0 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65  query of the ope
1acb0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1acc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1acd0 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
1ace0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1acf0 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67  t op, void *pArg
1ad00 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
1ad10 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
1ad20 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  id;.  OSTRACE(("
1ad30 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f  FCNTL file=%p, o
1ad40 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22  p=%d, pArg=%p\n"
1ad50 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20  , pFile->h, op, 
1ad60 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68  pArg));.  switch
1ad70 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
1ad80 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
1ad90 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
1ada0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1adb0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
1adc0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1add0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1ade0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1adf0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1ae00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ae10 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1ae20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1ae30 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20  LAST_ERRNO: {.  
1ae40 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1ae50 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61  = (int)pFile->la
1ae60 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f  stErrno;.      O
1ae70 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1ae80 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1ae90 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
1aea0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
1aeb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1aec0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1aed0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1aee0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
1aef0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
1af00 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
1af10 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1af20 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1af30 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
1af40 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1af50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1af60 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1af70 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1af80 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1af90 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1afa0 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  k>0 ){.        s
1afb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64  qlite3_int64 old
1afc0 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  Sz;.        int 
1afd0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
1afe0 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20  (id, &oldSz);.  
1aff0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1b000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b010 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
1b020 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c  64 newSz = *(sql
1b030 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67  ite3_int64*)pArg
1b040 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b050 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20  newSz>oldSz ){. 
1b060 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c             Simul
1b070 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1b080 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (1);.           
1b090 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74   rc = winTruncat
1b0a0 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20  e(id, newSz);.  
1b0b0 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
1b0c0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b0d0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  0);.          }.
1b0e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b0f0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1b100 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
1b110 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
1b120 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1b130 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )));.        ret
1b140 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1b150 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b160 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b170 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b180 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b190 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b1a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b1b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b1c0 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20  PERSIST_WAL: {. 
1b1d0 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
1b1e0 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
1b1f0 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74  ERSIST_WAL, (int
1b200 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f  *)pArg);.      O
1b210 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1b220 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
1b230 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
1b240 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
1b250 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1b260 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1b270 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
1b280 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
1b290 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74        winModeBit
1b2a0 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f  (pFile, WINFILE_
1b2b0 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
1b2c0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
1b2d0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b2e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b2f0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b300 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b310 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b320 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b330 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20  TL_VFSNAME: {.  
1b340 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
1b350 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
1b360 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d  ntf("%s", pFile-
1b370 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  >pVfs->zName);. 
1b380 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b390 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b3a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1b3b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1b3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b3d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1b3e0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
1b3f0 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b  IN32_AV_RETRY: {
1b400 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20  .      int *a = 
1b410 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
1b420 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a    if( a[0]>0 ){.
1b430 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72          winIoerr
1b440 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20  Retry = a[0];.  
1b450 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b460 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65     a[0] = winIoe
1b470 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d  rrRetry;.      }
1b480 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e  .      if( a[1]>
1b490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
1b4a0 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20  IoerrRetryDelay 
1b4b0 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65  = a[1];.      }e
1b4c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31  lse{.        a[1
1b4d0 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72  ] = winIoerrRetr
1b4e0 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a  yDelay;.      }.
1b4f0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b500 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b510 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b520 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b530 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b540 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b550 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b560 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45  WIN32_GET_HANDLE
1b570 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44  : {.      LPHAND
1b580 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48  LE phFile = (LPH
1b590 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20  ANDLE)pArg;.    
1b5a0 20 20 2a 70 68 46 69 6c 65 20 3d 20 70 46 69 6c    *phFile = pFil
1b5b0 65 2d 3e 68 3b 0a 20 20 20 20 20 20 4f 53 54 52  e->h;.      OSTR
1b5c0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1b5d0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1b5e0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
1b5f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b610 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b620 53 54 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ST.    case SQLI
1b630 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53  TE_FCNTL_WIN32_S
1b640 45 54 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20  ET_HANDLE: {.   
1b650 20 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69     LPHANDLE phFi
1b660 6c 65 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70  le = (LPHANDLE)p
1b670 41 72 67 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c  Arg;.      HANDL
1b680 45 20 68 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69  E hOldFile = pFi
1b690 6c 65 2d 3e 68 3b 0a 20 20 20 20 20 20 70 46 69  le->h;.      pFi
1b6a0 6c 65 2d 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b  le->h = *phFile;
1b6b0 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d  .      *phFile =
1b6c0 20 68 4f 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20   hOldFile;.     
1b6d0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b6e0 20 6f 6c 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77   oldFile=%p, new
1b6f0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  File=%p, rc=SQLI
1b700 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
1b710 20 20 20 20 20 20 20 20 20 68 4f 6c 64 46 69 6c           hOldFil
1b720 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
1b730 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b740 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e  TE_OK;.    }.#en
1b750 64 69 66 0a 20 20 20 20 63 61 73 65 20 53 51 4c  dif.    case SQL
1b760 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
1b770 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
1b780 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30  char *zTFile = 0
1b790 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1b7a0 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
1b7b0 70 46 69 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54  pFile->pVfs, &zT
1b7c0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
1b7d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b7e0 7b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  {.        *(char
1b7f0 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
1b800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b810 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1b820 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
1b830 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c  ", pFile->h, sql
1b840 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
1b850 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b860 72 63 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51  rc;.    }.#if SQ
1b870 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1b880 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51  ZE>0.    case SQ
1b890 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
1b8a0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36  SIZE: {.      i6
1b8b0 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69  4 newLimit = *(i
1b8c0 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  64*)pArg;.      
1b8d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1b8e0 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  OK;.      if( ne
1b8f0 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c  wLimit>sqlite3Gl
1b900 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
1b910 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  p ){.        new
1b920 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47  Limit = sqlite3G
1b930 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d  lobalConfig.mxMm
1b940 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ap;.      }.    
1b950 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
1b960 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1b970 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
1b980 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
1b990 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
1b9a0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
1b9b0 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
1b9c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1b9d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
1b9e0 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
1b9f0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
1ba00 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1ba10 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69        winUnmapfi
1ba20 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
1ba30 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d 61 70       rc = winMap
1ba40 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b  file(pFile, -1);
1ba50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ba60 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
1ba70 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1ba80 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
1ba90 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
1baa0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1bab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1bac0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1bad0 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1bae0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1baf0 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20  TE_NOTFOUND\n", 
1bb00 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
1bb10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
1bb20 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
1bb30 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
1bb40 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
1bb50 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
1bb60 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
1bb70 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
1bb80 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
1bb90 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
1bba0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
1bbb0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
1bbc0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
1bbd0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
1bbe0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
1bbf0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
1bc00 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
1bc10 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
1bc20 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
1bc30 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
1bc40 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
1bc50 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
1bc60 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
1bc70 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
1bc80 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
1bc90 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
1bca0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
1bcb0 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
1bcc0 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  int winSectorSiz
1bcd0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1bce0 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b  id){.  (void)id;
1bcf0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bd00 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
1bd10 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  SIZE;.}../*.** R
1bd20 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72 20 6f  eturn a vector o
1bd30 66 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  f device charact
1bd40 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61  eristics..*/.sta
1bd50 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76 69 63  tic int winDevic
1bd60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1bd70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1bd80 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
1bd90 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
1bda0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1bdb0 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54 41 42  _IOCAP_UNDELETAB
1bdc0 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20  LE_WHEN_OPEN |. 
1bdd0 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63 74 72          ((p->ctr
1bde0 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
1bdf0 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f  _PSOW)?SQLITE_IO
1be00 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
1be10 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f  ERWRITE:0);.}../
1be20 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c  *.** Windows wil
1be30 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63  l only let you c
1be40 72 65 61 74 65 20 66 69 6c 65 20 76 69 65 77 20  reate file view 
1be50 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61  mappings.** on a
1be60 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 20 67  llocation size g
1be70 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75 6e 64  ranularity bound
1be80 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67  aries..** During
1be90 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
1bea0 28 29 20 77 65 20 64 6f 20 61 20 47 65 74 53 79  () we do a GetSy
1beb0 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f  stemInfo().** to
1bec0 20 67 65 74 20 74 68 65 20 67 72 61 6e 75 6c 61   get the granula
1bed0 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  rity size..*/.st
1bee0 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f  atic SYSTEM_INFO
1bef0 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69   winSysInfo;..#i
1bf00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1bf10 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c  T_WAL../*.** Hel
1bf20 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f  per functions to
1bf30 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69   obtain and reli
1bf40 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61  nquish the globa
1bf50 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20  l mutex. The.** 
1bf60 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20  global mutex is 
1bf70 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20  used to protect 
1bf80 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20  the winLockInfo 
1bf90 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 0a  objects used by.
1bfa0 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  ** this file, al
1bfb0 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
1bfc0 65 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  e shared by mult
1bfd0 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
1bfe0 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e  .** Function win
1bff0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
1c000 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
1c010 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
1c020 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68  al mutex.** is h
1c030 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
1c040 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
1c050 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
1c060 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
1c070 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e  ).** statements.
1c080 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69   e.g..**.**   wi
1c090 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29  nShmEnterMutex()
1c0a0 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
1c0b0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1c0c0 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ) );.**   winShm
1c0d0 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a  LeaveMutex().*/.
1c0e0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1c0f0 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69  hmEnterMutex(voi
1c100 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1c110 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
1c120 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1c130 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c140 56 46 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63  VFS1));.}.static
1c150 20 76 6f 69 64 20 77 69 6e 53 68 6d 4c 65 61 76   void winShmLeav
1c160 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  eMutex(void){.  
1c170 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1c180 61 76 65 28 73 71 6c 69 74 65 33 4d 75 74 65 78  ave(sqlite3Mutex
1c190 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1c1a0 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29  EX_STATIC_VFS1))
1c1b0 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ;.}.#ifndef NDEB
1c1c0 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  UG.static int wi
1c1d0 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f  nShmMutexHeld(vo
1c1e0 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73  id) {.  return s
1c1f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c200 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  d(sqlite3MutexAl
1c210 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1c220 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a  _STATIC_VFS1));.
1c230 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1c240 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
1c250 65 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c  epresent a singl
1c260 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e  e file opened an
1c270 64 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f  d mmapped to pro
1c280 76 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d  vide.** shared m
1c290 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c  emory.  When mul
1c2a0 74 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c  tiple threads al
1c2b0 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  l reference the 
1c2c0 73 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  same.** log-summ
1c2d0 61 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64  ary, each thread
1c2e0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 77 69 6e   has its own win
1c2f0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
1c300 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
1c310 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
1c320 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1c330 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
1c340 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
1c350 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
1c360 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
1c370 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
1c380 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
1c390 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72  eld() must be tr
1c3a0 75 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ue when creating
1c3b0 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a   or destroying.*
1c3c0 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72  * this object or
1c3d0 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f   while reading o
1c3e0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f  r writing the fo
1c3f0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
1c400 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a  **.**      nRef.
1c410 2a 2a 20 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a  **      pNext.**
1c420 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1c430 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
1c440 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
1c450 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
1c460 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ed:.**.**      f
1c470 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
1c480 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
1c490 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74  r winShmNode.mut
1c4a0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20  ex must be held 
1c4b0 6f 72 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52  or winShmNode.nR
1c4c0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e  ef==0 and.** win
1c4d0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 69  ShmMutexHeld() i
1c4e0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
1c4f0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
1c500 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
1c510 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
1c520 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63  ure..**.*/.struc
1c530 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20  t winShmNode {. 
1c540 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1c550 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
1c560 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
1c570 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
1c580 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
1c590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1c5a0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
1c5b0 2f 0a 20 20 77 69 6e 46 69 6c 65 20 68 46 69 6c  /.  winFile hFil
1c5c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e;             /
1c5d0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 66 72  * File handle fr
1c5e0 6f 6d 20 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20  om winOpen */.. 
1c5f0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
1c600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1c610 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
1c620 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
1c630 20 20 69 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20    int nRegion;  
1c640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c650 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
1c660 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75  Region */.  stru
1c670 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20  ct ShmRegion {. 
1c680 20 20 20 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20     HANDLE hMap; 
1c690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c6a0 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
1c6b0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
1c6c0 67 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70  g */.    void *p
1c6d0 4d 61 70 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f  Map;.  } *aRegio
1c6e0 6e 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  n;.  DWORD lastE
1c6f0 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
1c700 2f 2a 20 54 68 65 20 57 69 6e 64 6f 77 73 20 65  /* The Windows e
1c710 72 72 6e 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61  rrno from the la
1c720 73 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a  st I/O error */.
1c730 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
1c740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c750 20 4e 75 6d 62 65 72 20 6f 66 20 77 69 6e 53 68   Number of winSh
1c760 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1c770 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
1c780 77 69 6e 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  winShm *pFirst; 
1c790 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
1c7a0 6c 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  l winShm objects
1c7b0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1c7c0 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  s */.  winShmNod
1c7d0 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  e *pNext;       
1c7e0 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73    /* Next in lis
1c7f0 74 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  t of all winShmN
1c800 6f 64 65 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23  ode objects */.#
1c810 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1c820 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1c830 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
1c840 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 6e  OS_TRACE).  u8 n
1c850 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
1c860 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
1c870 76 61 69 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e  vailable winShm.
1c880 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
1c890 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67  if.};../*.** A g
1c8a0 6c 6f 62 61 6c 20 61 72 72 61 79 20 6f 66 20 61  lobal array of a
1c8b0 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  ll winShmNode ob
1c8c0 6a 65 63 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  jects..**.** The
1c8d0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c8e0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1c8f0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
1c900 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 6c 69   writing this li
1c910 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69  st..*/.static wi
1c920 6e 53 68 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d  nShmNode *winShm
1c930 4e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  NodeList = 0;../
1c940 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
1c950 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62  sed internally b
1c960 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72 65  y this VFS to re
1c970 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20 6f  cord the state o
1c980 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61  f an.** open sha
1c990 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65  red memory conne
1c9a0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
1c9b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1c9c0 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65  s are initialize
1c9d0 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65  d when this obje
1c9e0 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  ct is created an
1c9f0 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e  d.** are read-on
1ca00 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a  ly thereafter:.*
1ca10 2a 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70  *.**    winShm.p
1ca20 53 68 6d 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69  ShmNode.**    wi
1ca30 6e 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  nShm.id.**.** Al
1ca40 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
1ca50 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
1ca60 54 68 65 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e  The winShm.pShmN
1ca70 6f 64 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20  ode->mutex must 
1ca80 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65  be held.** while
1ca90 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72   accessing any r
1caa0 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73  ead/write fields
1cab0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53  ..*/.struct winS
1cac0 68 6d 20 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  hm {.  winShmNod
1cad0 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
1cae0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1caf0 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f  ing winShmNode o
1cb00 62 6a 65 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68  bject */.  winSh
1cb10 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  m *pNext;       
1cb20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 77 69        /* Next wi
1cb30 6e 53 68 6d 20 77 69 74 68 20 74 68 65 20 73 61  nShm with the sa
1cb40 6d 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  me winShmNode */
1cb50 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20  .  u8 hasMutex; 
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cb70 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67   True if holding
1cb80 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20   the winShmNode 
1cb90 6d 75 74 65 78 20 2a 2f 0a 20 20 75 31 36 20 73  mutex */.  u16 s
1cba0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
1cbb0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
1cbc0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
1cbd0 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
1cbe0 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
1cbf0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1cc00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
1cc10 6c 64 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ld */.#if define
1cc20 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1cc30 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1cc40 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1cc50 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cc70 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
1cc80 65 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73 20  ection with its 
1cc90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65  winShmNode */.#e
1cca0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  ndif.};../*.** C
1ccb0 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
1ccc0 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
1ccd0 66 69 6e 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53  fine WIN_SHM_BAS
1cce0 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f  E   ((22+SQLITE_
1ccf0 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20  SHM_NLOCK)*4)   
1cd00 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
1cd10 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
1cd20 6e 65 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20  ne WIN_SHM_DMS  
1cd30 20 20 28 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b    (WIN_SHM_BASE+
1cd40 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1cd50 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
1cd60 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
1cd70 70 70 6c 79 20 61 64 76 69 73 6f 72 79 20 6c 6f  pply advisory lo
1cd80 63 6b 73 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79  cks for all n by
1cd90 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  tes beginning at
1cda0 20 6f 66 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   ofst..*/.#defin
1cdb0 65 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20 20  e WINSHM_UNLCK  
1cdc0 31 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d  1.#define WINSHM
1cdd0 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66 69 6e  _RDLCK  2.#defin
1cde0 65 20 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 20  e WINSHM_WRLCK  
1cdf0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
1ce00 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1ce10 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
1ce20 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
1ce30 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
1ce40 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
1ce50 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
1ce60 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
1ce70 20 20 20 20 2f 2a 20 57 49 4e 53 48 4d 5f 55 4e      /* WINSHM_UN
1ce80 4c 43 4b 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43  LCK, WINSHM_RDLC
1ce90 4b 2c 20 6f 72 20 57 49 4e 53 48 4d 5f 57 52 4c  K, or WINSHM_WRL
1cea0 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
1ceb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1cec0 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
1ced0 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
1cee0 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
1cef0 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
1cf00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cf10 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
1cf20 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
1cf30 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
1cf40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1cf50 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
1cf60 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
1cf70 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1cf80 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
1cf90 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
1cfa0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
1cfb0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
1cfc0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cfd0 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
1cfe0 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
1cff0 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  Ref==0 );..  OST
1d000 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1d010 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
1d020 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
1d030 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  e=%d\n",.       
1d040 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
1d050 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66  .h, lockType, of
1d060 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  st, nByte));..  
1d070 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69  /* Release/Acqui
1d080 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  re the system-le
1d090 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  vel lock */.  if
1d0a0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 57 49 4e 53  ( lockType==WINS
1d0b0 48 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  HM_UNLCK ){.    
1d0c0 72 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  rc = winUnlockFi
1d0d0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65  le(&pFile->hFile
1d0e0 2e 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79  .h, ofst, 0, nBy
1d0f0 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  te, 0);.  }else{
1d100 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1d110 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
1d120 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20  arameters */.   
1d130 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d   DWORD dwFlags =
1d140 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
1d150 4d 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20  MMEDIATELY;.    
1d160 69 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20  if( lockType == 
1d170 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64  WINSHM_WRLCK ) d
1d180 77 46 6c 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49  wFlags |= LOCKFI
1d190 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
1d1a0 4b 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  K;.    rc = winL
1d1b0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
1d1c0 68 46 69 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73  hFile.h, dwFlags
1d1d0 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
1d1e0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 0);.  }..  if(
1d1f0 20 72 63 21 3d 20 30 20 29 7b 0a 20 20 20 20 72   rc!= 0 ){.    r
1d200 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
1d220 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20  e->lastErrno =  
1d230 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
1d240 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
1d250 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f  E_BUSY;.  }..  O
1d260 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
1d270 4b 20 66 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d  K file=%p, func=
1d280 25 73 2c 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72  %s, errno=%lu, r
1d290 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1d2a0 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
1d2b0 2e 68 2c 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d  .h, (lockType ==
1d2c0 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 29 20 3f   WINSHM_UNLCK) ?
1d2d0 20 22 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 22   "winUnlockFile"
1d2e0 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 22 77   :.           "w
1d2f0 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c 20 70 46 69  inLockFile", pFi
1d300 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 73  le->lastErrno, s
1d310 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1d320 29 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  )));..  return r
1d330 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1d340 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
1d350 46 53 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 73 74  FS methods */.st
1d360 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e  atic int winOpen
1d370 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 63 6f  (sqlite3_vfs*,co
1d380 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65  nst char*,sqlite
1d390 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 69 6e 74 2a  3_file*,int,int*
1d3a0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
1d3b0 6e 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  nDelete(sqlite3_
1d3c0 76 66 73 20 2a 2c 63 6f 6e 73 74 20 63 68 61 72  vfs *,const char
1d3d0 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  *,int);../*.** P
1d3e0 75 72 67 65 20 74 68 65 20 77 69 6e 53 68 6d 4e  urge the winShmN
1d3f0 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
1d400 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
1d410 20 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66   winShmNode.nRef
1d420 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
1d430 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
1d440 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1d450 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
1d460 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
1d470 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
1d480 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
1d490 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
1d4a0 69 64 20 77 69 6e 53 68 6d 50 75 72 67 65 28 73  id winShmPurge(s
1d4b0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
1d4c0 2c 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67  , int deleteFlag
1d4d0 29 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ){.  winShmNode 
1d4e0 2a 2a 70 70 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f  **pp;.  winShmNo
1d4f0 64 65 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28  de *p;.  assert(
1d500 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1d510 28 29 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  () );.  OSTRACE(
1d520 28 22 53 48 4d 2d 50 55 52 47 45 20 70 69 64 3d  ("SHM-PURGE pid=
1d530 25 6c 75 2c 20 64 65 6c 65 74 65 46 6c 61 67 3d  %lu, deleteFlag=
1d540 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1d550 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
1d560 6f 63 65 73 73 49 64 28 29 2c 20 64 65 6c 65 74  ocessId(), delet
1d570 65 46 6c 61 67 29 29 3b 0a 20 20 70 70 20 3d 20  eFlag));.  pp = 
1d580 26 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b  &winShmNodeList;
1d590 0a 20 20 77 68 69 6c 65 28 20 28 70 20 3d 20 2a  .  while( (p = *
1d5a0 70 70 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  pp)!=0 ){.    if
1d5b0 28 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ( p->nRef==0 ){.
1d5c0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1d5d0 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 20     if( p->mutex 
1d5e0 29 7b 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ){ sqlite3_mutex
1d5f0 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
1d600 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
1d610 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20  ; i<p->nRegion; 
1d620 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 42 4f  i++){.        BO
1d630 4f 4c 20 62 52 63 20 3d 20 6f 73 55 6e 6d 61 70  OL bRc = osUnmap
1d640 56 69 65 77 4f 66 46 69 6c 65 28 70 2d 3e 61 52  ViewOfFile(p->aR
1d650 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61 70 29 3b 0a  egion[i].pMap);.
1d660 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
1d670 28 22 53 48 4d 2d 50 55 52 47 45 2d 55 4e 4d 41  ("SHM-PURGE-UNMA
1d680 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1d690 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  n=%d, rc=%s\n",.
1d6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1d6c0 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63  cessId(), i, bRc
1d6d0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
1d6e0 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e  d"));.        UN
1d6f0 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41  USED_VARIABLE_VA
1d700 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20  LUE(bRc);.      
1d710 20 20 62 52 63 20 3d 20 6f 73 43 6c 6f 73 65 48    bRc = osCloseH
1d720 61 6e 64 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  andle(p->aRegion
1d730 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20 20 20 20 20  [i].hMap);.     
1d740 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1d750 2d 50 55 52 47 45 2d 43 4c 4f 53 45 20 70 69 64  -PURGE-CLOSE pid
1d760 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1d770 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1d780 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1d790 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1d7a0 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1d7b0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1d7c0 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1d7d0 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1d7e0 52 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Rc);.      }.   
1d7f0 20 20 20 69 66 28 20 70 2d 3e 68 46 69 6c 65 2e     if( p->hFile.
1d800 68 21 3d 4e 55 4c 4c 20 26 26 20 70 2d 3e 68 46  h!=NULL && p->hF
1d810 69 6c 65 2e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  ile.h!=INVALID_H
1d820 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
1d830 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
1d840 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1d850 0a 20 20 20 20 20 20 20 20 77 69 6e 43 6c 6f 73  .        winClos
1d860 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  e((sqlite3_file 
1d870 2a 29 26 70 2d 3e 68 46 69 6c 65 29 3b 0a 20 20  *)&p->hFile);.  
1d880 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1d890 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1d8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d8b0 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29 7b 0a  ( deleteFlag ){.
1d8c0 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65          Simulate
1d8d0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1d8e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d8f0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
1d900 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 77 69  oc();.        wi
1d910 6e 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 2d  nDelete(pVfs, p-
1d920 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a  >zFilename, 0);.
1d930 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1d940 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
1d950 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1d960 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1d970 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1d980 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1d990 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1d9a0 66 72 65 65 28 70 2d 3e 61 52 65 67 69 6f 6e 29  free(p->aRegion)
1d9b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1d9c0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 65 6c  free(p);.    }el
1d9d0 73 65 7b 0a 20 20 20 20 20 20 70 70 20 3d 20 26  se{.      pp = &
1d9e0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  p->pNext;.    }.
1d9f0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
1da00 6e 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  n the shared-mem
1da10 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
1da20 74 65 64 20 77 69 74 68 20 64 61 74 61 62 61 73  ted with databas
1da30 65 20 66 69 6c 65 20 70 44 62 46 64 2e 0a 2a 2a  e file pDbFd..**
1da40 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
1da50 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
1da60 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
1da70 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
1da80 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
1da90 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
1daa0 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
1dab0 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
1dac0 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
1dad0 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
1dae0 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
1daf0 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
1db00 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
1db10 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
1db20 74 69 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 53  tic int winOpenS
1db30 68 61 72 65 64 4d 65 6d 6f 72 79 28 77 69 6e 46  haredMemory(winF
1db40 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
1db50 74 72 75 63 74 20 77 69 6e 53 68 6d 20 2a 70 3b  truct winShm *p;
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1db80 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
1db90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e   */.  struct win
1dba0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1dbb0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  e = 0;   /* The 
1dbc0 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
1dbd0 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
1dbe0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc00 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1dc10 2f 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68  /.  struct winSh
1dc20 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1dc30 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20         /* Newly 
1dc40 61 6c 6c 6f 63 61 74 65 64 20 77 69 6e 53 68 6d  allocated winShm
1dc50 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  Node */.  int nN
1dc60 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
1dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc80 53 69 7a 65 20 6f 66 20 7a 4e 61 6d 65 20 69 6e  Size of zName in
1dc90 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 61 73 73   bytes */..  ass
1dca0 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
1dcb0 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 4e 6f 74  ==0 );    /* Not
1dcc0 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e   previously open
1dcd0 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  ed */..  /* Allo
1dce0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
1dcf0 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33 5f 73  he new sqlite3_s
1dd00 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c 73 6f  hm object.  Also
1dd10 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79 0a 20   speculatively. 
1dd20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   ** allocate spa
1dd30 63 65 20 66 6f 72 20 61 20 6e 65 77 20 77 69 6e  ce for a new win
1dd40 53 68 6d 4e 6f 64 65 20 61 6e 64 20 66 69 6c 65  ShmNode and file
1dd50 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  name..  */.  p =
1dd60 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1dd70 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  ro( sizeof(*p) )
1dd80 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1dd90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1dda0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
1ddb0 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   nName = sqlite3
1ddc0 53 74 72 6c 65 6e 33 30 28 70 44 62 46 64 2d 3e  Strlen30(pDbFd->
1ddd0 7a 50 61 74 68 29 3b 0a 20 20 70 4e 65 77 20 3d  zPath);.  pNew =
1dde0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
1ddf0 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  ro( sizeof(*pShm
1de00 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d 65 20 2b 20  Node) + nName + 
1de10 31 37 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  17 );.  if( pNew
1de20 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1de30 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
1de40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1de50 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1de60 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69 6c    }.  pNew->zFil
1de70 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
1de80 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69 74  pNew[1];.  sqlit
1de90 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61 6d  e3_snprintf(nNam
1dea0 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c  e+15, pNew->zFil
1deb0 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c  ename, "%s-shm",
1dec0 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
1ded0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
1dee0 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74  fix3(pDbFd->zPat
1def0 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61  h, pNew->zFilena
1df00 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20  me);..  /* Look 
1df10 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
1df20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20 77  is an existing w
1df30 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20 63  inShmNode that c
1df40 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a 2a  an be used..  **
1df50 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20   If no matching 
1df60 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72 65  winShmNode curre
1df70 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72 65  ntly exists, cre
1df80 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a 20  ate a new one.. 
1df90 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1dfa0 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28  rMutex();.  for(
1dfb0 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53 68  pShmNode = winSh
1dfc0 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d 4e  mNodeList; pShmN
1dfd0 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70 53  ode; pShmNode=pS
1dfe0 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b 0a  hmNode->pNext){.
1dff0 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64 20      /* TBD need 
1e000 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68 20  to come up with 
1e010 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65 72  better match her
1e020 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20 20  e.  Perhaps.    
1e030 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f 42  ** use FILE_ID_B
1e040 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74 72  OTH_DIR_INFO Str
1e050 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ucture..    */. 
1e060 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
1e070 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d 3e  rICmp(pShmNode->
1e080 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 2d  zFilename, pNew-
1e090 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20 29  >zFilename)==0 )
1e0a0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
1e0b0 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20 20  ( pShmNode ){.  
1e0c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e0d0 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  New);.  }else{. 
1e0e0 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 4e     pShmNode = pN
1e0f0 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30  ew;.    pNew = 0
1e100 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65 2a  ;.    ((winFile*
1e110 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69  )(&pShmNode->hFi
1e120 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c 49  le))->h = INVALI
1e130 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
1e140 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e      pShmNode->pN
1e150 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65  ext = winShmNode
1e160 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68 6d  List;.    winShm
1e170 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d 4e  NodeList = pShmN
1e180 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  ode;..    if( sq
1e190 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e1a0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
1e1b0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1e1c0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1e1d0 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1e1e0 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
1e1f0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
1e200 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a  de->mutex==0 ){.
1e210 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e220 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1e230 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
1e240 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1e250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e260 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e      rc = winOpen
1e270 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20  (pDbFd->pVfs,.  
1e280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1e290 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1e2a0 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  me,             
1e2b0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1e2c0 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
1e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26  (sqlite3_file*)&
1e2f0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
1e300 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1e310 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   here */.       
1e320 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1e330 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49  _OPEN_WAL | SQLI
1e340 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1e350 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
1e360 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20 20 20  CREATE,.        
1e370 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20           0);.   
1e380 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
1e390 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
1e3a0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
1e3b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
1e3c0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
1e3d0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1e3e0 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
1e3f0 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
1e400 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
1e410 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1e420 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20   zero length..  
1e430 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77 69 6e    */.    if( win
1e440 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53  ShmSystemLock(pS
1e450 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 57  hmNode, WINSHM_W
1e460 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
1e470 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1e480 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1e490 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1e4a0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1e4b0 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
1e4c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1e4d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e4e0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1e4f0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1e500 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1e510 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e530 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68        "winOpenSh
1e540 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
1e550 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e560 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1e570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e580 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1e590 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53 48  (pShmNode, WINSH
1e5a0 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
1e5b0 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20  _DMS, 1);.      
1e5c0 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1e5d0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1e5e0 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49  WINSHM_RDLCK, WI
1e5f0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1e600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
1e610 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f  ) goto shm_open_
1e620 65 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  err;.  }..  /* M
1e630 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
1e640 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
1e650 66 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  f the winShmNode
1e660 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64   */.  p->pShmNod
1e670 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69  e = pShmNode;.#i
1e680 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1e690 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1e6a0 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f  ed(SQLITE_HAVE_O
1e6b0 53 5f 54 52 41 43 45 29 0a 20 20 70 2d 3e 69 64  S_TRACE).  p->id
1e6c0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78   = pShmNode->nex
1e6d0 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66  tShmId++;.#endif
1e6e0 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
1e6f0 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  f++;.  pDbFd->pS
1e700 68 6d 20 3d 20 70 3b 0a 20 20 77 69 6e 53 68 6d  hm = p;.  winShm
1e710 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
1e720 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
1e730 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
1e740 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
1e750 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
1e760 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
1e770 63 6f 76 65 72 20 6f 66 20 74 68 65 20 77 69 6e  cover of the win
1e780 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 20  ShmEnterMutex() 
1e790 6d 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f  mutex and the po
1e7a0 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20  inter from the. 
1e7b0 20 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20   ** new (struct 
1e7c0 77 69 6e 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  winShm) object t
1e7d0 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
1e7e0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
1e7f0 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
1e800 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
1e810 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
1e820 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
1e830 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
1e840 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
1e850 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
1e860 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
1e870 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
1e880 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 0a 20  ShmNode->mutex. 
1e890 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
1e8a0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1e8b0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
1e8c0 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
1e8d0 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
1e8e0 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
1e8f0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
1e900 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1e910 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1e920 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
1e930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
1e940 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
1e950 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
1e960 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68  pen_err:.  winSh
1e970 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e980 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c  Node, WINSHM_UNL
1e990 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1e9a0 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72   1);.  winShmPur
1e9b0 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1e9c0 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73  0);      /* This
1e9d0 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
1e9e0 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
1e9f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1ea00 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ee(p);.  sqlite3
1ea10 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77  _free(pNew);.  w
1ea20 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1ea30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ea40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1ea50 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1ea60 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1ea70 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1ea80 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ying.** storage 
1ea90 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
1eaa0 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
1eab0 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70   int winShmUnmap
1eac0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1ead0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1eae0 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1eaf0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
1eb00 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1eb10 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1eb20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72   /* Delete after
1eb30 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65   closing if true
1eb40 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65   */.){.  winFile
1eb50 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f   *pDbFd;       /
1eb60 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
1eb70 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1eb80 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b   */.  winShm *p;
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1eba0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1ebb0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
1ebc0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1ebd0 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64  Node; /* The und
1ebe0 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
1ebf0 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1ec00 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20  winShm **pp;    
1ec10 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
1ec20 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
1ec30 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
1ec40 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e  ..  pDbFd = (win
1ec50 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
1ec60 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
1ec70 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1ec80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
1ec90 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
1eca0 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  Node;..  /* Remo
1ecb0 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
1ecc0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
1ecd0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
1ece0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
1ecf0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
1ed00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1ed10 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
1ed20 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
1ed30 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1ed40 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
1ed50 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
1ed60 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
1ed70 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
1ed80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
1ed90 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
1eda0 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
1edb0 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
1edc0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
1edd0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1ede0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
1edf0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
1ee00 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
1ee10 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
1ee20 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
1ee30 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
1ee40 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  .  winShmEnterMu
1ee50 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
1ee60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e   pShmNode->nRef>
1ee70 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  0 );.  pShmNode-
1ee80 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
1ee90 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30  ShmNode->nRef==0
1eea0 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75   ){.    winShmPu
1eeb0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1eec0 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20   deleteFlag);.  
1eed0 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  }.  winShmLeaveM
1eee0 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72  utex();..  retur
1eef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ef00 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
1ef10 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20   lock state for 
1ef20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
1ef30 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  segment..*/.stat
1ef40 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63  ic int winShmLoc
1ef50 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
1ef60 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1ef70 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
1ef80 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
1ef90 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1efa0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
1efb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1efc0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
1efd0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
1efe0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
1eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f000 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
1f010 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
1f020 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
1f030 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
1f040 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
1f050 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
1f060 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ock */.){.  winF
1f070 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
1f080 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  nFile*)fd;      
1f090 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1f0a0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1f0b0 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1f0c0 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
1f0d0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1f0e0 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
1f0f0 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
1f100 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ed */.  winShm *
1f110 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
1f120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f130 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
1f140 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
1f150 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1f160 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1f170 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
1f180 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
1f1b0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1f1e0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
1f1f0 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
1f200 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74  ..  assert( ofst
1f210 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53  >=0 && ofst+n<=S
1f220 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20  QLITE_SHM_NLOCK 
1f230 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  );.  assert( n>=
1f240 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  1 );.  assert( f
1f250 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1f260 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
1f270 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
1f280 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
1f290 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20  LITE_SHM_LOCK | 
1f2a0 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55  SQLITE_SHM_EXCLU
1f2b0 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20  SIVE).       || 
1f2c0 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1f2d0 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
1f2e0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
1f2f0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
1f300 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
1f310 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1f320 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20  EXCLUSIVE) );.  
1f330 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20  assert( n==1 || 
1f340 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
1f350 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  SHM_EXCLUSIVE)!=
1f360 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
1f370 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b  u16)((1U<<(ofst+
1f380 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29  n)) - (1U<<ofst)
1f390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
1f3a0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
1f3b0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
1f3c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1f3d0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1f3e0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1f3f0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
1f400 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
1f410 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
1f420 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1f430 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
1f440 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
1f450 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
1f460 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
1f470 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1f480 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1f490 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1f4a0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
1f4b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1f4c0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
1f4d0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
1f4e0 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
1f4f0 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
1f500 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
1f510 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1f520 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
1f530 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
1f540 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
1f550 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
1f560 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1f570 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74   rc = winShmSyst
1f580 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
1f590 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f   WINSHM_UNLCK, o
1f5a0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1f5b0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1f5c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1f5d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1f5e0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1f5f0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1f600 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1f610 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1f620 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1f630 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1f640 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1f650 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1f660 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1f670 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1f680 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1f690 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1f6a0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1f6b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1f6c0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1f6d0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1f6e0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1f6f0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1f700 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1f710 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1f720 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1f730 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1f740 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1f750 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1f760 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1f770 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1f780 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1f790 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1f7a0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1f7b0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1f7c0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1f7d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1f7e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1f7f0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1f800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1f810 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1f820 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1f830 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1f840 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1f850 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1f860 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1f870 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1f880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1f890 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1f8a0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1f8b0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1f8c0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1f8d0 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b  de, WINSHM_RDLCK
1f8e0 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1f8f0 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
1f900 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1f910 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1f920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f930 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
1f940 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
1f950 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
1f960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f970 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
1f980 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
1f990 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
1f9a0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
1f9b0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
1f9c0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
1f9d0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
1f9e0 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
1f9f0 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1fa00 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1fa10 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
1fa20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1fa30 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1fa40 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1fa50 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
1fa60 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
1fa70 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
1fa80 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
1fa90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1faa0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1fab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1fac0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fad0 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69   Get the exclusi
1fae0 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ve locks at the 
1faf0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54  system level.  T
1fb00 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75  hen if successfu
1fb10 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61  l.    ** also ma
1fb20 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e  rk the local con
1fb30 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67  nection as being
1fb40 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a   locked..    */.
1fb50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1fb60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1fb70 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1fb80 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1fb90 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73  INSHM_WRLCK, ofs
1fba0 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20  t+WIN_SHM_BASE, 
1fbb0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
1fbc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1fbd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
1fbe0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
1fbf0 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
1fc00 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1fc10 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
1fc20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
1fc30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1fc40 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1fc50 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1fc60 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c  HM-LOCK pid=%lu,
1fc70 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61   id=%d, sharedMa
1fc80 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73  sk=%03x, exclMas
1fc90 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22  k=%03x, rc=%s\n"
1fca0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1fcb0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fcc0 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e  Id(), p->id, p->
1fcd0 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
1fce0 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20  xclMask,.       
1fcf0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61      sqlite3ErrNa
1fd00 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
1fd10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1fd20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
1fd30 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
1fd40 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
1fd50 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a  ared memory..**.
1fd60 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
1fd70 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
1fd80 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
1fd90 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
1fda0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
1fdb0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
1fdc0 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
1fdd0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
1fde0 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  id winShmBarrier
1fdf0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1fe00 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a   *fd          /*
1fe10 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1fe20 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
1fe30 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
1fe40 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
1fe50 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
1fe60 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 2f 2a  yBarrier();   /*
1fe70 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65   compiler-define
1fe80 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  d memory barrier
1fe90 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65   */.  winShmEnte
1fea0 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  rMutex();       
1feb0 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66  /* Also mutex, f
1fec0 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f  or redundancy */
1fed0 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1fee0 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
1fef0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ff00 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1ff10 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72  n a pointer to r
1ff20 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66  egion iRegion of
1ff30 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d   the.** shared-m
1ff40 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
1ff50 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
1ff60 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
1ff70 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1ff80 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65  s.** are numbere
1ff90 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
1ffa0 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
1ffb0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1ffc0 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62  is szRegion.** b
1ffd0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
1ffe0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1fff0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
20000 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
20010 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
20020 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
20030 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
20040 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65  e isWrite parame
20050 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
20060 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
20070 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
20080 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
20090 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
200a0 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
200b0 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
200c0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
200d0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
200e0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
200f0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
20100 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a   returned. If.**
20110 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
20120 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
20130 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
20140 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
20150 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20  not yet.** been 
20160 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73  allocated, it is
20170 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
20180 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  is function..**.
20190 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
201a0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
201b0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
201c0 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20  allocated or is 
201d0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
201e0 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73  this call as des
201f0 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68  cribed above, th
20200 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20  en it is mapped 
20210 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
20220 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73  ses.** address s
20230 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e  pace (if it is n
20240 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70  ot already), *pp
20250 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
20260 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a   to the mapped.*
20270 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
20280 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
20290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
202a0 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69  inShmMap(.  sqli
202b0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
202c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48              /* H
202d0 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61  andle open on da
202e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
202f0 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20   int iRegion,   
20300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20310 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65   /* Region to re
20320 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20  trieve */.  int 
20330 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20  szRegion,       
20340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20350 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a  ize of regions *
20360 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c  /.  int isWrite,
20370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20380 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65      /* True to e
20390 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65  xtend file if ne
203a0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69  cessary */.  voi
203b0 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20  d volatile **pp 
203c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
203d0 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f  OUT: Mapped memo
203e0 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ry */.){.  winFi
203f0 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
20400 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53  File*)fd;.  winS
20410 68 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46 64  hm *pShm = pDbFd
20420 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d  ->pShm;.  winShm
20430 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a  Node *pShmNode;.
20440 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
20450 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 53  E_OK;..  if( !pS
20460 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77  hm ){.    rc = w
20470 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
20480 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
20490 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
204a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
204b0 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e    pShm = pDbFd->
204c0 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d  pShm;.  }.  pShm
204d0 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53 68  Node = pShm->pSh
204e0 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65  mNode;..  sqlite
204f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
20500 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
20510 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
20520 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
20530 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
20540 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
20550 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
20560 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
20570 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ion ){.    struc
20580 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e  t ShmRegion *apN
20590 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
205a0 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61   New aRegion[] a
205b0 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
205c0 6e 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e  nByte = (iRegion
205d0 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f  +1)*szRegion;  /
205e0 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
205f0 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
20600 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
20610 34 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20  4 sz;           
20620 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
20630 74 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e  t size of wal-in
20640 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  dex file */..   
20650 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67   pShmNode->szReg
20660 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a  ion = szRegion;.
20670 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
20680 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20  ested region is 
20690 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  not mapped into 
206a0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
206b0 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20  ddress space..  
206c0 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    ** Check to se
206d0 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e  e if it has been
206e0 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e   allocated (i.e.
206f0 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65   if the wal-inde
20700 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  x file is.    **
20710 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
20720 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71   contain the req
20730 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a  uested region)..
20740 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
20750 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c  winFileSize((sql
20760 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68  ite3_file *)&pSh
20770 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73  mNode->hFile, &s
20780 7a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  z);.    if( rc!=
20790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
207a0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
207b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
207c0 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
207d0 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
207e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207f0 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c     "winShmMap1",
20800 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a   pDbFd->zPath);.
20810 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
20820 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ge_out;.    }.. 
20830 20 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20     if( sz<nByte 
20840 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
20850 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
20860 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
20870 20 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69   exist. If isWri
20880 74 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  te is set to.   
20890 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74     ** zero, exit
208a0 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c   early. *pp will
208b0 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20   be set to NULL 
208c0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
208d0 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a  turned..      **
208e0 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e  .      ** Altern
208f0 61 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72  atively, if isWr
20900 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ite is non-zero,
20910 20 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29   use ftruncate()
20920 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20   to allocate.   
20930 20 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73     ** the reques
20940 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
20950 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
20960 20 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29    if( !isWrite )
20970 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20980 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  t;.      rc = wi
20990 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74  nTruncate((sqlit
209a0 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e  e3_file *)&pShmN
209b0 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74  ode->hFile, nByt
209c0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
209d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
209e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
209f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
20a00 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
20a10 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
20a40 4d 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map2", pDbFd->zP
20a50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  ath);.        go
20a60 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
20a70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
20a80 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65     /* Map the re
20a90 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
20aa0 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20  egion into this 
20ab0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
20ac0 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  s space. */.    
20ad0 61 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20  apNew = (struct 
20ae0 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69  ShmRegion *)sqli
20af0 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20  te3_realloc64(. 
20b00 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
20b10 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69  >aRegion, (iRegi
20b20 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e  on+1)*sizeof(apN
20b30 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20  ew[0]).    );.  
20b40 20 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a    if( !apNew ){.
20b50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20b60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
20b70 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  PT;.      goto s
20b80 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
20b90 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  }.    pShmNode->
20ba0 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  aRegion = apNew;
20bb0 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68  ..    while( pSh
20bc0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
20bd0 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  iRegion ){.     
20be0 20 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e   HANDLE hMap = N
20bf0 55 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ULL;         /* 
20c00 66 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e  file-mapping han
20c10 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69  dle */.      voi
20c20 64 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20  d *pMap = 0;    
20c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70           /* Mapp
20c40 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
20c50 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
20c60 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68  OS_WINRT.      h
20c70 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
20c80 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
20c90 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
20ca0 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
20cb0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
20cc0 54 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a  TE, nByte, NULL.
20cd0 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64        );.#elif d
20ce0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
20cf0 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
20d00 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65      hMap = osCre
20d10 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28  ateFileMappingW(
20d20 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
20d30 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
20d40 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
20d50 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c  E, 0, nByte, NUL
20d60 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66  L.      );.#elif
20d70 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20d80 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
20d90 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
20da0 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e  CREATEFILEMAPPIN
20db0 47 41 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20  GA.      hMap = 
20dc0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
20dd0 69 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  ingA(pShmNode->h
20de0 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20  File.h,.        
20df0 20 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41    NULL, PAGE_REA
20e00 44 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65  DWRITE, 0, nByte
20e10 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a  , NULL.      );.
20e20 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54  #endif.      OST
20e30 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43  RACE(("SHM-MAP-C
20e40 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72  REATE pid=%lu, r
20e50 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25  egion=%d, size=%
20e60 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
20e70 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
20e80 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20e90 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  d(), pShmNode->n
20ea0 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20  Region, nByte,. 
20eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d                hM
20ec0 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  ap ? "ok" : "fai
20ed0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66  led"));.      if
20ee0 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20  ( hMap ){.      
20ef0 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20    int iOffset = 
20f00 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
20f10 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
20f20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53      int iOffsetS
20f30 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25  hift = iOffset %
20f40 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
20f50 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
20f60 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ity;.#if SQLITE_
20f70 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20  OS_WINRT.       
20f80 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65   pMap = osMapVie
20f90 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68  wOfFileFromApp(h
20fa0 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52  Map, FILE_MAP_WR
20fb0 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52  ITE | FILE_MAP_R
20fc0 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAD,.           
20fd0 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73   iOffset - iOffs
20fe0 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f  etShift, szRegio
20ff0 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74  n + iOffsetShift
21000 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73  .        );.#els
21010 65 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d  e.        pMap =
21020 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
21030 28 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f  (hMap, FILE_MAP_
21040 57 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50  WRITE | FILE_MAP
21050 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20  _READ,.         
21060 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20     0, iOffset - 
21070 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a  iOffsetShift, sz
21080 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74  Region + iOffset
21090 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b  Shift.        );
210a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
210b0 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
210c0 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  P-MAP pid=%lu, r
210d0 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74  egion=%d, offset
210e0 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63  =%d, size=%d, rc
210f0 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
21100 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21110 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21120 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  , pShmNode->nReg
21130 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20  ion, iOffset,.  
21140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
21150 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20  zRegion, pMap ? 
21160 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
21170 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21180 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20   if( !pMap ){.  
21190 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
211a0 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
211b0 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
211c0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
211d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
211e0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d  ERR_SHMMAP, pShm
211f0 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  Node->lastErrno,
21200 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21210 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68            "winSh
21220 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a  mMap3", pDbFd->z
21230 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69  Path);.        i
21240 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73  f( hMap ) osClos
21250 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20  eHandle(hMap);. 
21260 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
21270 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  age_out;.      }
21280 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ..      pShmNode
21290 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f  ->aRegion[pShmNo
212a0 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61  de->nRegion].pMa
212b0 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20  p = pMap;.      
212c0 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f  pShmNode->aRegio
212d0 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  n[pShmNode->nReg
212e0 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70  ion].hMap = hMap
212f0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21300 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20  ->nRegion++;.   
21310 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
21320 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
21330 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
21340 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  gion ){.    int 
21350 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f  iOffset = iRegio
21360 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20  n*szRegion;.    
21370 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
21380 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
21390 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
213a0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
213b0 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28  .    char *p = (
213c0 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d  char *)pShmNode-
213d0 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  >aRegion[iRegion
213e0 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20  ].pMap;.    *pp 
213f0 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66  = (void *)&p[iOf
21400 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65  fsetShift];.  }e
21410 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
21420 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
21430 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
21440 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
21450 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
21460 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  lse.# define win
21470 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
21480 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b  efine winShmLock
21490 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77      0.# define w
214a0 69 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  inShmBarrier 0.#
214b0 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e   define winShmUn
214c0 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
214d0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
214e0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
214f0 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68  .** Cleans up th
21500 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20  e mapped region 
21510 6f 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  of the specified
21520 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a   file, if any..*
21530 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
21540 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
21550 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70  tic int winUnmap
21560 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46  file(winFile *pF
21570 69 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ile){.  assert( 
21580 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53  pFile!=0 );.  OS
21590 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49  TRACE(("UNMAP-FI
215a0 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  LE pid=%lu, pFil
215b0 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70  e=%p, hMap=%p, p
215c0 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
215d0 20 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70             "mmap
215e0 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53  Size=%lld, mmapS
215f0 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20  izeActual=%lld, 
21600 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64  mmapSizeMax=%lld
21610 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21620 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
21630 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
21640 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69  pFile->hMap, pFi
21650 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a  le->pMapRegion,.
21660 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
21670 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c  ->mmapSize, pFil
21680 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  e->mmapSizeActua
21690 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  l, pFile->mmapSi
216a0 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70  zeMax));.  if( p
216b0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
216c0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55   ){.    if( !osU
216d0 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
216e0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
216f0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
21700 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
21710 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
21720 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21730 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
21740 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
21750 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
21760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
21770 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  c=SQLITE_IOERR_M
21780 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  MAP\n", osGetCur
21790 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
217a0 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20   pFile,.        
217b0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d         pFile->pM
217c0 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
217d0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
217e0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
217f0 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c  R_MMAP, pFile->l
21800 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65     "winUnmapfile
21830 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
21840 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  );.    }.    pFi
21850 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
21860 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d   0;.    pFile->m
21870 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
21880 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
21890 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
218a0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61    if( pFile->hMa
218b0 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  p!=NULL ){.    i
218c0 66 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  f( !osCloseHandl
218d0 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29  e(pFile->hMap) )
218e0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
218f0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
21900 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
21910 20 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d     OSTRACE(("UNM
21920 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
21930 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
21940 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
21950 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20  ERR_MMAP\n",.   
21960 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
21970 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
21980 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
21990 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20  e->hMap));.     
219a0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
219b0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
219c0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
219d0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
219e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219f0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32    "winUnmapfile2
21a00 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
21a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
21a20 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
21a30 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
21a40 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
21a50 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
21a60 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
21a70 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
21a80 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21a90 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65  ), pFile));.  re
21aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
21ac0 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
21ad0 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
21ae0 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
21af0 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
21b00 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
21b10 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
21b20 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
21b30 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
21b40 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74  ew). Or, if.** t
21b50 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69  here already exi
21b60 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f  sts a mapping fo
21b70 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  r this file, and
21b80 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c   there are still
21b90 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
21ba0 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
21bb0 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
21bc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21bd0 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
21be0 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
21bf0 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
21c00 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
21c10 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a  quested size of.
21c20 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
21c30 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
21c40 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
21c50 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
21c60 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71   then the.** req
21c70 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
21c80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
21c90 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
21ca0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
21cb0 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
21cc0 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
21cd0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
21ce0 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
21cf0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75   configured.** u
21d00 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
21d10 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69  L_MMAP_SIZE, whi
21d20 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
21d30 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  r..**.** SQLITE_
21d40 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
21d50 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
21d60 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d  s (even if the m
21d70 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a  apping is not.**
21d80 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20   recreated as a 
21d90 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61  result of outsta
21da0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
21db0 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  ) or an SQLite e
21dc0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
21dd0 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
21de0 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65  c int winMapfile
21df0 28 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73  (winFile *pFd, s
21e00 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
21e10 74 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  te){.  sqlite3_i
21e20 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74  nt64 nMap = nByt
21e30 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
21e40 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
21e50 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
21e60 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  t==0 );.  OSTRAC
21e70 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64  E(("MAP-FILE pid
21e80 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
21e90 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20  size=%lld\n",.  
21ea0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21eb0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21ec0 2c 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a  , pFd, nByte));.
21ed0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
21ee0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
21ef0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
21f00 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
21f10 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a   rc = winFileSiz
21f20 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  e((sqlite3_file*
21f30 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20  )pFd, &nMap);.  
21f40 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
21f50 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
21f60 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  FILE pid=%lu, pF
21f70 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
21f80 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22  E_IOERR_FSTAT\n"
21f90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21fa0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
21fb0 63 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b  cessId(), pFd));
21fc0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
21fd0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
21fe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
21ff0 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70  ( nMap>pFd->mmap
22000 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e  SizeMax ){.    n
22010 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  Map = pFd->mmapS
22020 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d  izeMax;.  }.  nM
22030 61 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f  ap &= ~(sqlite3_
22040 69 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66  int64)(winSysInf
22050 6f 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31  o.dwPageSize - 1
22060 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d  );..  if( nMap==
22070 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69  0 && pFd->mmapSi
22080 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55  ze>0 ){.    winU
22090 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
220a0 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70   }.  if( nMap!=p
220b0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
220c0 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d      void *pNew =
220d0 20 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72   0;.    DWORD pr
220e0 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41  otect = PAGE_REA
220f0 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44  DONLY;.    DWORD
22100 20 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41   flags = FILE_MA
22110 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e  P_READ;..    win
22120 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
22130 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d  #ifdef SQLITE_MM
22140 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  AP_READWRITE.   
22150 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
22160 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52  lags & WINFILE_R
22170 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20  DONLY)==0 ){.   
22180 20 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47     protect = PAG
22190 45 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  E_READWRITE;.   
221a0 20 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45     flags |= FILE
221b0 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20  _MAP_WRITE;.    
221c0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
221d0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
221e0 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
221f0 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
22200 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20  FromApp(pFd->h, 
22210 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e  NULL, protect, n
22220 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69  Map, NULL);.#eli
22230 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
22240 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
22250 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d  .    pFd->hMap =
22260 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
22270 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55  pingW(pFd->h, NU
22280 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20  LL, protect,.   
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
222b0 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20  ORD)((nMap>>32) 
222c0 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20  & 0xffffffff),. 
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
222f0 44 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78  DWORD)(nMap & 0x
22300 66 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29  ffffffff), NULL)
22310 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
22320 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
22330 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
22340 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c  _WIN32_CREATEFIL
22350 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 70 46  EMAPPINGA.    pF
22360 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61  d->hMap = osCrea
22370 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
22380 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f  Fd->h, NULL, pro
22390 74 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20  tect,.          
223a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223b0 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e        (DWORD)((n
223c0 4d 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66  Map>>32) & 0xfff
223d0 66 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20  fffff),.        
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28          (DWORD)(
22400 6e 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66  nMap & 0xfffffff
22410 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  f), NULL);.#endi
22420 66 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68  f.    if( pFd->h
22430 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Map==NULL ){.   
22440 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
22450 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
22460 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
22470 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
22480 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
22490 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
224c0 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le1", pFd->zPath
224d0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
224e0 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
224f0 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
22500 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
22510 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
22520 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
22530 41 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70  AP-FILE-CREATE p
22540 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
22550 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
22560 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
22570 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
22580 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33  (), pFd, sqlite3
22590 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
225a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
225b0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
225c0 20 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25   assert( (nMap %
225d0 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61   winSysInfo.dwPa
225e0 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20  geSize)==0 );.  
225f0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
22600 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66  (SIZE_T)==sizeof
22610 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20  (sqlite3_int64) 
22620 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66  || nMap<=0xfffff
22630 66 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54  fff );.#if SQLIT
22640 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70  E_OS_WINRT.    p
22650 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f  New = osMapViewO
22660 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64  fFileFromApp(pFd
22670 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30  ->hMap, flags, 0
22680 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b  , (SIZE_T)nMap);
22690 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
226a0 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
226b0 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  e(pFd->hMap, fla
226c0 67 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f  gs, 0, 0, (SIZE_
226d0 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a  T)nMap);.#endif.
226e0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55      if( pNew==NU
226f0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c  LL ){.      osCl
22700 6f 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68  oseHandle(pFd->h
22710 4d 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d  Map);.      pFd-
22720 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >hMap = NULL;.  
22730 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72      pFd->lastErr
22740 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
22750 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20  ror();.      rc 
22760 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
22770 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
22780 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c   pFd->lastErrno,
22790 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
227a0 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66          "winMapf
227b0 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74  ile2", pFd->zPat
227c0 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67  h);.      /* Log
227d0 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20   the error, but 
227e0 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20  continue normal 
227f0 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20  operation using 
22800 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a  xRead/xWrite */.
22810 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22820 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64  MAP-FILE-MAP pid
22830 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
22840 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
22850 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
22860 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
22870 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
22880 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
22890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
228a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
228b0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
228c0 20 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e   pNew;.    pFd->
228d0 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b  mmapSize = nMap;
228e0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
228f0 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b  zeActual = nMap;
22900 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
22910 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  ("MAP-FILE pid=%
22920 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
22930 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
22940 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22950 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22960 29 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75  ), pFd));.  retu
22970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22980 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
22990 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
229a0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f   */../*.** If po
229b0 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61  ssible, return a
229c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61   pointer to a ma
229d0 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64  pping of file fd
229e0 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66   starting at off
229f0 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65  set.** iOff. The
22a00 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65   mapping must be
22a10 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65   valid for at le
22a20 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a  ast nAmt bytes..
22a30 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20  **.** If such a 
22a40 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f  pointer can be o
22a50 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69  btained, store i
22a60 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74  t in *pp and ret
22a70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
22a80 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e  * Or, if one can
22a90 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  not but no error
22aa0 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70   occurs, set *pp
22ab0 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e   to 0 and return
22ac0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46   SQLITE_OK..** F
22ad0 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  inally, if an er
22ae0 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20  ror does occur, 
22af0 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65  return an SQLite
22b00 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65   error code. The
22b10 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20   final.** value 
22b20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69  of *pp is undefi
22b30 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  ned in this case
22b40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
22b50 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65  function does re
22b60 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20  turn a pointer, 
22b70 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  the caller must 
22b80 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65  eventually.** re
22b90 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65  lease the refere
22ba0 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77  nce by calling w
22bb0 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  inUnfetch()..*/.
22bc0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65  static int winFe
22bd0 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
22be0 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
22bf0 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a  int nAmt, void *
22c00 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *pp){.#if SQLITE
22c10 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
22c20 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20  .  winFile *pFd 
22c30 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
22c40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
22c50 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
22c60 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
22c70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43  p = 0;..  OSTRAC
22c80 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
22c90 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66  u, pFile=%p, off
22ca0 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74  set=%lld, amount
22cb0 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20  =%d, pp=%p\n",. 
22cc0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
22cd0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
22ce0 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d  ), fd, iOff, nAm
22cf0 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51  t, pp));..#if SQ
22d00 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
22d10 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e  ZE>0.  if( pFd->
22d20 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b  mmapSizeMax>0 ){
22d30 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d  .    if( pFd->pM
22d40 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20  apRegion==0 ){. 
22d50 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
22d60 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  nMapfile(pFd, -1
22d70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
22d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22d90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22da0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
22db0 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  File=%p, rc=%s\n
22dc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22dd0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22de0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
22df0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
22e00 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
22e10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
22e20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
22e30 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e   pFd->mmapSize >
22e40 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20  = iOff+nAmt ){. 
22e50 20 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38       *pp = &((u8
22e60 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69   *)pFd->pMapRegi
22e70 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  on)[iOff];.     
22e80 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b   pFd->nFetchOut+
22e90 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  +;.    }.  }.#en
22ea0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
22eb0 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20  "FETCH pid=%lu, 
22ec0 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c  pFile=%p, pp=%p,
22ed0 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49   *pp=%p, rc=SQLI
22ee0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
22ef0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
22f00 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64  tProcessId(), fd
22f10 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72  , pp, *pp));.  r
22f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22f30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
22f40 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
22f50 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
22f60 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
22f70 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65  releases a.** re
22f80 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
22f90 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
22fa0 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28  all to winFetch(
22fb0 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  ). The second.**
22fc0 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
22fd0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
22fe0 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  n must be the sa
22ff0 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73  me as the corres
23000 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d  ponding.** argum
23010 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73  ent that was pas
23020 73 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65  sed to the winFe
23030 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e  tch() invocation
23040 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74  ..**.** Or, if t
23050 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
23060 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
23070 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
23080 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a   being called.**
23090 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
230a0 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
230b0 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
230c0 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
230d0 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e  mapping.** may n
230e0 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
230f0 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
23100 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
23110 69 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73  int winUnfetch(s
23120 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
23130 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20   i64 iOff, void 
23140 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  *p){.#if SQLITE_
23150 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
23160 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
23170 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
23180 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
23190 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
231a0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d   */..  /* If p==
231b0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
231c0 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
231d0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
231e0 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a  outstanding.  **
231f0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
23200 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
23210 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
23220 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
23230 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
23240 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
23250 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
23260 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
23270 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
23280 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
23290 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
232a0 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
232b0 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
232c0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
232d0 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
232e0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
232f0 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53  )[iOff] );..  OS
23300 54 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20  TRACE(("UNFETCH 
23310 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
23320 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20  p, offset=%lld, 
23330 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  p=%p\n",.       
23340 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
23350 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
23360 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20  , iOff, p));..  
23370 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64  if( p ){.    pFd
23380 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20  ->nFetchOut--;. 
23390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46   }else{.    /* F
233a0 49 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77  IXME:  If Window
233b0 73 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70  s truly always p
233c0 72 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69  revents truncati
233d0 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61  ng or deleting a
233e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69  .    ** file whi
233f0 6c 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20  le a mapping is 
23400 68 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66  held, then the f
23410 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61  ollowing winUnma
23420 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20  pfile() call.   
23430 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61   ** is unnecessa
23440 72 79 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65  ry can be omitte
23450 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20  d - potentially 
23460 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a  improving.    **
23470 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a   performance.  *
23480 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69  /.    winUnmapfi
23490 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
234a0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
234b0 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e  tchOut>=0 );.#en
234c0 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  dif..  OSTRACE((
234d0 22 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75  "UNFETCH pid=%lu
234e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53  , pFile=%p, rc=S
234f0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
23500 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
23510 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
23520 20 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   fd));.  return 
23530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23540 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
23550 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
23560 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
23570 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
23580 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
23590 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
235a0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
235b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
235c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
235e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
235f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
23620 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
23630 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
23640 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
23650 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
23660 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
23670 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f  le for win32..*/
23680 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
23690 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
236a0 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b   winIoMethod = {
236b0 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
236c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236d0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
236e0 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20  /.  winClose,   
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23700 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f      /* xClose */
23710 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20  .  winRead,     
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20     /* xRead */. 
23740 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20   winWrite,      
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23760 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20   /* xWrite */.  
23770 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20  winTruncate,    
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a  /* xTruncate */.
237a0 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20    winSync,      
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20    /* xSync */.  
237d0 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  winFileSize,    
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237f0 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a  /* xFileSize */.
23800 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20    winLock,      
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23820 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20    /* xLock */.  
23830 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  winUnlock,      
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20  /* xUnlock */.  
23860 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
23870 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
23880 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
23890 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69  dLock */.  winFi
238a0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
238b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
238c0 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20  ileControl */.  
238d0 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  winSectorSize,  
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
23900 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61  /.  winDeviceCha
23910 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20  racteristics,   
23920 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68      /* xDeviceCh
23930 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f  aracteristics */
23940 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20  .  winShmMap,   
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23960 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
23970 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20  .  winShmLock,  
23980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23990 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
239a0 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65  /.  winShmBarrie
239b0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
239c0 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69      /* xShmBarri
239d0 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e  er */.  winShmUn
239e0 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  map,            
239f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
23a00 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74  nmap */.  winFet
23a10 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ch,             
23a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
23a30 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65  tch */.  winUnfe
23a40 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
23a50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
23a60 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  etch */.};../*.*
23a70 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20 64 65  * This vector de
23a80 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65  fines all the me
23a90 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f  thods that can o
23aa0 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a 2a 20  perate on an.** 
23ab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66 6f 72  sqlite3_file for
23ac0 20 77 69 6e 33 32 20 77 69 74 68 6f 75 74 20 70   win32 without p
23ad0 65 72 66 6f 72 6d 69 6e 67 20 61 6e 79 20 6c 6f  erforming any lo
23ae0 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
23af0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
23b00 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e 49 6f 4e  o_methods winIoN
23b10 6f 6c 6f 63 6b 4d 65 74 68 6f 64 20 3d 20 7b 0a  olockMethod = {.
23b20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
23b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b40 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
23b50 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b70 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
23b80 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
23b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ba0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
23bb0 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
23bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23bd0 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
23be0 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
23bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c00 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
23c10 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
23c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c30 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
23c40 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
23c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23c60 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
23c70 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20   winNolockLock, 
23c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c90 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
23ca0 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20  inNolockUnlock, 
23cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23cc0 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
23cd0 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  inNolockCheckRes
23ce0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f  ervedLock,     /
23cf0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
23d00 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
23d10 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
23d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
23d30 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
23d40 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23d60 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
23d70 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
23d80 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
23d90 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
23da0 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
23db0 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
23de0 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
23e10 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
23e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23e30 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
23e40 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
23e50 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
23e60 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
23e70 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63  map */.  winFetc
23e80 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
23e90 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
23ea0 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74  ch */.  winUnfet
23eb0 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
23ec0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
23ed0 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 73 74 61 74 69  tch */.};..stati
23ee0 63 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20  c winVfsAppData 
23ef0 77 69 6e 41 70 70 44 61 74 61 20 3d 20 7b 0a 20  winAppData = {. 
23f00 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 2c 20 20   &winIoMethod,  
23f10 20 20 20 20 20 2f 2a 20 70 4d 65 74 68 6f 64 20       /* pMethod 
23f20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
23f30 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
23f40 44 61 74 61 20 2a 2f 0a 20 20 30 20 20 20 20 20  Data */.  0     
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f60 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a   bNoLock */.};..
23f70 73 74 61 74 69 63 20 77 69 6e 56 66 73 41 70 70  static winVfsApp
23f80 44 61 74 61 20 77 69 6e 4e 6f 6c 6f 63 6b 41 70  Data winNolockAp
23f90 70 44 61 74 61 20 3d 20 7b 0a 20 20 26 77 69 6e  pData = {.  &win
23fa0 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 2c 20  IoNolockMethod, 
23fb0 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f 0a 20 20  /* pMethod */.  
23fc0 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
23fd0 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20      /* pAppData 
23fe0 2a 2f 0a 20 20 31 20 20 20 20 20 20 20 20 20 20  */.  1          
23ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 62 4e 6f 4c           /* bNoL
24000 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  ock */.};../****
24010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24050 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
24060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24070 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
24080 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
24090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
240a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
240b0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
240c0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
240d0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
240e0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
240f0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
24100 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
24110 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a  __CYGWIN__)./*.*
24120 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65  * Convert a file
24130 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76  name from whatev
24140 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  er the underlyin
24150 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
24160 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66  em.** supports f
24170 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74  or filenames int
24180 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
24190 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
241a0 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  lt is.** obtaine
241b0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
241c0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
241d0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
241e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
241f0 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76  ic char *winConv
24200 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
24210 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46  e(const void *zF
24220 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
24230 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
24240 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
24250 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
24260 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ed = winUnicodeT
24270 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29  oUtf8(zFilename)
24280 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
24290 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
242a0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
242b0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 4d  Converted = winM
242c0 62 63 73 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e  bcsToUtf8(zFilen
242d0 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ame, osAreFileAp
242e0 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23  isANSI());.  }.#
242f0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
24300 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
24310 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
24320 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
24330 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
24340 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
24350 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
24360 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
24370 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
24380 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
24390 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
243a0 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
243b0 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
243c0 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
243d0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
243e0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
243f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
24400 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
24410 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
24420 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
24430 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
24440 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
24450 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
24460 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
24470 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
24480 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
24490 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
244a0 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
244b0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
244c0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
244d0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
244e0 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 46 69  inUtf8ToMbcs(zFi
244f0 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c  lename, osAreFil
24500 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
24510 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
24520 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
24530 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
24540 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
24550 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
24560 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
24570 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
24580 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
24590 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66  UTF-8 string buf
245a0 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68  fer.** ends with
245b0 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65 70   a directory sep
245c0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
245d0 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63   or one was succ
245e0 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65  essfully.** adde
245f0 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  d to it..*/.stat
24600 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e  ic int winMakeEn
24610 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42  dInDirSep(int nB
24620 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
24630 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20  .  if( zBuf ){. 
24640 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71     int nLen = sq
24650 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
24660 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  uf);.    if( nLe
24670 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
24680 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75   winIsDirSep(zBu
24690 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  f[nLen-1]) ){.  
246a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
246b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
246c0 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20  nLen+1<nBuf ){. 
246d0 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
246e0 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70  ] = winGetDirSep
246f0 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66  ();.        zBuf
24700 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nLen+1] = '\0';
24710 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24720 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
24730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
24740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
24750 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
24760 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65  e name and store
24770 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70   the resulting p
24780 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75  ointer into pzBu
24790 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  f..** The pointe
247a0 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a  r returned in pz
247b0 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65 65  Buf must be free
247c0 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72  d via sqlite3_fr
247d0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
247e0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
247f0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
24800 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42  pVfs, char **pzB
24810 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
24820 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
24830 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
24840 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
24850 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
24860 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
24870 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
24880 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
24890 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71  .  int nPre = sq
248a0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
248b0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
248c0 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d  REFIX);.  int nM
248d0 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20  ax, nBuf, nDir, 
248e0 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nLen;.  char *zB
248f0 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  uf;..  /* It's o
24900 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
24910 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
24920 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
24930 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
24940 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
24950 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
24960 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
24970 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
24980 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
24990 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53  ailing..  */.  S
249a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
249b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
249c0 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ERR );..  /* All
249d0 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  ocate a temporar
249e0 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  y buffer to stor
249f0 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  e the fully qual
24a00 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20  ified file.  ** 
24a10 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d  name for the tem
24a20 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66  porary file.  If
24a30 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20   this fails, we 
24a40 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e  cannot continue.
24a50 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70  .  */.  nMax = p
24a60 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b  Vfs->mxPathname;
24a70 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32   nBuf = nMax + 2
24a80 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74  ;.  zBuf = sqlit
24a90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
24aa0 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75  uf );.  if( !zBu
24ab0 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  f ){.    OSTRACE
24ac0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
24ad0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
24ae0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
24af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
24b00 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
24b10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
24b20 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
24b30 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
24b40 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
24b50 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
24b60 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
24b70 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
24b80 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
24b90 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
24ba0 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
24bb0 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
24bc0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
24bd0 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
24be0 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
24bf0 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
24c00 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
24c10 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
24c20 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
24c30 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
24c40 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
24c50 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
24c60 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
24c70 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
24c80 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
24c90 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
24ca0 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
24cb0 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
24cc0 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
24cd0 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
24ce0 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
24cf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
24d00 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
24d10 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
24d20 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
24d30 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
24d40 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
24d50 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
24d60 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
24d70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
24d80 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
24d90 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
24da0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
24db0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
24dc0 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
24dd0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
24de0 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
24df0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
24e00 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
24e10 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
24e20 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
24e30 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
24e40 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
24e50 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
24e60 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
24e70 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
24e80 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
24e90 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
24ea0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
24eb0 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
24ec0 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
24ed0 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
24ee0 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
24ef0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
24f00 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
24f10 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
24f20 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
24f30 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
24f40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
24f50 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
24f60 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
24f70 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
24f80 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
24f90 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
24fa0 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
24fb0 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
24fc0 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
24fd0 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
24fe0 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
24ff0 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
25000 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
25010 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
25020 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
25030 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
25040 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
25050 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
25060 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
25070 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
25080 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
25090 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
250a0 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
250b0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
250c0 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
250d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
250e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
250f0 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
25100 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
25110 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
25120 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
25130 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
25140 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
25150 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
25160 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
25170 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
25180 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
25190 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
251a0 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
251b0 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
251c0 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
251d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
251e0 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
251f0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
25200 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
25210 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
25220 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
25230 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
25240 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
25250 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
25260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
25270 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
25280 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
25290 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
252a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
252b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
252c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
252d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
252e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
252f0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
25300 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
25310 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
25320 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
25330 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
25340 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25350 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
25370 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
25380 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25390 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
253a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
253b0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
253c0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
253d0 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
253e0 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
253f0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
25400 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25410 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
25420 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25430 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25440 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
25450 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
25460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
25470 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
25480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25490 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
254a0 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
254b0 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29          osIsNT()
254c0 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
254d0 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
254e0 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72  X_TO_WIN_A, zDir
254f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25500 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d    zConverted, nM
25510 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  ax+1)<0 ){.     
25520 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25530 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25540 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25550 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25560 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
25570 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
25580 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  c=SQLITE_IOERR_C
25590 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  ONVPATH\n"));.  
255a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
255b0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
255c0 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
255d0 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
25600 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
25610 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zDir);.        }
25620 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
25630 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
25640 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
25650 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
25660 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e   we know the can
25670 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79  didate directory
25680 20 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75   exists and shou
25690 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ld.          ** 
256a0 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65  be used.  Howeve
256b0 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74  r, we may need t
256c0 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74  o convert the st
256d0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
256e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
256f0 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38   name into UTF-8
25700 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20   (i.e. if it is 
25710 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77  UTF-16 right now
25720 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
25730 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
25740 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
25750 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
25760 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
25770 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74          if( !zUt
25780 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f8 ){.          
25790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
257a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
257b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
257c0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
257d0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
257e0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
257f0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
25800 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
25810 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
25820 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25830 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
25840 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
25850 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
25860 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
25870 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20   zUtf8);.       
25880 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25890 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20  zUtf8);.        
258a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
258b0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
258c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
258d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
258e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
258f0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
25900 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66  .    }.  }.#elif
25910 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
25920 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
25930 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
25940 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
25950 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
25960 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57  i;.    LPWSTR zW
25970 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65  idePath = sqlite
25980 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
25990 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20  x*sizeof(WCHAR) 
259a0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64  );.    if( !zWid
259b0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73  ePath ){.      s
259c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
259d0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
259e0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
259f0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
25a00 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
25a10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25a20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25a30 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
25a40 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
25a50 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29  nMax, zWidePath)
25a60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
25a70 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
25a80 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
25a90 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
25aa0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
25ab0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
25ac0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
25ad0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
25ae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
25af0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
25b00 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
25b10 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
25b20 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
25b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
25b40 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
25b50 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
25b60 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
25b70 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
25b80 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
25b90 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
25ba0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
25bb0 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
25bc0 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
25bd0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
25be0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
25bf0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
25c00 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  h);.    }else{. 
25c10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25c20 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
25c30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25c40 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
25c50 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
25c60 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
25c70 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
25c80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
25c90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25ca0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
25cb0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
25cc0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
25cd0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
25ce0 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
25cf0 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71   *zMbcsPath = sq
25d00 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
25d10 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28   nMax );.    if(
25d20 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20   !zMbcsPath ){. 
25d30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25d40 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
25d50 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
25d60 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
25d70 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
25d80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25d90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25da0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
25db0 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
25dc0 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63  PathA(nMax, zMbc
25dd0 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  sPath)==0 ){.   
25de0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25df0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
25e00 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
25e10 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
25e20 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
25e30 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
25e40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
25e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
25e60 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
25e70 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
25e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e90 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
25ea0 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20  name3", 0);.    
25eb0 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 77 69  }.    zUtf8 = wi
25ec0 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 4d 62 63  nMbcsToUtf8(zMbc
25ed0 73 50 61 74 68 2c 20 6f 73 41 72 65 46 69 6c 65  sPath, osAreFile
25ee0 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20  ApisANSI());.   
25ef0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
25f00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
25f10 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
25f20 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
25f30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25f40 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
25f50 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
25f60 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
25f70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
25f80 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
25f90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25fa0 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
25fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
25fc0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
25fd0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
25fe0 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
25ff0 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64  HAS_ANSI */.#end
26000 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
26010 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a  _WINRT */..  /*.
26020 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
26030 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70  ke sure the temp
26040 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
26050 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70  ends with an app
26060 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65  ropriate.  ** se
26070 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  parator.  If it 
26080 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65  does not and the
26090 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
260a0 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61   space left to a
260b0 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69  dd.  ** one, fai
260c0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77  l..  */.  if( !w
260d0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
260e0 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20  p(nDir+1, zBuf) 
260f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
26100 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
26110 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
26120 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
26130 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
26140 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
26150 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
26160 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
26170 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a  name4", 0);.  }.
26180 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
26190 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
261a0 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
261b0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
261c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20  temporary file. 
261d0 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20   ** name in the 
261e0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
261f0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c  :.  **.  **   "<
26200 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
26210 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58  ory>/etilqs_XXXX
26220 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22  XXXXXXXXXXX\0\0"
26230 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f  .  **.  ** If no
26240 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
26250 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d  _ERROR.  The num
26260 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68  ber 17 is used h
26270 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ere in order to.
26280 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72    ** account for
26290 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
262a0 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63  by the 15 charac
262b0 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69  ter random suffi
262c0 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74  x and the.  ** t
262d0 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20  wo trailing NUL 
262e0 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65  characters.  The
262f0 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79   final directory
26300 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
26310 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c  cter.  ** has al
26320 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69  ready added if i
26330 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t was not alread
26340 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a  y present..  */.
26350 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33    nLen = sqlite3
26360 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
26370 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50    if( (nLen + nP
26380 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20  re + 17) > nBuf 
26390 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
263a0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
263b0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
263c0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
263d0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
263e0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
263f0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
26400 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
26410 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a  name5", 0);.  }.
26420 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26430 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e  ntf(nBuf-16-nLen
26440 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
26450 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
26460 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
26470 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
26480 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
26490 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
264a0 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
264b0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
264c0 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
264d0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
264e0 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
264f0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
26500 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
26510 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
26520 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
26530 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
26540 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
26550 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
26560 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
26570 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
26580 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
26590 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
265a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
265b0 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
265c0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
265d0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
265e0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
265f0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
26600 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
26610 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
26620 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
26630 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
26640 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
26650 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
26660 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
26670 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
26680 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
26690 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
266a0 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
266b0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
266c0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
266d0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
266e0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
266f0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
26700 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
26710 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
26720 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
26730 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
26740 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
26750 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
26760 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
26780 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
26790 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
267c0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
267d0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
267e0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
267f0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
26800 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
26810 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
26820 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
26830 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
26840 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
26850 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
26860 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
26870 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
26880 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
26890 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
268a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
268b0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
268c0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
268d0 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
268e0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
268f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
26900 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
26910 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
26920 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
26930 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73  fs,        /* Us
26940 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75  ed to get maximu
26950 6d 20 70 61 74 68 20 6c 65 6e 67 74 68 20 61 6e  m path length an
26960 64 20 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 63  d AppData */.  c
26970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
26980 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
26990 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55 54   of the file (UT
269a0 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
269b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20  3_file *id,     
269c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
269d0 20 53 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e   SQLite file han
269e0 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
269f0 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
26a00 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
26a10 6d 6f 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20  mode flags */.  
26a20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
26a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
26a40 74 75 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73  tus return flags
26a50 20 2a 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20   */.){.  HANDLE 
26a60 68 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  h;.  DWORD lastE
26a70 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52  rrno = 0;.  DWOR
26a80 44 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73  D dwDesiredAcces
26a90 73 3b 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61  s;.  DWORD dwSha
26aa0 72 65 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20  reMode;.  DWORD 
26ab0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
26ac0 69 74 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64  ition;.  DWORD d
26ad0 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
26ae0 74 65 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c  tes = 0;.#if SQL
26af0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
26b00 6e 74 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23  nt isTemp = 0;.#
26b10 65 6e 64 69 66 0a 20 20 77 69 6e 56 66 73 41 70  endif.  winVfsAp
26b20 70 44 61 74 61 20 2a 70 41 70 70 44 61 74 61 3b  pData *pAppData;
26b30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
26b40 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
26b50 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
26b60 72 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  rted;           
26b70 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69     /* Filename i
26b80 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  n OS encoding */
26b90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26ba0 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65  Utf8Name = zName
26bb0 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e  ; /* Filename in
26bc0 20 55 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20   UTF-8 encoding 
26bd0 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
26be0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
26bf0 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
26c00 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
26c10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
26c20 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
26c30 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
26c40 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
26c50 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
26c60 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
26c70 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54  .  */.  char *zT
26c80 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46  mpname = 0; /* F
26c90 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
26ca0 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73  ename, if necess
26cb0 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72  ary. */..  int r
26cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
26cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
26ce0 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64  ction Return Cod
26cf0 65 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  e */.#if !define
26d00 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c  d(NDEBUG) || SQL
26d10 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69  ITE_OS_WINCE.  i
26d20 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
26d30 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
26d40 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
26d50 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a   open */.#endif.
26d60 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69  .  int isExclusi
26d70 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  ve  = (flags & S
26d80 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
26d90 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44  SIVE);.  int isD
26da0 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61  elete     = (fla
26db0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
26dc0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b  _DELETEONCLOSE);
26dd0 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20  .  int isCreate 
26de0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
26df0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
26e00 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  E);.  int isRead
26e10 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20  only   = (flags 
26e20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
26e30 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  ADONLY);.  int i
26e40 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66  sReadWrite  = (f
26e50 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
26e60 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a  EN_READWRITE);..
26e70 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
26e80 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e   int isOpenJourn
26e90 61 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20 26  al = (isCreate &
26ea0 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70  & (.        eTyp
26eb0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
26ec0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20  ASTER_JOURNAL.  
26ed0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
26ee0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
26ef0 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54  URNAL.     || eT
26f00 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26f10 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69  _WAL.  ));.#endi
26f20 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  f..  OSTRACE(("O
26f30 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69  PEN name=%s, pFi
26f40 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
26f50 20 70 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22   pOutFlags=%p\n"
26f60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 55 74  ,.           zUt
26f70 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67  f8Name, id, flag
26f80 73 2c 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a  s, pOutFlags));.
26f90 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
26fa0 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
26fb0 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20  ents are true:. 
26fc0 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45   **.  **   (a) E
26fd0 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68  xactly one of th
26fe0 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20  e READWRITE and 
26ff0 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d  READONLY flags m
27000 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  ust be set, and.
27010 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
27020 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
27030 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
27040 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
27050 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
27060 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
27070 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
27080 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
27090 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
270a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
270b0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
270c0 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
270d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
270e0 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
270f0 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
27100 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
27110 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
27120 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
27130 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
27140 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
27150 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
27160 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
27170 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
27180 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
27190 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
271a0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
271b0 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
271c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
271d0 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75  re never.  ** au
271e0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
271f0 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
27200 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
27210 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
27220 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
27230 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
27240 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27250 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
27260 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
27270 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
27280 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
27290 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
272a0 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
272b0 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
272c0 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
272d0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
272e0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
272f0 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
27300 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
27310 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
27320 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
27330 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
27340 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
27350 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
27360 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
27370 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
27380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
27390 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
273a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
273b0 45 4d 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c  EMP_DB.       ||
273c0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
273d0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
273e0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
273f0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
27400 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  NAL.       || eT
27410 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
27420 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
27430 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
27440 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
27450 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  AL.       || eTy
27460 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
27470 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
27480 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27490 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61  EN_WAL.  );..  a
274a0 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
274b0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  );.  memset(pFil
274c0 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  e, 0, sizeof(win
274d0 46 69 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d  File));.  pFile-
274e0 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e  >h = INVALID_HAN
274f0 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20  DLE_VALUE;..#if 
27500 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
27510 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65    if( !zUtf8Name
27520 20 26 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d   && !sqlite3_tem
27530 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20  p_directory ){. 
27540 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
27550 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20  QLITE_ERROR,.   
27560 20 20 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65       "sqlite3_te
27570 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72  mp_directory var
27580 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20  iable should be 
27590 73 65 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b  set for WinRT");
275a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
275b0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
275c0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
275d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
275e0 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20  L, generate a.  
275f0 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  ** temporary fil
27600 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20  e name to use.  
27610 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  */.  if( !zUtf8N
27620 61 6d 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ame ){.    asser
27630 74 28 20 69 73 44 65 6c 65 74 65 20 26 26 20 21  t( isDelete && !
27640 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b  isOpenJournal );
27650 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74  .    rc = winGet
27660 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26  Tempname(pVfs, &
27670 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69  zTmpname);.    i
27680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27690 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
276a0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
276b0 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e  , rc=%s", zUtf8N
276c0 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
276d0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
276e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
276f0 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20  }.    zUtf8Name 
27700 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a  = zTmpname;.  }.
27710 0a 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66  .  /* Database f
27720 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
27730 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
27740 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
27750 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69  not.  ** URIs wi
27760 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20  th parameters.  
27770 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20  Hence, they can 
27780 61 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64  always be passed
27790 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74   into.  ** sqlit
277a0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
277b0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
277c0 74 28 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54  t( (eType!=SQLIT
277d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20  E_OPEN_MAIN_DB) 
277e0 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
277f0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a  TE_OPEN_URI) ||.
27800 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65         zUtf8Name
27810 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
27820 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d  (zUtf8Name)+1]==
27830 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  0 );..  /* Conve
27840 72 74 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rt the filename 
27850 74 6f 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e  to the system en
27860 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f  coding. */.  zCo
27870 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
27880 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
27890 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b  name(zUtf8Name);
278a0 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
278b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  d==0 ){.    sqli
278c0 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
278d0 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
278e0 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
278f0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
27900 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d  NOMEM", zUtf8Nam
27910 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
27920 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27930 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  EM_BKPT;.  }..  
27940 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f  if( winIsDir(zCo
27950 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
27960 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
27970 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71  nverted);.    sq
27980 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e  lite3_free(zTmpn
27990 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ame);.    OSTRAC
279a0 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73  E(("OPEN name=%s
279b0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54  , rc=SQLITE_CANT
279c0 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74  OPEN_ISDIR", zUt
279d0 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  f8Name));.    re
279e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
279f0 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a  OPEN_ISDIR;.  }.
27a00 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
27a10 74 65 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69  te ){.    dwDesi
27a20 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
27a30 52 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52  RIC_READ | GENER
27a40 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73  IC_WRITE;.  }els
27a50 65 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65 64  e{.    dwDesired
27a60 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43  Access = GENERIC
27a70 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _READ;.  }..  /*
27a80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
27a90 4c 55 53 49 56 45 20 69 73 20 75 73 65 64 20 74  LUSIVE is used t
27aa0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
27ab0 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20   a new file is. 
27ac0 20 2a 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c   ** created. SQL
27ad0 69 74 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20  ite doesn't use 
27ae0 69 74 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22  it to indicate "
27af0 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73  exclusive access
27b00 22 0a 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20  ".  ** as it is 
27b10 75 73 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f  usually understo
27b20 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69  od..  */.  if( i
27b30 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
27b40 20 20 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e    /* Creates a n
27b50 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66  ew file, only if
27b60 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72   it does not alr
27b70 65 61 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20  eady exist. */. 
27b80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
27b90 65 20 65 78 69 73 74 73 2c 20 69 74 20 66 61 69  e exists, it fai
27ba0 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ls. */.    dwCre
27bb0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
27bc0 20 3d 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20   = CREATE_NEW;. 
27bd0 20 7d 65 6c 73 65 20 69 66 28 20 69 73 43 72 65   }else if( isCre
27be0 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  ate ){.    /* Op
27bf0 65 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  en existing file
27c00 2c 20 6f 72 20 63 72 65 61 74 65 20 69 66 20 69  , or create if i
27c10 74 20 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20  t doesn't exist 
27c20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
27c30 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
27c40 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65  PEN_ALWAYS;.  }e
27c50 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  lse{.    /* Open
27c60 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69  s a file, only i
27c70 66 20 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  f it exists. */.
27c80 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
27c90 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e  sposition = OPEN
27ca0 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a  _EXISTING;.  }..
27cb0 20 20 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20    dwShareMode = 
27cc0 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20  FILE_SHARE_READ 
27cd0 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49  | FILE_SHARE_WRI
27ce0 54 45 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c  TE;..  if( isDel
27cf0 65 74 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54  ete ){.#if SQLIT
27d00 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64  E_OS_WINCE.    d
27d10 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
27d20 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49  tes = FILE_ATTRI
27d30 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20  BUTE_HIDDEN;.   
27d40 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c   isTemp = 1;.#el
27d50 73 65 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  se.    dwFlagsAn
27d60 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
27d70 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d  LE_ATTRIBUTE_TEM
27d80 50 4f 52 41 52 59 0a 20 20 20 20 20 20 20 20 20  PORARY.         
27d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27da0 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54        | FILE_ATT
27db0 52 49 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20  RIBUTE_HIDDEN.  
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
27de0 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
27df0 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66  ON_CLOSE;.#endif
27e00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
27e10 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
27e20 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
27e30 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a  UTE_NORMAL;.  }.
27e40 20 20 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f    /* Reports fro
27e50 6d 20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61  m the internet a
27e60 72 65 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61  re that performa
27e70 6e 63 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20  nce is always.  
27e80 2a 2a 20 62 65 74 74 65 72 20 69 66 20 46 49 4c  ** better if FIL
27e90 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43  E_FLAG_RANDOM_AC
27ea0 43 45 53 53 20 69 73 20 75 73 65 64 2e 20 20 54  CESS is used.  T
27eb0 69 63 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a  icket #2699. */.
27ec0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
27ed0 4e 43 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64  NCE.  dwFlagsAnd
27ee0 41 74 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49  Attributes |= FI
27ef0 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
27f00 43 43 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20  CCESS;.#endif.. 
27f10 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
27f20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
27f30 49 4e 52 54 0a 20 20 20 20 43 52 45 41 54 45 46  INRT.    CREATEF
27f40 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41  ILE2_EXTENDED_PA
27f50 52 41 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65  RAMETERS extende
27f60 64 50 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20  dParameters;.   
27f70 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
27f80 65 72 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a  ers.dwSize = siz
27f90 65 6f 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f  eof(CREATEFILE2_
27fa0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
27fb0 45 52 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64  ERS);.    extend
27fc0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
27fd0 69 6c 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a  ileAttributes =.
27fe0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
27ff0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
28000 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   & FILE_ATTRIBUT
28010 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65  E_MASK;.    exte
28020 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
28030 77 46 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46  wFileFlags = dwF
28040 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
28050 73 20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41  s & FILE_FLAG_MA
28060 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  SK;.    extended
28070 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63  Parameters.dwSec
28080 75 72 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20  urityQosFlags = 
28090 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f  SECURITY_ANONYMO
280a0 55 53 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  US;.    extended
280b0 50 61 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63  Parameters.lpSec
280c0 75 72 69 74 79 41 74 74 72 69 62 75 74 65 73 20  urityAttributes 
280d0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65  = NULL;.    exte
280e0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68  ndedParameters.h
280f0 54 65 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e  TemplateFile = N
28100 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ULL;.    while( 
28110 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  (h = osCreateFil
28120 65 32 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  e2((LPCWSTR)zCon
28130 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
28140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28150 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
28160 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28180 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
28190 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
281c0 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ition,.         
281d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281e0 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50 61       &extendedPa
281f0 72 61 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41  rameters))==INVA
28200 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
28210 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20   &&.            
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28230 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28    winRetryIoerr(
28240 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
28250 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
28260 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20      /* Noop */. 
28270 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77     }.#else.    w
28280 68 69 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65  hile( (h = osCre
28290 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54  ateFileW((LPCWST
282a0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
282b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282c0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65              dwDe
282d0 73 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20  siredAccess,.   
282e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
282f0 20 20 20 20 20 20 20 20 20 20 20 64 77 53 68 61             dwSha
28300 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20  reMode, NULL,.  
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28320 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
28330 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
28340 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28360 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
28370 62 75 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20  butes,.         
28380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28390 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56       NULL))==INV
283a0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
283b0 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  E &&.           
283c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283d0 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72     winRetryIoerr
283e0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
283f0 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  o) ){.          
28400 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a       /* Noop */.
28410 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
28420 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
28430 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
28440 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
28450 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
28460 6c 65 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e  leA((LPCSTR)zCon
28470 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
28480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28490 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41        dwDesiredA
284a0 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20  ccess,.         
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65       dwShareMode
284d0 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e        dwCreation
28500 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20  Disposition,.   
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
28530 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
28540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
28560 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ULL))==INVALID_H
28570 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
285a0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
285b0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
285d0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
285e0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e    }.#endif.  win
285f0 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f  LogIoerr(cnt, __
28600 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52  LINE__);..  OSTR
28610 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
28620 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
28630 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e  ess=%lx, rc=%s\n
28640 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c  ", h, zUtf8Name,
28650 0a 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65  .           dwDe
28660 73 69 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d  siredAccess, (h=
28670 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
28680 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
28690 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69  " : "ok"));..  i
286a0 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
286b0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
286c0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
286d0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
286e0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
286f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
28700 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
28710 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55  o, "winOpen", zU
28720 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71  tf8Name);.    sq
28730 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28740 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
28750 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
28760 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65  e);.    if( isRe
28770 61 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78  adWrite && !isEx
28780 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20  clusive ){.     
28790 20 72 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28   return winOpen(
287a0 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c  pVfs, zName, id,
287b0 0a 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67  .         ((flag
287c0 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  s|SQLITE_OPEN_RE
287d0 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20  ADONLY) &.      
287e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7e                 ~
287f0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
28800 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
28810 52 45 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20  READWRITE)),.   
28820 20 20 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29        pOutFlags)
28830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
28840 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28850 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
28860 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
28870 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
28880 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
28890 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  e ){.      *pOut
288a0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
288b0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20  PEN_READWRITE;. 
288c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
288d0 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c  *pOutFlags = SQL
288e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
288f0 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  Y;.    }.  }..  
28900 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66  OSTRACE(("OPEN f
28910 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c  ile=%p, name=%s,
28920 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75   access=%lx, pOu
28930 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74  tFlags=%p, *pOut
28940 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20  Flags=%d, ".    
28950 20 20 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22         "rc=%s\n"
28960 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  , h, zUtf8Name, 
28970 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c  dwDesiredAccess,
28980 20 70 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74   pOutFlags, pOut
28990 46 6c 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20  Flags ?.        
289a0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20     *pOutFlags : 
289b0 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  0, (h==INVALID_H
289c0 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
289d0 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
289e0 3b 0a 0a 20 20 70 41 70 70 44 61 74 61 20 3d 20  ;..  pAppData = 
289f0 28 77 69 6e 56 66 73 41 70 70 44 61 74 61 2a 29  (winVfsAppData*)
28a00 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a  pVfs->pAppData;.
28a10 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28a20 49 4e 43 45 0a 20 20 7b 0a 20 20 20 20 69 66 28  INCE.  {.    if(
28a30 20 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20   isReadWrite && 
28a40 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
28a50 45 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20  EN_MAIN_DB.     
28a60 20 20 20 20 26 26 20 28 28 70 41 70 70 44 61 74      && ((pAppDat
28a70 61 3d 3d 4e 55 4c 4c 29 20 7c 7c 20 21 70 41 70  a==NULL) || !pAp
28a80 70 44 61 74 61 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a  pData->bNoLock).
28a90 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20           && (rc 
28aa0 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  = winceCreateLoc
28ab0 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29  k(zName, pFile))
28ac0 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20  !=SQLITE_OK.    
28ad0 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65  ){.      osClose
28ae0 48 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 20  Handle(h);.     
28af0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28b00 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
28b10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28b20 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f  mpname);.      O
28b30 53 54 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45  STRACE(("OPEN-CE
28b40 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72  -LOCK name=%s, r
28b50 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20  c=%s\n", zName, 
28b60 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
28b70 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
28b80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
28b90 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b  .  if( isTemp ){
28ba0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c  .    pFile->zDel
28bb0 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f  eteOnClose = zCo
28bc0 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65  nverted;.  }else
28bd0 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20  .#endif.  {.    
28be0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
28bf0 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  nverted);.  }.. 
28c00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
28c10 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  mpname);.  pFile
28c20 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 41 70 70  ->pMethod = pApp
28c30 44 61 74 61 20 3f 20 70 41 70 70 44 61 74 61 2d  Data ? pAppData-
28c40 3e 70 4d 65 74 68 6f 64 20 3a 20 26 77 69 6e 49  >pMethod : &winI
28c50 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65  oMethod;.  pFile
28c60 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20  ->pVfs = pVfs;. 
28c70 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20   pFile->h = h;. 
28c80 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
28c90 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
28ca0 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
28cb0 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20  LE_RDONLY;.  }. 
28cc0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
28cd0 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20  _boolean(zName, 
28ce0 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50  "psow", SQLITE_P
28cf0 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
28d00 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  TE) ){.    pFile
28d10 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57  ->ctrlFlags |= W
28d20 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d  INFILE_PSOW;.  }
28d30 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
28d40 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  rno = NO_ERROR;.
28d50 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
28d60 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49   zName;.#if SQLI
28d70 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
28d80 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70  >0.  pFile->hMap
28d90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65   = NULL;.  pFile
28da0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30  ->pMapRegion = 0
28db0 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
28dc0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ize = 0;.  pFile
28dd0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
28de0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
28df0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c  mapSizeMax = sql
28e00 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
28e10 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a  .szMmap;.#endif.
28e20 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
28e30 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  1);.  return rc;
28e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
28e50 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
28e60 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
28e70 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f   Windows does no
28e80 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74  t allow a file t
28e90 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20  o be deleted if 
28ea0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
28eb0 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65  ocess has it ope
28ec0 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20  n.  Sometimes a 
28ed0 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72  virus scanner or
28ee0 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61   indexing progra
28ef0 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61  m.** will open a
28f00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68   journal file sh
28f10 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69  ortly after it i
28f20 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64  s created in ord
28f30 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74  er to do.** what
28f40 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57  ever it does.  W
28f50 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20  hile this other 
28f60 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
28f70 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f  ng the.** file o
28f80 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20  pen, we will be 
28f90 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  unable to delete
28fa0 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72   it.  To work ar
28fb0 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f  ound this.** pro
28fc0 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31  blem, we delay 1
28fd0 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  00 milliseconds 
28fe0 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74  and try to delet
28ff0 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20  e again.  Up.** 
29000 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41  to MX_DELETION_A
29010 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e  TTEMPTs deletion
29020 20 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75   attempts are ru
29030 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a  n before giving.
29040 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  ** up and return
29050 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f  ing an error..*/
29060 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
29070 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
29080 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
29090 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
290a0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
290b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
290c0 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61  name,      /* Na
290d0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65  me of file to de
290e0 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79  lete */.  int sy
290f0 6e 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20  ncDir           
29100 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65        /* Not use
29110 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b  d on win32 */.){
29120 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
29130 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52    int rc;.  DWOR
29140 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20  D attr;.  DWORD 
29150 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
29160 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
29170 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
29180 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55  METER(pVfs);.  U
29190 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
291a0 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d  syncDir);..  Sim
291b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
291c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
291d0 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52  _DELETE);.  OSTR
291e0 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
291f0 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64  e=%s, syncDir=%d
29200 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
29210 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43  syncDir));..  zC
29220 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
29230 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
29240 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  ename(zFilename)
29250 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74  ;.  if( zConvert
29260 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ed==0 ){.    OST
29270 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61  RACE(("DELETE na
29280 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
29290 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c  _IOERR_NOMEM\n",
292a0 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
292b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
292c0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
292d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
292e0 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b  NT() ){.    do {
292f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
29300 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32  INRT.      WIN32
29310 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f  _FILE_ATTRIBUTE_
29320 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a  DATA sAttrData;.
29330 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41        memset(&sA
29340 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
29350 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
29360 20 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74        if ( osGet
29370 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
29380 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65  W(zConverted, Ge
29390 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
293a0 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
293b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293c0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
293d0 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  a) ){.        at
293e0 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
293f0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
29400 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29410 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
29420 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
29430 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
29440 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
29450 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
29460 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
29470 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
29480 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
29490 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
294a0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
294b0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
294c0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
294d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
294e0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
294f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
29500 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
29510 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
29520 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
29530 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
29540 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  W(zConverted);.#
29550 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28  endif.      if (
29560 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46   attr==INVALID_F
29570 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
29580 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72  {.        lastEr
29590 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
295a0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
295b0 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  if( lastErrno==E
295c0 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f  RROR_FILE_NOT_FO
295d0 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  UND.         || 
295e0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
295f0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
29600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
29610 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  = SQLITE_IOERR_D
29620 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20  ELETE_NOENT; /* 
29630 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f  Already gone? */
29640 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29650 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
29660 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
29670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
29680 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29690 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49      if ( attr&FI
296a0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52  LE_ATTRIBUTE_DIR
296b0 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  ECTORY ){.      
296c0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
296d0 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e  ROR; /* Files on
296e0 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  ly. */.        b
296f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
29700 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74      if ( osDelet
29710 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65  eFileW(zConverte
29720 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  d) ){.        rc
29730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a   = SQLITE_OK; /*
29740 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a   Deleted OK. */.
29750 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
29760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
29770 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72  ( !winRetryIoerr
29780 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
29790 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  o) ){.        rc
297a0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
297b0 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72   /* No more retr
297c0 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ies. */.        
297d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
297e0 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20     } while(1);. 
297f0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29800 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
29810 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b    else{.    do {
29820 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73  .      attr = os
29830 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
29840 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  sA(zConverted);.
29850 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
29860 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
29870 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
29880 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
29890 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
298a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
298b0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
298c0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
298d0 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
298e0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
298f0 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
29900 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
29910 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
29920 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
29930 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
29940 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29950 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
29960 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
29970 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
29980 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29990 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
299a0 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
299b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
299c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
299d0 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
299e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
299f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
29a00 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41   ( osDeleteFileA
29a10 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
29a20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29a30 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
29a40 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
29a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
29a60 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e  .      if ( !win
29a70 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
29a80 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
29a90 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
29aa0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
29ab0 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
29ac0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
29ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
29ae0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e  hile(1);.  }.#en
29af0 64 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20  dif.  if( rc && 
29b00 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
29b10 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b  _DELETE_NOENT ){
29b20 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
29b30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
29b40 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45  RR_DELETE, lastE
29b50 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65  rrno, "winDelete
29b60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
29b70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c   }else{.    winL
29b80 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c  ogIoerr(cnt, __L
29b90 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71  INE__);.  }.  sq
29ba0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
29bb0 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43  erted);.  OSTRAC
29bc0 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
29bd0 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46  %s, rc=%s\n", zF
29be0 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33  ilename, sqlite3
29bf0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
29c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29c10 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65  *.** Check the e
29c20 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61  xistence and sta
29c30 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a  tus of a file..*
29c40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
29c50 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
29c60 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
29c70 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
29c80 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
29c90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
29ca0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
29cb0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
29cc0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
29cd0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
29ce0 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
29cf0 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
29d00 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
29d10 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
29d20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
29d30 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44  Result */.){.  D
29d40 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74  WORD attr;.  int
29d50 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44   rc = 0;.  DWORD
29d60 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
29d70 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
29d80 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  ed;.  UNUSED_PAR
29d90 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20  AMETER(pVfs);.. 
29da0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
29db0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
29dc0 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b  IOERR_ACCESS; );
29dd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
29de0 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61  ESS name=%s, fla
29df0 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25  gs=%x, pResOut=%
29e00 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
29e10 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67   zFilename, flag
29e20 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20  s, pResOut));.. 
29e30 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
29e40 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
29e50 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61  Filename(zFilena
29e60 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76  me);.  if( zConv
29e70 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  erted==0 ){.    
29e80 4f 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53  OSTRACE(("ACCESS
29e90 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c   name=%s, rc=SQL
29ea0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
29eb0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b  n", zFilename));
29ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
29ed0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
29ee0 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
29ef0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
29f00 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
29f10 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
29f20 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
29f30 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
29f40 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
29f50 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
29f60 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
29f70 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
29f80 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
29f90 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
29fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
29fc0 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
29fd0 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
29fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ff0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
2a000 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
2a010 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
2a020 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63  ) ){}.    if( rc
2a030 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72   ){.      /* For
2a040 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53   an SQLITE_ACCES
2a050 53 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20  S_EXISTS query, 
2a060 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e  treat a zero-len
2a070 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  gth file.      *
2a080 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20  * as if it does 
2a090 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20  not exist..     
2a0a0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20   */.      if(   
2a0b0 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41   flags==SQLITE_A
2a0c0 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20  CCESS_EXISTS.   
2a0d0 20 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44         && sAttrD
2a0e0 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67  ata.nFileSizeHig
2a0f0 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26  h==0.          &
2a100 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c  & sAttrData.nFil
2a110 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20  eSizeLow==0 ){. 
2a120 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e         attr = IN
2a130 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
2a140 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c  BUTES;.      }el
2a150 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
2a160 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46   = sAttrData.dwF
2a170 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20  ileAttributes;. 
2a180 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2a190 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f  {.      winLogIo
2a1a0 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
2a1b0 5f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61  _);.      if( la
2a1c0 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46  stErrno!=ERROR_F
2a1d0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26  ILE_NOT_FOUND &&
2a1e0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
2a1f0 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
2a200 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a210 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2a220 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ted);.        re
2a230 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2a240 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43  (SQLITE_IOERR_AC
2a250 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c  CESS, lastErrno,
2a260 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20   "winAccess",.  
2a270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a280 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
2a290 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
2a2a0 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
2a2b0 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
2a2c0 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
2a2d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64  }.    }.  }.#ifd
2a2e0 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2a2f0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
2a300 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65  .    attr = osGe
2a310 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
2a320 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74  ((char*)zConvert
2a330 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
2a340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a350 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77  Converted);.  sw
2a360 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20  itch( flags ){. 
2a370 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
2a380 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
2a390 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2a3a0 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20  SS_EXISTS:.     
2a3b0 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
2a3c0 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
2a3d0 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  TES;.      break
2a3e0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
2a3f0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
2a400 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61  TE:.      rc = a
2a410 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
2a420 45 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a  E_ATTRIBUTES &&.
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74               (at
2a440 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42  tr & FILE_ATTRIB
2a450 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30  UTE_READONLY)==0
2a460 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2a470 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
2a480 20 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c    assert(!"Inval
2a490 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  id flags argumen
2a4a0 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  t");.  }.  *pRes
2a4b0 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52  Out = rc;.  OSTR
2a4c0 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
2a4d0 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%s, pResOut=%p
2a4e0 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
2a4f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
2a500 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
2a510 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a  name, pResOut, *
2a520 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
2a530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2a540 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
2a550 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2a560 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
2a570 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
2a580 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a  a drive letter.*
2a590 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20  * followed by a 
2a5a0 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e  colon character.
2a5b0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2a5c0 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
2a5d0 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73  AndColon(.  cons
2a5e0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
2a5f0 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20  e.){.  return ( 
2a600 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a  sqlite3Isalpha(z
2a610 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20  Pathname[0]) && 
2a620 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a  zPathname[1]==':
2a630 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ' );.}../*.** Re
2a640 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
2a650 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
2a660 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
2a670 20 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69   be used verbati
2a680 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65  m.  If.** non-ze
2a690 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66  ro is returned f
2a6a0 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f  rom this functio
2a6b0 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  n, the calling f
2a6c0 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d  unction must sim
2a6d0 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70  ply.** use the p
2a6e0 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d  rovided path nam
2a6f0 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20  e verbatim -OR- 
2a700 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20  resolve it into 
2a710 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65  a full path name
2a720 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65  .** using the Ge
2a730 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69  tFullPathName Wi
2a740 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  n32 API function
2a750 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e   (if available).
2a760 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
2a770 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74  winIsVerbatimPat
2a780 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  hname(.  const c
2a790 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29  har *zPathname.)
2a7a0 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  {.  /*.  ** If t
2a7b0 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
2a7c0 72 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61  rts with a forwa
2a7d0 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61  rd slash or a ba
2a7e0 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65  ckslash, it is e
2a7f0 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67  ither.  ** a leg
2a800 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76  al UNC name, a v
2a810 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70  olume relative p
2a820 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c  ath, or an absol
2a830 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e  ute path name in
2a840 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22   the.  ** "Unix"
2a850 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f   format on Windo
2a860 77 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  ws.  There is no
2a870 20 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66   easy way to dif
2a880 66 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65  ferentiate betwe
2a890 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61  en.  ** the fina
2a8a0 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65  l two cases; the
2a8b0 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72  refore, we retur
2a8c0 6e 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75  n the safer retu
2a8d0 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45  rn value of TRUE
2a8e0 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61  .  ** so that ca
2a8f0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
2a900 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70  nction will simp
2a910 6c 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74  ly use it verbat
2a920 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  im..  */.  if ( 
2a930 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74  winIsDirSep(zPat
2a940 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  hname[0]) ){.   
2a950 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20   return TRUE;.  
2a960 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  }..  /*.  ** If 
2a970 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74  the path name st
2a980 61 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74  arts with a lett
2a990 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69  er and a colon i
2a9a0 74 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f  t is either a vo
2a9b0 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69  lume.  ** relati
2a9c0 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62  ve path or an ab
2a9d0 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61  solute path.  Ca
2a9e0 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75  llers of this fu
2a9f0 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a  nction must not.
2aa00 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    ** attempt to 
2aa10 74 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65  treat it as a re
2aa20 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
2aa30 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75   (i.e. they shou
2aa40 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20  ld simply use.  
2aa50 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e  ** it verbatim).
2aa60 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e  .  */.  if ( win
2aa70 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64  IsDriveLetterAnd
2aa80 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29  Colon(zPathname)
2aa90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2aaa0 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
2aab0 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f   ** If we get to
2aac0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
2aad0 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c   path name shoul
2aae0 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e  d almost certain
2aaf0 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20  ly be a purely. 
2ab00 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65   ** relative one
2ab10 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43   (i.e. not a UNC
2ab20 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c   name, not absol
2ab30 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c  ute, and not vol
2ab40 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20  ume relative).. 
2ab50 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c   */.  return FAL
2ab60 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  SE;.}../*.** Tur
2ab70 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
2ab80 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
2ab90 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69  l pathname.  Wri
2aba0 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70  te the full.** p
2abb0 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75  athname into zOu
2abc0 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c  t[].  zOut[] wil
2abd0 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56  l be at least pV
2abe0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a  fs->mxPathname.*
2abf0 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  * bytes in size.
2ac00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2ac10 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a  inFullPathname(.
2ac20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2ac30 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Vfs,            
2ac40 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2ac50 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f  s object */.  co
2ac60 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
2ac70 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  ive,        /* P
2ac80 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
2ac90 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
2aca0 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2acc0 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74  * Size of output
2acd0 20 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73   buffer in bytes
2ace0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c   */.  char *zFul
2acf0 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
2ad00 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
2ad10 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  ffer */.){.#if !
2ad20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2ad30 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
2ad40 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
2ad50 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57  __CYGWIN__).  DW
2ad60 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  ORD nByte;.  voi
2ad70 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
2ad80 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e   char *zOut;.#en
2ad90 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  dif..  /* If thi
2ada0 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69  s path name begi
2adb0 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77  ns with "/X:", w
2adc0 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20  here "X" is any 
2add0 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20  alphabetic.  ** 
2ade0 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61  character, disca
2adf0 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22  rd the initial "
2ae00 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68  /" from the path
2ae10 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  name..  */.  if(
2ae20 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27   zRelative[0]=='
2ae30 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65  /' && winIsDrive
2ae40 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
2ae50 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20  Relative+1) ){. 
2ae60 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a     zRelative++;.
2ae70 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
2ae80 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53  (__CYGWIN__).  S
2ae90 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
2aea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2aeb0 52 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ROR );.  UNUSED_
2aec0 50 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29  PARAMETER(nFull)
2aed0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c  ;.  assert( nFul
2aee0 6c 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l>=pVfs->mxPathn
2aef0 61 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71  ame );.  if ( sq
2af00 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2af10 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65  tory && !winIsVe
2af20 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a  rbatimPathname(z
2af30 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20  Relative) ){.   
2af40 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a   /*.    ** NOTE:
2af50 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   We are dealing 
2af60 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20  with a relative 
2af70 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68  path name and th
2af80 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20  e data.    **   
2af90 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61      directory ha
2afa0 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65  s been set.  The
2afb0 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61  refore, use it a
2afc0 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20  s the basis.    
2afd0 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e  **       for con
2afe0 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61  verting the rela
2aff0 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74  tive path name t
2b000 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20  o an absolute.  
2b010 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62    **       one b
2b020 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65  y prepending the
2b030 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
2b040 61 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20  and a slash..   
2b050 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   */.    char *zO
2b060 75 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ut = sqlite3Mall
2b070 6f 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78  ocZero( pVfs->mx
2b080 50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20  Pathname+1 );.  
2b090 20 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20    if( !zOut ){. 
2b0a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2b0b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2b0c0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
2b0d0 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
2b0e0 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
2b0f0 20 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50   (osIsNT() ? CCP
2b100 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20  _POSIX_TO_WIN_W 
2b110 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  : CCP_POSIX_TO_W
2b120 49 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20  IN_A) |.        
2b130 20 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45      CCP_RELATIVE
2b140 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75  , zRelative, zOu
2b150 74 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  t, pVfs->mxPathn
2b160 61 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  ame+1)<0 ){.    
2b170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b180 4f 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Out);.      retu
2b190 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
2b1a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43  QLITE_CANTOPEN_C
2b1b0 4f 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29  ONVPATH, (DWORD)
2b1c0 65 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  errno,.         
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
2b1f0 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
2b200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b210 20 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77   char *zUtf8 = w
2b220 69 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46  inConvertToUtf8F
2b230 69 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20  ilename(zOut);. 
2b240 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
2b250 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b260 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2b270 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2b280 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2b290 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
2b2a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2b2b0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2b2c0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2b2d0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
2b2e0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2b2f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2b300 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
2b310 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
2b320 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
2b330 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b340 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
2b350 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2b360 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2b370 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
2b380 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
2b390 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
2b3a0 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
2b3b0 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
2b3c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2b3d0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2b3e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2b3f0 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
2b400 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
2b410 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
2b420 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
2b430 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
2b440 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ),.            z
2b450 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20  Relative, zOut, 
2b460 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2b470 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  +1)<0 ){.      s
2b480 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2b490 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2b4a0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2b4b0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56  TE_CANTOPEN_CONV
2b4c0 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72  PATH, (DWORD)err
2b4d0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2b4f0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
2b500 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2b510 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2b520 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43  ar *zUtf8 = winC
2b530 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
2b540 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  name(zOut);.    
2b550 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a    if( !zUtf8 ){.
2b560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2b570 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
2b580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2b590 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2b5a0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
2b5b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2b5c0 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56  tf(MIN(nFull, pV
2b5d0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c  fs->mxPathname),
2b5e0 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55   zFull, "%s", zU
2b5f0 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2b600 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
2b610 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2b620 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
2b630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2b640 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
2b650 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f  .#if (SQLITE_OS_
2b660 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
2b670 4f 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65  OS_WINRT) && !de
2b680 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2b690 29 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ).  SimulateIOEr
2b6a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2b6b0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a  TE_ERROR );.  /*
2b6c0 20 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f   WinCE has no co
2b6d0 6e 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74  ncept of a relat
2b6e0 69 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72  ive pathname, or
2b6f0 20 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a   so I am told. *
2b700 2f 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73  /.  /* WinRT has
2b710 20 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65   no way to conve
2b720 72 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  rt a relative pa
2b730 74 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  th to an absolut
2b740 65 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28  e one. */.  if (
2b750 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
2b760 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
2b770 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2b780 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
2b790 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
2b7a0 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
2b7b0 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
2b7c0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
2b7d0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
2b7e0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2b7f0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
2b800 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
2b810 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
2b820 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
2b830 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
2b840 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2b850 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
2b860 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
2b870 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
2b880 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2b890 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
2b8a0 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
2b8b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b8c0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2b8d0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2b8e0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b900 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2b910 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2b920 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
2b930 61 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  ative);.  }else{
2b940 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2b950 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2b960 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2b970 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c  e), zFull, "%s",
2b980 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d   zRelative);.  }
2b990 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b9a0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
2b9b0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
2b9c0 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
2b9d0 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65  WINRT && !define
2b9e0 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2b9f0 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
2ba00 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
2ba10 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
2ba20 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
2ba30 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
2ba40 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
2ba50 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
2ba60 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
2ba70 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
2ba80 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
2ba90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
2baa0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
2bab0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
2bac0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
2bad0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
2bae0 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
2baf0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
2bb00 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
2bb10 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
2bb20 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
2bb30 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
2bb40 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
2bb50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
2bb60 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
2bb70 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
2bb80 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2bb90 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2bba0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
2bbb0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
2bbc0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
2bbd0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
2bbe0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
2bbf0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
2bc00 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
2bc10 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
2bc20 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
2bc30 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
2bc40 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
2bc50 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
2bc60 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
2bc70 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
2bc80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2bc90 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
2bca0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
2bcb0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
2bcc0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
2bcd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bce0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2bcf0 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
2bd00 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2bd10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bd20 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
2bd30 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2bd40 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2bd50 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
2bd60 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
2bd70 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
2bd80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2bd90 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
2bda0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
2bdb0 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
2bdc0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
2bdd0 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
2bde0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2bdf0 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
2be00 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2be10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2be20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2be30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2be40 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2be50 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2be60 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2be70 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be90 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2bea0 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
2beb0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2bec0 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
2bed0 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2bee0 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
2bef0 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
2bf00 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
2bf10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2bf20 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2bf30 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
2bf40 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2bf50 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2bf60 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2bf70 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
2bf80 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2bf90 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
2bfa0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2bfb0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2bfc0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2bfd0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2bfe0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
2bff0 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
2c000 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
2c010 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
2c020 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
2c030 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
2c060 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
2c070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2c080 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2c090 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
2c0a0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
2c0b0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
2c0c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2c0d0 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
2c0e0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2c0f0 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2c100 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
2c110 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
2c120 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
2c130 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
2c140 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2c150 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2c160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c170 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2c180 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2c190 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2c1a0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2c1b0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2c1c0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2c1e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20  FullPathname3", 
2c1f0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2c200 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2c210 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2c220 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2c230 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2c240 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2c250 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2c260 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c270 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2c280 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2c290 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2c2a0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2c2b0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2c2c0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
2c2d0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
2c2e0 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
2c2f0 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2c300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2c310 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2c320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2c330 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2c340 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2c350 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2c360 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2c370 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2c380 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2c390 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2c3a0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
2c3b0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2c3c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2c3d0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2c3e0 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62      zOut = winMb
2c3f0 63 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20  csToUtf8(zTemp, 
2c400 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
2c410 49 28 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  I());.    sqlite
2c420 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2c430 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
2c440 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  zOut ){.    sqli
2c450 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
2c460 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
2c470 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
2c480 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
2c490 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c4a0 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72  zOut);.    retur
2c4b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
2c4c0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
2c4d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2c4e0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65  MEM_BKPT;.  }.#e
2c4f0 6e 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ndif.}..#ifndef 
2c500 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
2c510 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
2c520 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
2c530 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
2c540 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
2c550 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
2c560 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
2c570 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
2c580 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
2c590 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
2c5a0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
2c5b0 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  DlOpen(sqlite3_v
2c5c0 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
2c5d0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
2c5e0 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69  {.  HANDLE h;.#i
2c5f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
2c600 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c  IN__).  int nFul
2c610 6c 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  l = pVfs->mxPath
2c620 6e 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a  name+1;.  char *
2c630 7a 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d  zFull = sqlite3M
2c640 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c  allocZero( nFull
2c650 20 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e   );.  void *zCon
2c660 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66  verted = 0;.  if
2c670 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20  ( zFull==0 ){.  
2c680 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
2c690 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
2c6a0 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
2c6b0 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
2c6c0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2c6d0 20 7d 0a 20 20 69 66 28 20 77 69 6e 46 75 6c 6c   }.  if( winFull
2c6e0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
2c6f0 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c  Filename, nFull,
2c700 20 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f   zFull)!=SQLITE_
2c710 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
2c720 33 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20  3_free(zFull);. 
2c730 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2c740 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2c750 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2c760 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2c770 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2c780 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
2c790 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2c7a0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2c7b0 75 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ull);.  sqlite3_
2c7c0 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c  free(zFull);.#el
2c7d0 73 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  se.  void *zConv
2c7e0 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2c7f0 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2c800 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
2c810 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c820 52 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a  R(pVfs);.#endif.
2c830 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64    if( zConverted
2c840 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ==0 ){.    OSTRA
2c850 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2c860 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2c870 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2c880 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2c890 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
2c8a0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69  ( osIsNT() ){.#i
2c8b0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2c8c0 54 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64  T.    h = osLoad
2c8d0 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28  PackagedLibrary(
2c8e0 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2c8f0 74 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  ted, 0);.#else. 
2c900 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62     h = osLoadLib
2c910 72 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a  raryW((LPCWSTR)z
2c920 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64  Converted);.#end
2c930 69 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  if.  }.#ifdef SQ
2c940 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2c950 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
2c960 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  h = osLoadLibrar
2c970 79 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  yA((char*)zConve
2c980 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
2c990 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  f.  OSTRACE(("DL
2c9a0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61  OPEN name=%s, ha
2c9b0 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c  ndle=%p\n", zFil
2c9c0 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29  ename, (void*)h)
2c9d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2c9e0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2c9f0 20 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68   return (void*)h
2ca00 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
2ca10 77 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74  winDlError(sqlit
2ca20 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2ca30 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2ca40 75 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  ufOut){.  UNUSED
2ca50 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2ca60 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72  ;.  winGetLastEr
2ca70 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74  rorMsg(osGetLast
2ca80 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a  Error(), nBuf, z
2ca90 42 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69  BufOut);.}.stati
2caa0 63 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79  c void (*winDlSy
2cab0 6d 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  m(sqlite3_vfs *p
2cac0 56 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e  Vfs,void *pH,con
2cad0 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
2cae0 76 6f 69 64 29 7b 0a 20 20 46 41 52 50 52 4f 43  void){.  FARPROC
2caf0 20 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f   proc;.  UNUSED_
2cb00 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2cb10 0a 20 20 70 72 6f 63 20 3d 20 6f 73 47 65 74 50  .  proc = osGetP
2cb20 72 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e  rocAddressA((HAN
2cb30 44 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20  DLE)pH, zSym);. 
2cb40 20 4f 53 54 52 41 43 45 28 28 22 44 4c 53 59 4d   OSTRACE(("DLSYM
2cb50 20 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62   handle=%p, symb
2cb60 6f 6c 3d 25 73 2c 20 61 64 64 72 65 73 73 3d 25  ol=%s, address=%
2cb70 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
2cb80 20 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d   (void*)pH, zSym
2cb90 2c 20 28 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b  , (void*)proc));
2cba0 0a 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28  .  return (void(
2cbb0 2a 29 28 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d  *)(void))proc;.}
2cbc0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
2cbd0 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
2cbe0 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
2cbf0 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55  *pHandle){.  UNU
2cc00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2cc10 66 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62  fs);.  osFreeLib
2cc20 72 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61  rary((HANDLE)pHa
2cc30 6e 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41 43 45  ndle);.  OSTRACE
2cc40 28 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c  (("DLCLOSE handl
2cc50 65 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29  e=%p\n", (void*)
2cc60 70 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c  pHandle));.}.#el
2cc70 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f  se /* if SQLITE_
2cc80 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2cc90 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20  ION is defined: 
2cca0 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e  */.  #define win
2ccb0 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
2ccc0 69 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30  ine winDlError 0
2ccd0 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c  .  #define winDl
2cce0 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
2ccf0 65 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23  e winDlClose 0.#
2cd00 65 6e 64 69 66 0a 0a 2f 2a 20 53 74 61 74 65 20  endif../* State 
2cd10 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
2cd20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 67  the randomness g
2cd30 61 74 68 65 72 65 72 2e 20 2a 2f 0a 74 79 70 65  atherer. */.type
2cd40 64 65 66 20 73 74 72 75 63 74 20 45 6e 74 72 6f  def struct Entro
2cd50 70 79 47 61 74 68 65 72 65 72 20 45 6e 74 72 6f  pyGatherer Entro
2cd60 70 79 47 61 74 68 65 72 65 72 3b 0a 73 74 72 75  pyGatherer;.stru
2cd70 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2cd80 65 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  er {.  unsigned 
2cd90 63 68 61 72 20 2a 61 3b 20 20 20 2f 2a 20 47 61  char *a;   /* Ga
2cda0 74 68 65 72 20 65 6e 74 72 6f 70 79 20 69 6e 74  ther entropy int
2cdb0 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
2cdc0 0a 20 20 69 6e 74 20 6e 61 3b 20 20 20 20 20 20  .  int na;      
2cdd0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2cde0 66 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  f a[] in bytes *
2cdf0 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
2ce00 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6e          /* XOR n
2ce10 65 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 61  ext input into a
2ce20 5b 69 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 58 6f  [i] */.  int nXo
2ce30 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
2ce40 4e 75 6d 62 65 72 20 6f 66 20 58 4f 52 20 6f 70  Number of XOR op
2ce50 65 72 61 74 69 6f 6e 73 20 64 6f 6e 65 20 2a 2f  erations done */
2ce60 0a 7d 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  .};..#if !define
2ce70 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
2ce80 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
2ce90 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
2cea0 53 29 0a 2f 2a 20 4d 69 78 20 73 7a 20 62 79 74  S)./* Mix sz byt
2ceb0 65 73 20 6f 66 20 65 6e 74 72 6f 70 79 20 69 6e  es of entropy in
2cec0 74 6f 20 70 2e 20 2a 2f 0a 73 74 61 74 69 63 20  to p. */.static 
2ced0 76 6f 69 64 20 78 6f 72 4d 65 6d 6f 72 79 28 45  void xorMemory(E
2cee0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 2a  ntropyGatherer *
2cef0 70 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  p, unsigned char
2cf00 20 2a 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20   *x, int sz){.  
2cf10 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 66 6f 72 28  int j, k;.  for(
2cf20 6a 3d 30 2c 20 6b 3d 70 2d 3e 69 3b 20 6a 3c 73  j=0, k=p->i; j<s
2cf30 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e  z; j++){.    p->
2cf40 61 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a  a[k++] ^= x[j];.
2cf50 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 61      if( k>=p->na
2cf60 20 29 20 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   ) k = 0;.  }.  
2cf70 70 2d 3e 69 20 3d 20 6b 3b 0a 20 20 70 2d 3e 6e  p->i = k;.  p->n
2cf80 58 6f 72 20 2b 3d 20 73 7a 3b 0a 7d 0a 23 65 6e  Xor += sz;.}.#en
2cf90 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
2cfa0 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
2cfb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
2cfc0 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2cfd0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65   */../*.** Write
2cfe0 20 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65   up to nBuf byte
2cff0 73 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20  s of randomness 
2d000 69 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  into zBuf..*/.st
2d010 61 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64  atic int winRand
2d020 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
2d030 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2d040 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
2d050 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2d060 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66  ITE_TEST) || def
2d070 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2d080 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 55  _RANDOMNESS).  U
2d090 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2d0a0 70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28  pVfs);.  memset(
2d0b0 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a  zBuf, 0, nBuf);.
2d0c0 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 23    return nBuf;.#
2d0d0 65 6c 73 65 0a 20 20 45 6e 74 72 6f 70 79 47 61  else.  EntropyGa
2d0e0 74 68 65 72 65 72 20 65 3b 0a 20 20 55 4e 55 53  therer e;.  UNUS
2d0f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2d100 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75  s);.  memset(zBu
2d110 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66  f, 0, nBuf);.#if
2d120 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45   defined(_MSC_VE
2d130 52 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d  R) && _MSC_VER>=
2d140 31 34 30 30 20 26 26 20 21 53 51 4c 49 54 45 5f  1400 && !SQLITE_
2d150 4f 53 5f 57 49 4e 43 45 0a 20 20 72 61 6e 64 5f  OS_WINCE.  rand_
2d160 73 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a  s((unsigned int*
2d170 29 7a 42 75 66 29 3b 20 2f 2a 20 72 61 6e 64 5f  )zBuf); /* rand_
2d180 73 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  s() is not avail
2d190 61 62 6c 65 20 77 69 74 68 20 4d 69 6e 47 57 20  able with MinGW 
2d1a0 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  */.#endif /* def
2d1b0 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26  ined(_MSC_VER) &
2d1c0 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 34 30 30  & _MSC_VER>=1400
2d1d0 20 2a 2f 0a 20 20 65 2e 61 20 3d 20 28 75 6e 73   */.  e.a = (uns
2d1e0 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66  igned char*)zBuf
2d1f0 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42 75 66 3b  ;.  e.na = nBuf;
2d200 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30 3b 0a 20  .  e.nXor = 0;. 
2d210 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b 0a 20 20   e.i = 0;.  {.  
2d220 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a    SYSTEMTIME x;.
2d230 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54      osGetSystemT
2d240 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 78 6f 72  ime(&x);.    xor
2d250 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2d260 67 6e 65 64 20 63 68 61 72 2a 29 26 78 2c 20 73  gned char*)&x, s
2d270 69 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45  izeof(SYSTEMTIME
2d280 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20  ));.  }.  {.    
2d290 44 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65  DWORD pid = osGe
2d2a0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
2d2b0 64 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  d();.    xorMemo
2d2c0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2d2d0 20 63 68 61 72 2a 29 26 70 69 64 2c 20 73 69 7a   char*)&pid, siz
2d2e0 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d  eof(DWORD));.  }
2d2f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2d300 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 55 4c 4f  INRT.  {.    ULO
2d310 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47  NGLONG cnt = osG
2d320 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b  etTickCount64();
2d330 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2d340 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2d350 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  r*)&cnt, sizeof(
2d360 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a 20 20 7d  ULONGLONG));.  }
2d370 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
2d380 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74  WORD cnt = osGet
2d390 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
2d3a0 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2d3b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2d3c0 63 6e 74 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52  cnt, sizeof(DWOR
2d3d0 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  D));.  }.#endif 
2d3e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
2d3f0 52 54 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 4c 41  RT */.  {.    LA
2d400 52 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20  RGE_INTEGER i;. 
2d410 20 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72     osQueryPerfor
2d420 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29  manceCounter(&i)
2d430 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2d440 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2d450 61 72 2a 29 26 69 2c 20 73 69 7a 65 6f 66 28 4c  ar*)&i, sizeof(L
2d460 41 52 47 45 5f 49 4e 54 45 47 45 52 29 29 3b 0a  ARGE_INTEGER));.
2d470 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
2d480 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2d490 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2d4a0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
2d4b0 5f 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 55 55  _UUID.  {.    UU
2d4c0 49 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65  ID id;.    memse
2d4d0 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66  t(&id, 0, sizeof
2d4e0 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55  (UUID));.    osU
2d4f0 75 69 64 43 72 65 61 74 65 28 26 69 64 29 3b 0a  uidCreate(&id);.
2d500 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2d510 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2d520 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55  *)&id, sizeof(UU
2d530 49 44 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ID));.    memset
2d540 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&id, 0, sizeof(
2d550 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75  UUID));.    osUu
2d560 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69  idCreateSequenti
2d570 61 6c 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72  al(&id);.    xor
2d580 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69  Memory(&e, (unsi
2d590 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20  gned char*)&id, 
2d5a0 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20  sizeof(UUID));. 
2d5b0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51   }.#endif /* !SQ
2d5c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2d5d0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2d5e0 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2d5f0 32 5f 55 53 45 5f 55 55 49 44 20 2a 2f 0a 20 20  2_USE_UUID */.  
2d600 72 65 74 75 72 6e 20 65 2e 6e 58 6f 72 3e 6e 42  return e.nXor>nB
2d610 75 66 20 3f 20 6e 42 75 66 20 3a 20 65 2e 6e 58  uf ? nBuf : e.nX
2d620 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  or;.#endif /* de
2d630 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
2d640 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  T) || defined(SQ
2d650 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d  LITE_OMIT_RANDOM
2d660 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a  NESS) */.}.../*.
2d670 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c  ** Sleep for a l
2d680 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65  ittle while.  Re
2d690 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  turn the amount 
2d6a0 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a  of time slept..*
2d6b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2d6c0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
2d6d0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63  s *pVfs, int mic
2d6e0 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65  rosec){.  sqlite
2d6f0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d  3_win32_sleep((m
2d700 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30  icrosec+999)/100
2d710 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  0);.  UNUSED_PAR
2d720 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2d730 72 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65  return ((microse
2d740 63 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30  c+999)/1000)*100
2d750 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  0;.}../*.** The 
2d760 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
2d770 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
2d780 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
2d790 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2d7a0 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
2d7b0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
2d7c0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
2d7d0 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
2d7e0 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
2d7f0 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
2d800 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
2d810 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2d820 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
2d830 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2d840 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
2d850 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
2d860 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
2d870 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
2d880 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
2d890 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
2d8a0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
2d8b0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
2d8c0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
2d8d0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2d8e0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2d8f0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2d900 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
2d910 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
2d920 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
2d930 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
2d940 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
2d950 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
2d960 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
2d970 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
2d980 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
2d990 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
2d9a0 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
2d9b0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
2d9c0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
2d9d0 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
2d9e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
2d9f0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
2da00 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
2da10 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20 63 61  e and date.** ca
2da20 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
2da30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2da40 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2da50 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2da60 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  fs, sqlite3_int6
2da70 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20  4 *piNow){.  /* 
2da80 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
2da90 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
2daa0 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
2dab0 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  g the number of.
2dac0 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63       100-nanosec
2dad0 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69  ond intervals si
2dae0 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31  nce January 1, 1
2daf0 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31  601 (= JD 230581
2db00 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c  3.5)..  */.  FIL
2db10 45 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74  ETIME ft;.  stat
2db20 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2db30 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69  _int64 winFileti
2db40 6d 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31  meEpoch = 230581
2db50 33 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  35*(sqlite3_int6
2db60 34 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65  4)8640000;.#ifde
2db70 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2db80 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2db90 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
2dba0 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
2dbb0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
2dbc0 36 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20  640000;.#endif. 
2dbd0 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76   /* 2^32 - to av
2dbe0 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e  oid use of LL an
2dbf0 64 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63  d warnings in gc
2dc00 63 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  c */.  static co
2dc10 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2dc20 34 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20  4 max32BitValue 
2dc30 3d 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  =.      (sqlite3
2dc40 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30  _int64)200000000
2dc50 30 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  0 + (sqlite3_int
2dc60 36 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a  64)2000000000 +.
2dc70 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2dc80 6e 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a  nt64)294967296;.
2dc90 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2dca0 49 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d  INCE.  SYSTEMTIM
2dcb0 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53  E time;.  osGetS
2dcc0 79 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29  ystemTime(&time)
2dcd0 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d  ;.  /* if System
2dce0 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29  TimeToFileTime()
2dcf0 20 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72   fails, it retur
2dd00 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66  ns zero. */.  if
2dd10 20 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54   (!osSystemTimeT
2dd20 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c  oFileTime(&time,
2dd30 26 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72  &ft)){.    retur
2dd40 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
2dd50 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65    }.#else.  osGe
2dd60 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c  tSystemTimeAsFil
2dd70 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65  eTime( &ft );.#e
2dd80 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d  ndif..  *piNow =
2dd90 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63   winFiletimeEpoc
2dda0 68 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  h +.            
2ddb0 28 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  ((((sqlite3_int6
2ddc0 34 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54  4)ft.dwHighDateT
2ddd0 69 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c  ime)*max32BitVal
2dde0 75 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20  ue) +.          
2ddf0 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
2de00 74 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65  t64)ft.dwLowDate
2de10 54 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69  Time)/(sqlite3_i
2de20 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66  nt64)10000;..#if
2de30 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
2de40 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75    if( sqlite3_cu
2de50 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20  rrent_time ){.  
2de60 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a    *piNow = 1000*
2de70 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
2de80 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74  qlite3_current_t
2de90 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  ime + unixEpoch;
2dea0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e  .  }.#endif.  UN
2deb0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2dec0 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Vfs);.  return S
2ded0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2dee0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
2def0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
2df00 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
2df10 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
2df20 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
2df30 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2df40 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2df50 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77  mber into *prNow
2df60 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30   and.** return 0
2df70 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
2df80 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
2df90 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2dfa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2dfb0 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73  winCurrentTime(s
2dfc0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2dfd0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
2dfe0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
2dff0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20  lite3_int64 i;. 
2e000 20 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74   rc = winCurrent
2e010 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20  TimeInt64(pVfs, 
2e020 26 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29  &i);.  if( !rc )
2e030 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69  {.    *prNow = i
2e040 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d  /86400000.0;.  }
2e050 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e060 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20  ./*.** The idea 
2e070 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
2e080 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65  ction works like
2e090 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f   a combination o
2e0a0 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f  f.** GetLastErro
2e0b0 72 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65  r() and FormatMe
2e0c0 73 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f  ssage() on Windo
2e0d0 77 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64  ws (or errno and
2e0e0 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
2e0f0 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72   on Unix). After
2e100 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   an error is ret
2e110 75 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a  urned by an OS.*
2e120 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69  * function, SQLi
2e130 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
2e140 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66  nction with zBuf
2e150 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20   pointing to.** 
2e160 61 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66  a buffer of nBuf
2e170 20 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c   bytes. The OS l
2e180 61 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75  ayer should popu
2e190 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66  late the.** buff
2e1a0 65 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65  er with a nul-te
2e1b0 72 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65  rminated UTF-8 e
2e1c0 6e 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73  ncoded error mes
2e1d0 73 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69  sage.** describi
2e1e0 6e 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65  ng the last IO e
2e1f0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63  rror to have occ
2e200 75 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65  urred within the
2e210 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65   calling.** thre
2e220 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ad..**.** If the
2e230 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
2e240 73 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20  s too large for 
2e250 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
2e260 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c  fer,.** it shoul
2e270 64 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20  d be truncated. 
2e280 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2e290 20 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f   of xGetLastErro
2e2a0 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20  r.** is zero if 
2e2b0 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2e2c0 65 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75  e fits in the bu
2e2d0 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72  ffer, or non-zer
2e2e0 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28  o.** otherwise (
2e2f0 69 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77  if the message w
2e300 61 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49  as truncated). I
2e310 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65  f non-zero is re
2e320 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  turned,.** then 
2e330 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  it is not necess
2e340 61 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74  ary to include t
2e350 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f  he nul-terminato
2e360 72 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69  r character.** i
2e370 6e 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  n the output buf
2e380 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73  fer..**.** Not s
2e390 75 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f  upplying an erro
2e3a0 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68  r message will h
2e3b0 61 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65  ave no adverse e
2e3c0 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69  ffect.** on SQLi
2e3d0 74 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74  te. It is fine t
2e3e0 6f 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d  o have an implem
2e3f0 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65  entation that ne
2e400 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61  ver.** returns a
2e410 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a  n error message:
2e420 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65  .**.**   int xGe
2e430 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2e440 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2e450 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2e460 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65  uf){.**     asse
2e470 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27  rt(zBuf[0]=='\0'
2e480 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e  );.**     return
2e490 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a   0;.**   }.**.**
2e4a0 20 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65   However if an e
2e4b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2e4c0 73 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c  supplied, it wil
2e4d0 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65  l be incorporate
2e4e0 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69  d.** by sqlite i
2e4f0 6e 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65  nto the error me
2e500 73 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20  ssage available 
2e510 74 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e  to the user usin
2e520 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72  g.** sqlite3_err
2e530 6d 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20  msg(), possibly 
2e540 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73  making IO errors
2e550 20 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67   easier to debug
2e560 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e570 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28  winGetLastError(
2e580 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2e590 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2e5a0 72 20 2a 7a 42 75 66 29 7b 0a 20 20 44 57 4f 52  r *zBuf){.  DWOR
2e5b0 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  D e = osGetLastE
2e5c0 72 72 6f 72 28 29 3b 0a 20 20 55 4e 55 53 45 44  rror();.  UNUSED
2e5d0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2e5e0 3b 0a 20 20 69 66 28 20 6e 42 75 66 3e 30 20 29  ;.  if( nBuf>0 )
2e5f0 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
2e600 4d 73 67 28 65 2c 20 6e 42 75 66 2c 20 7a 42 75  Msg(e, nBuf, zBu
2e610 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 3b 0a  f);.  return e;.
2e620 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
2e630 69 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61  ize and deinitia
2e640 6c 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69  lize the operati
2e650 6e 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66  ng system interf
2e660 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ace..*/.int sqli
2e670 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64  te3_os_init(void
2e680 29 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  ){.  static sqli
2e690 74 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d  te3_vfs winVfs =
2e6a0 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e6c0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2e6d0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2e6e0 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  ,       /* szOsF
2e6f0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2e700 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50 41 54 48  E_WIN32_MAX_PATH
2e710 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2e720 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2e730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e740 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2e750 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20 20      "win32",    
2e760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
2e770 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 41  ame */.    &winA
2e780 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
2e790 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2e7a0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2e7b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2e7c0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2e7d0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2e7e0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
2e7f0 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
2e800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2e810 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2e820 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2e830 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2e840 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2e850 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2e860 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2e870 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2e880 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2e890 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2e8a0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2e8b0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2e8c0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2e8d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
2e8e0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2e8f0 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
2e900 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
2e910 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
2e920 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
2e930 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
2e940 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2e950 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  tTime,        /*
2e960 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
2e970 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
2e980 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78  rror,       /* x
2e990 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2e9a0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2e9b0 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43  meInt64,   /* xC
2e9c0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2e9d0 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2e9e0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
2e9f0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2ea00 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2ea10 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
2ea20 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
2ea30 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
2ea40 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a  stemCall,     /*
2ea50 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
2ea60 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66   */.  };.#if def
2ea70 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2ea80 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 74  2_HAS_WIDE).  st
2ea90 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
2eaa0 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20   winLongPathVfs 
2eab0 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20  = {.    3,      
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ead0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
2eae0 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65    sizeof(winFile
2eaf0 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73  ),       /* szOs
2eb00 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49  File */.    SQLI
2eb10 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54  TE_WINNT_MAX_PAT
2eb20 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61  H_BYTES, /* mxPa
2eb30 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c  thname */.    0,
2eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb50 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
2eb60 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67  .    "win32-long
2eb70 70 61 74 68 22 2c 20 20 20 20 20 20 2f 2a 20 7a  path",      /* z
2eb80 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e  Name */.    &win
2eb90 41 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20  AppData,        
2eba0 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2ebb0 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ebd0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2ebe0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2ebf0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2ec00 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2ec10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ec20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77  xAccess */.    w
2ec30 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  inFullPathname, 
2ec40 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61        /* xFullPa
2ec50 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69  thname */.    wi
2ec60 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  nDlOpen,        
2ec70 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20       /* xDlOpen 
2ec80 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f  */.    winDlErro
2ec90 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2eca0 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
2ecb0 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
2ecc0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
2ecd0 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c  m */.    winDlCl
2ece0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2ecf0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2ed00 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2ed10 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ,         /* xRa
2ed20 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2ed30 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2ed40 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2ed50 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2ed60 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f  ntTime,        /
2ed70 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
2ed80 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74  /.    winGetLast
2ed90 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20  Error,       /* 
2eda0 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f  xGetLastError */
2edb0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2edc0 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78  imeInt64,   /* x
2edd0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2ede0 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79   */.    winSetSy
2edf0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f  stemCall,      /
2ee00 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
2ee10 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
2ee20 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f  stemCall,      /
2ee30 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xGetSystemCall
2ee40 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53   */.    winNextS
2ee50 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f  ystemCall,     /
2ee60 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2ee70 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66  l */.  };.#endif
2ee80 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2ee90 33 5f 76 66 73 20 77 69 6e 4e 6f 6c 6f 63 6b 56  3_vfs winNolockV
2eea0 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eec0 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2eed0 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2eee0 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73  ile),       /* s
2eef0 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2ef00 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f  QLITE_WIN32_MAX_
2ef10 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2ef20 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2ef30 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2ef40 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2ef50 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6e   */.    "win32-n
2ef60 6f 6e 65 22 2c 20 20 20 20 20 20 20 20 20 20 2f  one",          /
2ef70 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26  * zName */.    &
2ef80 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44 61 74 61  winNolockAppData
2ef90 2c 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74  ,     /* pAppDat
2efa0 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2efb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2efc0 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2efd0 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2efe0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2eff0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2f000 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
2f010 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2f020 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2f030 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c  e,       /* xFul
2f040 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2f050 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2f060 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2f070 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2f080 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
2f090 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2f0a0 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2f0b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f0c0 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2f0d0 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2f0e0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2f0f0 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2f100 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
2f110 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2f120 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2f130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2f140 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2f150 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2f160 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2f170 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2f180 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
2f190 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2f1a0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2f1b0 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f  ntTimeInt64,   /
2f1c0 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2f1d0 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2f1e0 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f1f0 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2f200 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2f210 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f220 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2f230 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2f240 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2f250 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
2f260 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66  Call */.  };.#if
2f270 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f280 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
2f290 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2f2a0 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68  _vfs winLongPath
2f2b0 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20  NolockVfs = {.  
2f2c0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2f2d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2f2e0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2f2f0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2f300 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2f310 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2f320 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  NT_MAX_PATH_BYTE
2f330 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2f340 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2f350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f360 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22  * pNext */.    "
2f370 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 2d 6e  win32-longpath-n
2f380 6f 6e 65 22 2c 20 2f 2a 20 7a 4e 61 6d 65 20 2a  one", /* zName *
2f390 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b  /.    &winNolock
2f3a0 41 70 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  AppData,     /* 
2f3b0 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20  pAppData */.    
2f3c0 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  winOpen,        
2f3d0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2f3e0 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2f3f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2f400 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20   xDelete */.    
2f410 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20  winAccess,      
2f420 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2f430 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2f440 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
2f450 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2f460 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2f470 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2f480 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2f490 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2f4a0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72          /* xDlEr
2f4b0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ror */.    winDl
2f4c0 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
2f4d0 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
2f4e0 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20     winDlClose,  
2f4f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f500 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e  Close */.    win
2f510 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20  Randomness,     
2f520 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2f530 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2f540 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
2f550 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20   /* xSleep */.  
2f560 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2f570 2c 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72  ,        /* xCur
2f580 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2f590 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2f5a0 20 20 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61         /* xGetLa
2f5b0 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2f5c0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2f5d0 36 34 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e  64,   /* xCurren
2f5e0 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2f5f0 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2f600 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74  ll,      /* xSet
2f610 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2f620 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61    winGetSystemCa
2f630 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74  ll,      /* xGet
2f640 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2f650 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43    winNextSystemC
2f660 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78  all,     /* xNex
2f670 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2f680 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   };.#endif..  /*
2f690 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68   Double-check th
2f6a0 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b  at the aSyscall[
2f6b0 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e  ] array has been
2f6c0 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
2f6d0 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65  * correctly.  Se
2f6e0 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36  e ticket [bb3a86
2f6f0 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a  e890c8e96ab] */.
2f700 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
2f710 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 38  ize(aSyscall)==8
2f720 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d  0 );..  /* get m
2f730 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61  emory map alloca
2f740 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79  tion granularity
2f750 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69   */.  memset(&wi
2f760 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  nSysInfo, 0, siz
2f770 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29  eof(SYSTEM_INFO)
2f780 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
2f790 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61  _WINRT.  osGetNa
2f7a0 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26  tiveSystemInfo(&
2f7b0 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c  winSysInfo);.#el
2f7c0 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  se.  osGetSystem
2f7d0 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f  Info(&winSysInfo
2f7e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
2f7f0 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  rt( winSysInfo.d
2f800 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
2f810 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73  larity>0 );.  as
2f820 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f  sert( winSysInfo
2f830 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b  .dwPageSize>0 );
2f840 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ..  sqlite3_vfs_
2f850 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73  register(&winVfs
2f860 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  , 1);..#if defin
2f870 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
2f880 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69  HAS_WIDE).  sqli
2f890 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
2f8a0 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  (&winLongPathVfs
2f8b0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  , 0);.#endif..  
2f8c0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
2f8d0 73 74 65 72 28 26 77 69 6e 4e 6f 6c 6f 63 6b 56  ster(&winNolockV
2f8e0 66 73 2c 20 30 29 3b 0a 0a 23 69 66 20 64 65 66  fs, 0);..#if def
2f8f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
2f900 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71  2_HAS_WIDE).  sq
2f910 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
2f920 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 4e  er(&winLongPathN
2f930 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a 23 65  olockVfs, 0);.#e
2f940 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
2f950 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74  QLITE_OK;.}..int
2f960 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28   sqlite3_os_end(
2f970 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54  void){.#if SQLIT
2f980 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
2f990 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
2f9a0 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61  ){.    osCloseHa
2f9b0 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a  ndle(sleepObj);.
2f9c0 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e      sleepObj = N
2f9d0 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ULL;.  }.#endif.
2f9e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2f9f0 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
2fa00 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 2a   SQLITE_OS_WIN *
2fa10 2f 0a                                            /.