/ Hex Artifact Content
Login

Artifact 606bb196404afe44f5be7459a3e928347dfd618586abf6e7ff5e7e6bcbac6b83:


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 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  >SQLITE_WIN32_MA
32f0: 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20 20  X_CACHE_SIZE.#  
3300: 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  undef SQLITE_WIN
3310: 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  32_CACHE_SIZE.# 
3320: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
3330: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
3340: 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65 6e        (2000).#en
3350: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 69  dif../*. * The i
3360: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
3370: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
3380: 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76 61  c heap.  This va
3390: 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 2e  lue may be zero.
33a0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
33b0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
33c0: 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  NIT_SIZE.#  defi
33d0: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
33e0: 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20 20  HEAP_INIT_SIZE  
33f0: 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f   ((SQLITE_WIN32_
3400: 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c 0a  CACHE_SIZE) * \.
3410: 20 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 28 53 51 4c 49 54 45           (SQLITE
3440: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
3450: 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20 20  ZE) + \.        
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 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48   (SQLITE_WIN32_H
3490: 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29 29  EAP_INIT_EXTRA))
34a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
34b0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
34c0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
34d0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
34e0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
34f0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
3500: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3510: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
3520: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
3530: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
3540: 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a      (0).#endif..
3550: 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20  /*. * The extra 
3560: 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20  flags to use in 
3570: 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e  calls to the Win
3580: 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20 54  32 heap APIs.  T
3590: 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65  his value may be
35a0: 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65  . * zero for the
35b0: 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f   default behavio
35c0: 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  r.. */.#ifndef S
35d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
35e0: 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65  _FLAGS.#  define
35f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
3600: 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20 28  AP_FLAGS       (
3610: 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  0).#endif.../*.*
3620: 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74 61  * The winMemData
3630: 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72 65   structure store
3640: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72 65  s information re
3650: 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57 69  quired by the Wi
3660: 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  n32-specific.** 
3670: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3680: 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ods implementati
3690: 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  on..*/.typedef s
36a0: 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61  truct winMemData
36b0: 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74 72   winMemData;.str
36c0: 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 7b  uct winMemData {
36d0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
36e0: 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20 20    u32 magic1;   
36f0: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3700: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3710: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3720: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e 44  */.#endif.  HAND
3730: 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68 65  LE hHeap; /* The
3740: 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20 68   handle to our h
3750: 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  eap. */.  BOOL b
3760: 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77 65  Owned;  /* Do we
3770: 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28 69   own the heap (i
3780: 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20 6f  .e. destroy it o
3790: 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a  n shutdown)? */.
37a0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
37b0: 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20 2f   u32 magic2;   /
37c0: 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20 74  * Magic number t
37d0: 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74 75  o detect structu
37e0: 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a  re corruption. *
37f0: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66  /.#endif.};..#if
3800: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65 66  ndef NDEBUG.#def
3810: 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  ine WINMEM_MAGIC
3820: 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30 62  1     0x42b2830b
3830: 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d 5f  .#define WINMEM_
3840: 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64 34  MAGIC2     0xbd4
3850: 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73 74  d7cf4.#endif..st
3860: 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 4d  atic struct winM
3870: 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f 64  emData win_mem_d
3880: 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66 20  ata = {.#ifndef 
3890: 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d 5f  NDEBUG.  WINMEM_
38a0: 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a 20  MAGIC1,.#endif. 
38b0: 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69 66   NULL, FALSE.#if
38c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c 57  ndef NDEBUG.  ,W
38d0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65 6e  INMEM_MAGIC2.#en
38e0: 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20  dif.};..#ifndef 
38f0: 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20 77  NDEBUG.#define w
3900: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3910: 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e 5f  1() assert( win_
3920: 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31 3d  mem_data.magic1=
3930: 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29  =WINMEM_MAGIC1 )
3940: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41  .#define winMemA
3950: 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61 73  ssertMagic2() as
3960: 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61  sert( win_mem_da
3970: 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  ta.magic2==WINME
3980: 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66 69  M_MAGIC2 ).#defi
3990: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
39a0: 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41 73  agic()  winMemAs
39b0: 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77 69  sertMagic1(); wi
39c0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 32  nMemAssertMagic2
39d0: 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ();.#else.#defin
39e0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
39f0: 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23 64  gic().#endif..#d
3a00: 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74 44  efine winMemGetD
3a10: 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f 6d  ataPtr()  &win_m
3a20: 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65 20  em_data.#define 
3a30: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 20  winMemGetHeap() 
3a40: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
3a50: 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20 77  .hHeap.#define w
3a60: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
3a70: 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e     win_mem_data.
3a80: 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20 76  bOwned..static v
3a90: 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f  oid *winMemMallo
3aa0: 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73  c(int nBytes);.s
3ab0: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3ac0: 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69  mFree(void *pPri
3ad0: 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  or);.static void
3ae0: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
3af0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
3b00: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
3b10: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65  c int winMemSize
3b20: 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74 69  (void *p);.stati
3b30: 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e  c int winMemRoun
3b40: 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61 74  dup(int n);.stat
3b50: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69  ic int winMemIni
3b60: 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61  t(void *pAppData
3b70: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  );.static void w
3b80: 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f  inMemShutdown(vo
3b90: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 0a  id *pAppData);..
3ba0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
3bb0: 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74  m_methods *sqlit
3bc0: 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f  e3MemGetWin32(vo
3bd0: 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  id);.#endif /* S
3be0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
3bf0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OC */../*.** The
3c00: 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
3c10: 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c 79  ble is (normally
3c20: 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20 6e  ) set once and n
3c30: 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a 20  ever changes.** 
3c40: 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74 20  thereafter.  It 
3c50: 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72 20  records whether 
3c60: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
3c70: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a 2a  stem is Win9x.**
3c80: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a   or WinNT..**.**
3c90: 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   0:   Operating 
3ca0: 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a  system unknown..
3cb0: 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69 6e  ** 1:   Operatin
3cc0: 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 39  g system is Win9
3cd0: 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72 61  x..** 2:   Opera
3ce0: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57  ting system is W
3cf0: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f  inNT..**.** In o
3d00: 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74 61  rder to facilita
3d10: 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61 20  te testing on a 
3d20: 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74 68  WinNT system, th
3d30: 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a 2a  e test fixture.*
3d40: 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20 73  * can manually s
3d50: 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74 6f  et this value to
3d60: 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57 69   1 to emulate Wi
3d70: 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  n98 behavior..*/
3d80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
3d90: 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45 5f  EST.LONG SQLITE_
3da0: 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73  WIN32_VOLATILE s
3db0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d  qlite3_os_type =
3dc0: 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69 63   0;.#else.static
3dd0: 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e   LONG SQLITE_WIN
3de0: 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69  32_VOLATILE sqli
3df0: 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b  te3_os_type = 0;
3e00: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3e10: 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66 69   SYSCALL.#  defi
3e20: 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69 74  ne SYSCALL sqlit
3e30: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a 23  e3_syscall_ptr.#
3e40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
3e50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f  s function is no
3e60: 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  t available on W
3e70: 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69 6e  indows CE or Win
3e80: 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  RT.. */..#if SQL
3e90: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
3ea0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
3eb0: 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65 46  #  define osAreF
3ec0: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20 20  ileApisANSI()   
3ed0: 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a      1.#endif../*
3ee0: 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d 20  .** Many system 
3ef0: 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73 73  calls are access
3f00: 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e 74  ed through point
3f10: 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73 20  er-to-functions 
3f20: 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20  so that.** they 
3f30: 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64 65  may be overridde
3f40: 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f 20  n at runtime to 
3f50: 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c 74  facilitate fault
3f60: 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69 6e   injection durin
3f70: 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  g.** testing and
3f80: 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54 68   sandboxing.  Th
3f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72 61  e following arra
3fa0: 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d 65  y holds the name
3fb0: 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a 2a  s and pointers.*
3fc0: 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69 64  * to all overrid
3fd0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
3fe0: 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  ls..*/.static st
3ff0: 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c 6c  ruct win_syscall
4000: 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   {.  const char 
4010: 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  *zName;         
4020: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4030: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
4040: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4050: 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74 3b  ll_ptr pCurrent;
4060: 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c 75   /* Current valu
4070: 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20  e of the system 
4080: 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65  call */.  sqlite
4090: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 44  3_syscall_ptr pD
40a0: 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61 75  efault; /* Defau
40b0: 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61 53  lt value */.} aS
40c0: 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66  yscall[] = {.#if
40d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
40e0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
40f0: 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46 69  WINRT.  { "AreFi
4100: 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20 20  leApisANSI",    
4110: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41 72       (SYSCALL)Ar
4120: 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20 20  eFileApisANSI,  
4130: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4140: 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  e.  { "AreFileAp
4150: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
4160: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4190: 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69 6c  #ifndef osAreFil
41a0: 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69 6e  eApisANSI.#defin
41b0: 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  e osAreFileApisA
41c0: 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  NSI ((BOOL(WINAP
41d0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
41e0: 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[0].pCurrent).
41f0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
4200: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64  TE_OS_WINCE && d
4210: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4220: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4230: 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c 20  { "CharLowerW", 
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4250: 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72 57  SCALL)CharLowerW
4260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
4270: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4280: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
4290: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
42a0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
42b0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
42c0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
42d0: 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28 4c  osCharLowerW ((L
42e0: 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c  PWSTR(WINAPI*)(L
42f0: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
4300: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4310: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4320: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
4330: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
4340: 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70 70  DE).  { "CharUpp
4350: 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  erW",           
4360: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61 72     (SYSCALL)Char
4370: 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20 20  UpperW,         
4380: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4390: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
43a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
43b0: 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
43e0: 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70 65  efine osCharUppe
43f0: 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e 41  rW ((LPWSTR(WINA
4400: 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53 79  PI*)(LPWSTR))aSy
4410: 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65 6e  scall[2].pCurren
4420: 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48 61  t)..  { "CloseHa
4430: 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  ndle",          
4440: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f 73     (SYSCALL)Clos
4450: 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20 20  eHandle,        
4460: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
4470: 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ne osCloseHandle
4480: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
4490: 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  (HANDLE))aSyscal
44a0: 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[3].pCurrent)..
44b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
44c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
44d0: 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  I).  { "CreateFi
44e0: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
44f0: 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74    (SYSCALL)Creat
4500: 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20 20  eFileA,         
4510: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4520: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
4530: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
4540: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4560: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4570: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
4580: 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  eA ((HANDLE(WINA
4590: 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f 52  PI*)(LPCSTR,DWOR
45a0: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
45b0: 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41 54     LPSECURITY_AT
45c0: 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c 44  TRIBUTES,DWORD,D
45d0: 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53 79  WORD,HANDLE))aSy
45e0: 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e  scall[4].pCurren
45f0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4600: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
4610: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4620: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4630: 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20 20  CreateFileW",   
4640: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4650: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c 20  LL)CreateFileW, 
4660: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4670: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4680: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
4690: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
46a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
46b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
46c0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
46d0: 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41 4e  reateFileW ((HAN
46e0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  DLE(WINAPI*)(LPC
46f0: 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WSTR,DWORD,DWORD
4700: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
4710: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
4720: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
4730: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  NDLE))aSyscall[5
4740: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4750: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
4760: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
4770: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4780: 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20  SI) && \.       
4790: 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54   (!defined(SQLIT
47a0: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
47b0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
47c0: 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20 20  IZE>0) && \.    
47d0: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
47e0: 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49  _CREATEFILEMAPPI
47f0: 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65 46  NGA.  { "CreateF
4800: 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20 20  ileMappingA",   
4810: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4820: 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c 20  teFileMappingA, 
4830: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4840: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
4850: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
4860: 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4890: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
48a0: 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41 4e  leMappingA ((HAN
48b0: 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  DLE(WINAPI*)(HAN
48c0: 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f 41  DLE,LPSECURITY_A
48d0: 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20 20  TTRIBUTES, \.   
48e0: 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52 44       DWORD,DWORD
48f0: 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29 61  ,DWORD,LPCSTR))a
4900: 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72  Syscall[6].pCurr
4910: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4920: 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53  _OS_WINCE || (!S
4930: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
4940: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
4950: 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
4960: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
4970: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4980: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4990: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
49a0: 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74 65  >0)).  { "Create
49b0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20 20  FileMappingW",  
49c0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
49d0: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 2c  ateFileMappingW,
49e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
49f0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
4a00: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
4a10: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4a40: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
4a50: 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48 41  ileMappingW ((HA
4a60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4a70: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4a80: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4a90: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4aa0: 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 29  D,DWORD,LPCWSTR)
4ab0: 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75  )aSyscall[7].pCu
4ac0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
4ad0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4ae0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4af0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4b00: 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78 57   { "CreateMutexW
4b10: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
4b20: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75 74  YSCALL)CreateMut
4b30: 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  exW,            
4b40: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4b50: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
4b60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4b70: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4b90: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4ba0: 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 20   osCreateMutexW 
4bb0: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
4bc0: 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54  )(LPSECURITY_ATT
4bd0: 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a  RIBUTES,BOOL, \.
4be0: 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52 29          LPCWSTR)
4bf0: 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75  )aSyscall[8].pCu
4c00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
4c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
4c30: 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20 20  DeleteFileA",   
4c40: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4c50: 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c 20  LL)DeleteFileA, 
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65  .#else.  { "Dele
4c80: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
4c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44  dif..#define osD
4cd0: 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f 4f  eleteFileA ((BOO
4ce0: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54  L(WINAPI*)(LPCST
4cf0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70  R))aSyscall[9].p
4d00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4d10: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4d20: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
4d30: 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c 20   "DeleteFileW", 
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
4d50: 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 57  CALL)DeleteFileW
4d60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
4d70: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65  },.#else.  { "De
4d80: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
4d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4da0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
4db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4dc0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
4dd0: 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28 42  sDeleteFileW ((B
4de0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
4df0: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 31  WSTR))aSyscall[1
4e00: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
4e10: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4e20: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4e30: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c  oLocalFileTime",
4e40: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4e50: 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d  meToLocalFileTim
4e60: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
4e70: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4e80: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
4e90: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4eb0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4ec0: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4ed0: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28 28  LocalFileTime ((
4ee0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f  BOOL(WINAPI*)(CO
4ef0: 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c  NST FILETIME*, \
4f00: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
4f10: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 31  IME))aSyscall[11
4f20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
4f30: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
4f40: 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f  .  { "FileTimeTo
4f50: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
4f60: 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d  (SYSCALL)FileTim
4f70: 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  eToSystemTime,  
4f80: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4f90: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
4fa0: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
4fb0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fd0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4fe0: 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  ne osFileTimeToS
4ff0: 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f 4c  ystemTime ((BOOL
5000: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
5010: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
5020: 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49 4d       LPSYSTEMTIM
5030: 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e  E))aSyscall[12].
5040: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5050: 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73  FlushFileBuffers
5060: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5070: 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66 66  LL)FlushFileBuff
5080: 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  ers,        0 },
5090: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
50a0: 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28 42  hFileBuffers ((B
50b0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
50c0: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 33  DLE))aSyscall[13
50d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
50e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
50f0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
5100: 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61    { "FormatMessa
5110: 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 28  geA",          (
5120: 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d 65  SYSCALL)FormatMe
5130: 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20 20  ssageA,         
5140: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5150: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
5160: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
5170: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5190: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
51a0: 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  e osFormatMessag
51b0: 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  eA ((DWORD(WINAP
51c0: 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f 49  I*)(DWORD,LPCVOI
51d0: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c 50  D,DWORD,DWORD,LP
51e0: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
51f0: 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29 61  WORD,va_list*))a
5200: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
5210: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5220: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5230: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 46  HAS_WIDE).  { "F
5240: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c 20  ormatMessageW", 
5250: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5260: 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  L)FormatMessageW
5270: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5280: 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61  #else.  { "Forma
5290: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
52a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
52d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f  if..#define osFo
52e0: 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28 44  rmatMessageW ((D
52f0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5300: 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52  ORD,LPCVOID,DWOR
5310: 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20  D,DWORD,LPWSTR, 
5320: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
5330: 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61  va_list*))aSysca
5340: 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[15].pCurrent)
5350: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
5360: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
5370: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
5380: 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20 20  FreeLibrary",   
5390: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
53a0: 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c 20  LL)FreeLibrary, 
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
53c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65 65  .#else.  { "Free
53d0: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
53e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
53f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5410: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
5420: 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f 4f  reeLibrary ((BOO
5430: 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55  L(WINAPI*)(HMODU
5440: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  LE))aSyscall[16]
5450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5460: 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  "GetCurrentProce
5470: 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53 43  ssId",     (SYSC
5480: 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50 72  ALL)GetCurrentPr
5490: 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20 7d  ocessId,     0 }
54a0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  ,..#define osGet
54b0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
54c0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
54d0: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
54e0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
54f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5500: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5510: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5520: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 44  _ANSI).  { "GetD
5530: 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c 20  iskFreeSpaceA", 
5540: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5550: 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65 41  etDiskFreeSpaceA
5560: 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  ,       0 },.#el
5570: 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  se.  { "GetDiskF
5580: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
5590: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
55c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44 69  .#define osGetDi
55d0: 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28 42  skFreeSpaceA ((B
55e0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
55f0: 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57  STR,LPDWORD,LPDW
5600: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
5610: 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29         LPDWORD))
5620: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
5630: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5640: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
5650: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
5660: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
5670: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
5680: 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  E).  { "GetDiskF
5690: 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20 20  reeSpaceW",     
56a0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
56b0: 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20 20  skFreeSpaceW,   
56c0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
56d0: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
56e0: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
56f0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5710: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5720: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
5730: 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c 28  eeSpaceW ((BOOL(
5740: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
5750: 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44  ,LPDWORD,LPDWORD
5760: 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  ,LPDWORD, \.    
5770: 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79      LPDWORD))aSy
5780: 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72 65  scall[19].pCurre
5790: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
57a0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
57b0: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
57c0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 22  FileAttributesA"
57d0: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
57e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
57f0: 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sA,      0 },.#e
5800: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5810: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
5820: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5850: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20 28  ileAttributesA (
5870: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5880: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
5890: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
58a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
58b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
58c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
58d0: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46  _WIDE).  { "GetF
58e0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22 2c  ileAttributesW",
58f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5900: 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
5910: 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c  W,      0 },.#el
5920: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  se.  { "GetFileA
5930: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
5940: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5970: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
5980: 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28 28  leAttributesW ((
5990: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c  DWORD(WINAPI*)(L
59a0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
59b0: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
59c0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
59d0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
59e0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
59f0: 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20 20  ttributesExW",  
5a00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
5a10: 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57 2c  leAttributesExW,
5a20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5a30: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
5a40: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
5a50: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a70: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5a80: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
5a90: 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42 4f  tributesExW ((BO
5aa0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  OL(WINAPI*)(LPCW
5ab0: 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f 49  STR,GET_FILEEX_I
5ac0: 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20 20  NFO_LEVELS, \.  
5ad0: 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61 53        LPVOID))aS
5ae0: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
5af0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5b00: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5b10: 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20 20  GetFileSize",   
5b20: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5b30: 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c 20  LL)GetFileSize, 
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5b50: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5b60: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
5b70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5b90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5ba0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5bb0: 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57 4f  etFileSize ((DWO
5bc0: 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  RD(WINAPI*)(HAND
5bd0: 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79 73  LE,LPDWORD))aSys
5be0: 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e  call[23].pCurren
5bf0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
5c00: 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69  OS_WINCE && defi
5c10: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5c20: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
5c30: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5c40: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5c50: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5c60: 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meA,        0 },
5c70: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5c80: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
5c90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5ca0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5cb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cc0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5cd0: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 20  etFullPathNameA 
5ce0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5cf0: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c 50  (LPCSTR,DWORD,LP
5d00: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  STR, \.        L
5d10: 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  PSTR*))aSyscall[
5d20: 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  24].pCurrent)..#
5d30: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5d40: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
5d50: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5d60: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5d70: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5d80: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22  etFullPathNameW"
5d90: 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c  ,        (SYSCAL
5da0: 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  L)GetFullPathNam
5db0: 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  eW,        0 },.
5dc0: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 75  #else.  { "GetFu
5dd0: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
5de0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5e10: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5e20: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20 28  tFullPathNameW (
5e30: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5e40: 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c 50  LPCWSTR,DWORD,LP
5e50: 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  WSTR, \.        
5e60: 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61 6c  LPWSTR*))aSyscal
5e70: 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[25].pCurrent).
5e80: 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72 72  .  { "GetLastErr
5e90: 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  or",            
5ea0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73 74  (SYSCALL)GetLast
5eb0: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
5ec0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5ed0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20 28  osGetLastError (
5ee0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
5ef0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 32  VOID))aSyscall[2
5f00: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
5f10: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
5f20: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
5f30: 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49 54  NSION).#if SQLIT
5f40: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 20  E_OS_WINCE.  /* 
5f50: 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72 65  The GetProcAddre
5f60: 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ssA() routine is
5f70: 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
5f80: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20 2a  on Windows CE. *
5f90: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
5fa0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
5fb0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
5fc0: 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20 20  cAddressA,      
5fd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
5fe0: 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69 6e  /* All other Win
5ff0: 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20 65  dows platforms e
6000: 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64 64  xpect GetProcAdd
6010: 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a 20  ress() to take. 
6020: 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72 69   ** an ANSI stri
6030: 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  ng regardless of
6040: 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73 65   the _UNICODE se
6050: 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47 65  tting */.  { "Ge
6060: 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20  tProcAddressA", 
6070: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6080: 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 2c  )GetProcAddress,
6090: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
60a0: 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b 20  endif.#else.  { 
60b0: 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41  "GetProcAddressA
60c0: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
60d0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
60f0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6100: 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  e osGetProcAddre
6110: 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57 49  ssA ((FARPROC(WI
6120: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c 20  NAPI*)(HMODULE, 
6130: 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54 52  \.        LPCSTR
6140: 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70  ))aSyscall[27].p
6150: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6160: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6170: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e 66   { "GetSystemInf
6180: 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53  o",           (S
6190: 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d  YSCALL)GetSystem
61a0: 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
61b0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
61c0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
61d0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
61e0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6200: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6210: 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66 6f   osGetSystemInfo
6220: 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29   ((VOID(WINAPI*)
6230: 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  (LPSYSTEM_INFO))
6240: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
6250: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
6260: 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20 20  SystemTime",    
6270: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6280: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20 20  GetSystemTime,  
6290: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
62a0: 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74  define osGetSyst
62b0: 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  emTime ((VOID(WI
62c0: 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d 54  NAPI*)(LPSYSTEMT
62d0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32 39  IME))aSyscall[29
62e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
62f0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
6300: 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d  E.  { "GetSystem
6310: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22 2c  TimeAsFileTime",
6320: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73   (SYSCALL)GetSys
6330: 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d  temTimeAsFileTim
6340: 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20  e, 0 },.#else.  
6350: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
6360: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
6370: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6390: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
63a0: 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54  ine osGetSystemT
63b0: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28 28  imeAsFileTime ((
63c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
63d0: 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54  .        LPFILET
63e0: 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 30  IME))aSyscall[30
63f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6400: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6410: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
6420: 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68    { "GetTempPath
6430: 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  A",            (
6440: 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50  SYSCALL)GetTempP
6450: 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20 20  athA,           
6460: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6470: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
6480: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6490: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
64b0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
64c0: 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 41  e osGetTempPathA
64d0: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
64e0: 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29 61  )(DWORD,LPSTR))a
64f0: 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75 72  Syscall[31].pCur
6500: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6510: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6520: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6530: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
6540: 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57 22  { "GetTempPathW"
6550: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6560: 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74  SCALL)GetTempPat
6570: 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  hW,            0
6580: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
6590: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
65a0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
65b0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
65c0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
65d0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
65e0: 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20 28  osGetTempPathW (
65f0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
6600: 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61 53  DWORD,LPWSTR))aS
6610: 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72 72  yscall[32].pCurr
6620: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6630: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6640: 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20  GetTickCount",  
6650: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6660: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 2c  LL)GetTickCount,
6670: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6680: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
6690: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
66a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
66b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
66d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
66e0: 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44 57  etTickCount ((DW
66f0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  ORD(WINAPI*)(VOI
6700: 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d 2e  D))aSyscall[33].
6710: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6720: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
6730: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26  N32_HAS_ANSI) &&
6740: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45   SQLITE_WIN32_GE
6750: 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22  TVERSIONEX.  { "
6760: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c 20  GetVersionExA", 
6770: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6780: 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78 41  LL)GetVersionExA
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
67a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56  .#else.  { "GetV
67b0: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
67d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
67f0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
6800: 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28 42  etVersionExA ((B
6810: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OOL(WINAPI*)( \.
6820: 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53          LPOSVERS
6830: 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63 61  IONINFOA))aSysca
6840: 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[34].pCurrent)
6850: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6860: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
6870: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
6880: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
6890: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e        SQLITE_WIN
68a0: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
68b0: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
68c0: 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xW",           (
68d0: 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73 69  SYSCALL)GetVersi
68e0: 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20 20  onExW,          
68f0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6900: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
6910: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6920: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6940: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6950: 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78  e osGetVersionEx
6960: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
6970: 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f  )( \.        LPO
6980: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29 61  SVERSIONINFOW))a
6990: 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75 72  Syscall[35].pCur
69a0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
69b0: 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20 20  Alloc",         
69c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
69d0: 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20  eapAlloc,       
69e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
69f0: 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c 6f  efine osHeapAllo
6a00: 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  c ((LPVOID(WINAP
6a10: 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44  I*)(HANDLE,DWORD
6a20: 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45  , \.        SIZE
6a30: 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36 5d  _T))aSyscall[36]
6a40: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6a50: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6a60: 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74 65  .  { "HeapCreate
6a70: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6a80: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72 65  (SYSCALL)HeapCre
6a90: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6aa0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6ab0: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6ad0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6af0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6b00: 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65 20  ne osHeapCreate 
6b10: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
6b20: 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c 20  )(DWORD,SIZE_T, 
6b30: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
6b40: 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e 70  ))aSyscall[37].p
6b50: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6b60: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6b70: 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79 22   { "HeapDestroy"
6b80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6b90: 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74 72  YSCALL)HeapDestr
6ba0: 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oy,             
6bb0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6bc0: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6bd0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6be0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6c00: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6c10: 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20 28   osHeapDestroy (
6c20: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6c30: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
6c40: 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  38].pCurrent).. 
6c50: 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20 20   { "HeapFree",  
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
6c70: 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65 2c  YSCALL)HeapFree,
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6ca0: 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c 28  HeapFree ((BOOL(
6cb0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6cc0: 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61 53  DWORD,LPVOID))aS
6cd0: 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72 72  yscall[39].pCurr
6ce0: 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 52  ent)..  { "HeapR
6cf0: 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  eAlloc",        
6d00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65       (SYSCALL)He
6d10: 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20 20  apReAlloc,      
6d20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
6d30: 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c 6c  fine osHeapReAll
6d40: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6d50: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6d60: 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20 20  D,LPVOID, \.    
6d70: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
6d80: 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65 6e  call[40].pCurren
6d90: 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69 7a  t)..  { "HeapSiz
6da0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
6db0: 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70     (SYSCALL)Heap
6dc0: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
6dd0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
6de0: 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28 28  ne osHeapSize ((
6df0: 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29 28  SIZE_T(WINAPI*)(
6e00: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6e10: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6e20: 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70 43  )aSyscall[41].pC
6e30: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6e40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6e50: 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65 22  { "HeapValidate"
6e60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
6e70: 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64 61  SCALL)HeapValida
6e80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  te,            0
6e90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48   },.#else.  { "H
6ea0: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6eb0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ec0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6ed0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ee0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6ef0: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20 28  osHeapValidate (
6f00: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
6f10: 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20  ANDLE,DWORD, \. 
6f20: 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29 29         LPCVOID))
6f30: 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43 75  aSyscall[42].pCu
6f40: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6f50: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
6f60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6f70: 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61 63  .  { "HeapCompac
6f80: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
6f90: 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f 6d  (SYSCALL)HeapCom
6fa0: 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20 20  pact,           
6fb0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6fc0: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6fe0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7000: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7010: 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63 74  ne osHeapCompact
7020: 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a 29   ((UINT(WINAPI*)
7030: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29 61  (HANDLE,DWORD))a
7040: 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75 72  Syscall[43].pCur
7050: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
7060: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
7070: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64 65  HAS_ANSI) && !de
7080: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7090: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
70a0: 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61  ).  { "LoadLibra
70b0: 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  ryA",           
70c0: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69   (SYSCALL)LoadLi
70d0: 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20 20  braryA,         
70e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
70f0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
7100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7110: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7130: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7140: 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72  ine osLoadLibrar
7150: 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  yA ((HMODULE(WIN
7160: 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53  API*)(LPCSTR))aS
7170: 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72 72  yscall[44].pCurr
7180: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7190: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
71a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
71b0: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
71c0: 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69 6e  \.        !defin
71d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ed(SQLITE_OMIT_L
71e0: 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20  OAD_EXTENSION). 
71f0: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 57   { "LoadLibraryW
7200: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
7210: 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61  YSCALL)LoadLibra
7220: 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  ryW,            
7230: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7240: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
7250: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7260: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7270: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7280: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
7290: 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 20   osLoadLibraryW 
72a0: 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49  ((HMODULE(WINAPI
72b0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
72c0: 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65 6e  call[45].pCurren
72d0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
72e0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c 6f  OS_WINRT.  { "Lo
72f0: 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20 20  calFree",       
7300: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7310: 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20 20  )LocalFree,     
7320: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7330: 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  else.  { "LocalF
7340: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
7350: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (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 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7380: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63  f..#define osLoc
7390: 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c 28  alFree ((HLOCAL(
73a0: 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c 29  WINAPI*)(HLOCAL)
73b0: 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70 43  )aSyscall[46].pC
73c0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
73d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
73e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
73f0: 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22  T.  { "LockFile"
7400: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7410: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
7420: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7430: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7440: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7460: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7480: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7490: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23  def osLockFile.#
74a0: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c  define osLockFil
74b0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
74c0: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
74d0: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
74e0: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
74f0: 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72 65  scall[47].pCurre
7500: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7510: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7520: 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78  .  { "LockFileEx
7530: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7540: 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c  (SYSCALL)LockFil
7550: 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  eEx,            
7560: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7570: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
7580: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7590: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
75b0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
75c0: 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 0a  ef osLockFileEx.
75d0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
75e0: 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41  leEx ((BOOL(WINA
75f0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
7600: 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  D,DWORD,DWORD,DW
7610: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7620: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7630: 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72 65  scall[48].pCurre
7640: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7650: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7660: 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f 57  || (!SQLITE_OS_W
7670: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20  INRT && \.      
7680: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
7690: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
76a0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
76b0: 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d 61  SIZE>0)).  { "Ma
76c0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
76d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
76e0: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  )MapViewOfFile, 
76f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7700: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
7710: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
7720: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (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 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7750: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
7760: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50 56  ViewOfFile ((LPV
7770: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
7780: 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  DLE,DWORD,DWORD,
7790: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
77a0: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
77b0: 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[49].pCurrent).
77c0: 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65 54  .  { "MultiByteT
77d0: 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20 20  oWideChar",     
77e0: 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42 79  (SYSCALL)MultiBy
77f0: 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20 20  teToWideChar,   
7800: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
7810: 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  osMultiByteToWid
7820: 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e 41  eChar ((int(WINA
7830: 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44 2c  PI*)(UINT,DWORD,
7840: 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53 54  LPCSTR,int,LPWST
7850: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e 74  R, \.        int
7860: 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e 70  ))aSyscall[50].p
7870: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 51  Current)..  { "Q
7880: 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43  ueryPerformanceC
7890: 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41 4c  ounter", (SYSCAL
78a0: 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e  L)QueryPerforman
78b0: 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c 0a  ceCounter, 0 },.
78c0: 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72 79  .#define osQuery
78d0: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
78e0: 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  er ((BOOL(WINAPI
78f0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 41  *)( \.        LA
7900: 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61 53  RGE_INTEGER*))aS
7910: 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72 72  yscall[51].pCurr
7920: 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64 46  ent)..  { "ReadF
7930: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
7940: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52 65       (SYSCALL)Re
7950: 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  adFile,         
7960: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7970: 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65 20  fine osReadFile 
7980: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
7990: 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44 57  HANDLE,LPVOID,DW
79a0: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
79b0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
79c0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 32  PED))aSyscall[52
79d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
79e0: 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22 2c   "SetEndOfFile",
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7a00: 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69 6c  CALL)SetEndOfFil
7a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  e,            0 
7a20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65  },..#define osSe
7a30: 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f 4f  tEndOfFile ((BOO
7a40: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7a50: 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d 2e  E))aSyscall[53].
7a60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7a70: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
7a80: 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69 6e    { "SetFilePoin
7a90: 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 28  ter",          (
7aa0: 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65 50  SYSCALL)SetFileP
7ab0: 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20 20  ointer,         
7ac0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7ad0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
7ae0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7af0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7b20: 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74  e osSetFilePoint
7b30: 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50  er ((DWORD(WINAP
7b40: 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c  I*)(HANDLE,LONG,
7b50: 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20 20  PLONG, \.       
7b60: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
7b70: 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [54].pCurrent)..
7b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
7b90: 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70 22  INRT.  { "Sleep"
7ba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7bb0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c 65      (SYSCALL)Sle
7bc0: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
7bd0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7be0: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7c30: 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20 28  define osSleep (
7c40: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 44  (VOID(WINAPI*)(D
7c50: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
7c60: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
7c70: 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  { "SystemTimeToF
7c80: 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53 59  ileTime",    (SY
7c90: 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d 65  SCALL)SystemTime
7ca0: 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20 30  ToFileTime,    0
7cb0: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7cc0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7cd0: 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ime ((BOOL(WINAP
7ce0: 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45 4d  I*)(CONST SYSTEM
7cf0: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
7d00: 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53 79   LPFILETIME))aSy
7d10: 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72 65  scall[56].pCurre
7d20: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7d30: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
7d40: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
7d50: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20  { "UnlockFile", 
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7d70: 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65  SCALL)UnlockFile
7d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
7d90: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
7da0: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
7db0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7dc0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7dd0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7de0: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
7df0: 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64 65  osUnlockFile.#de
7e00: 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  fine osUnlockFil
7e10: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
7e20: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7e30: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7e40: 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53 79        DWORD))aSy
7e50: 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72 65  scall[57].pCurre
7e60: 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  nt).#endif..#if 
7e70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
7e80: 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65  .  { "UnlockFile
7e90: 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  Ex",            
7ea0: 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46  (SYSCALL)UnlockF
7eb0: 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20  ileEx,          
7ec0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7ed0: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7ef0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7f10: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7f20: 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  ne osUnlockFileE
7f30: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
7f40: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44  )(HANDLE,DWORD,D
7f50: 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  WORD,DWORD, \.  
7f60: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
7f70: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38 5d  ED))aSyscall[58]
7f80: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7f90: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
7fa0: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
7fb0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
7fc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
7fd0: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d 61  SIZE>0.  { "Unma
7fe0: 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20  pViewOfFile",   
7ff0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8000: 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c 20  nmapViewOfFile, 
8010: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8020: 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  se.  { "UnmapVie
8030: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
8040: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8070: 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61 70  .#define osUnmap
8080: 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f 4f  ViewOfFile ((BOO
8090: 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56 4f  L(WINAPI*)(LPCVO
80a0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39 5d  ID))aSyscall[59]
80b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
80c0: 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  "WideCharToMulti
80d0: 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53 43  Byte",     (SYSC
80e0: 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d 75  ALL)WideCharToMu
80f0: 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20 7d  ltiByte,     0 }
8100: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69 64  ,..#define osWid
8110: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
8120: 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28   ((int(WINAPI*)(
8130: 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57 53  UINT,DWORD,LPCWS
8140: 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e 74  TR,int,LPSTR,int
8150: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53  , \.        LPCS
8160: 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73 63  TR,LPBOOL))aSysc
8170: 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e 74  all[60].pCurrent
8180: 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69 6c  )..  { "WriteFil
8190: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
81a0: 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74 65    (SYSCALL)Write
81b0: 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
81c0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
81d0: 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28 28  e osWriteFile ((
81e0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
81f0: 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  NDLE,LPCVOID,DWO
8200: 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20  RD,LPDWORD, \.  
8210: 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50 50        LPOVERLAPP
8220: 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31 5d  ED))aSyscall[61]
8230: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
8240: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
8250: 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e 74    { "CreateEvent
8260: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 28  ExW",          (
8270: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45 76  SYSCALL)CreateEv
8280: 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20 20  entExW,         
8290: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
82a0: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
82b0: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
82c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
82e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
82f0: 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74 45  e osCreateEventE
8300: 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41  xW ((HANDLE(WINA
8310: 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f  PI*)(LPSECURITY_
8320: 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57 53  ATTRIBUTES,LPCWS
8330: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  TR, \.        DW
8340: 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63  ORD,DWORD))aSysc
8350: 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e 74  all[62].pCurrent
8360: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
8370: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61 69  S_WINRT.  { "Wai
8380: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8390: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
83a0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
83b0: 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65  ect,     0 },.#e
83c0: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
83d0: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
83e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8420: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 20  ForSingleObject 
8430: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
8440: 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20  (HANDLE, \.     
8450: 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61     DWORD))aSysca
8460: 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74 29  ll[63].pCurrent)
8470: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
8480: 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69 74  _WINCE.  { "Wait
8490: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
84a0: 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29 57  x",   (SYSCALL)W
84b0: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
84c0: 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  ctEx,   0 },.#el
84d0: 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  se.  { "WaitForS
84e0: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
84f0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8520: 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74 46  .#define osWaitF
8530: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
8540: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8550: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20  )(HANDLE,DWORD, 
8560: 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29 29  \.        BOOL))
8570: 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43 75  aSyscall[64].pCu
8580: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8590: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
85a0: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  "SetFilePointerE
85b0: 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  x",        (SYSC
85c0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
85d0: 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20 7d  erEx,        0 }
85e0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
85f0: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
8600: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8610: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8620: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8630: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8640: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
8650: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
8660: 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49 4e  (HANDLE,LARGE_IN
8670: 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20 20  TEGER, \.       
8680: 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c   PLARGE_INTEGER,
8690: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
86a0: 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  65].pCurrent)..#
86b0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
86c0: 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49  RT.  { "GetFileI
86d0: 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
86e0: 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29  leEx", (SYSCALL)
86f0: 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
8700: 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30 20  onByHandleEx, 0 
8710: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65  },.#else.  { "Ge
8720: 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e  tFileInformation
8730: 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53 59  ByHandleEx", (SY
8740: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8750: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8760: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8770: 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
8780: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28 28  ionByHandleEx ((
8790: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
87a0: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
87b0: 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e  FILE_INFO_BY_HAN
87c0: 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49 44  DLE_CLASS,LPVOID
87d0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
87e0: 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [66].pCurrent)..
87f0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8800: 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64  NRT && (!defined
8810: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
8820: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
8830: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b  MMAP_SIZE>0).  {
8840: 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46   "MapViewOfFileF
8850: 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59 53  romApp",    (SYS
8860: 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46 69  CALL)MapViewOfFi
8870: 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30 20  leFromApp,    0 
8880: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61  },.#else.  { "Ma
8890: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
88a0: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
88b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
88c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
88d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
88e0: 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  sMapViewOfFileFr
88f0: 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28 57  omApp ((LPVOID(W
8900: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 55  INAPI*)(HANDLE,U
8910: 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a  LONG,ULONG64, \.
8920: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
8930: 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43 75  aSyscall[67].pCu
8940: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8960: 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20 20  "CreateFile2",  
8970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
8980: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32 2c  ALL)CreateFile2,
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
89a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
89b0: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
89c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
89d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
89e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
89f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8a00: 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48 41  CreateFile2 ((HA
8a10: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
8a20: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
8a30: 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  D,DWORD, \.     
8a40: 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45 32     LPCREATEFILE2
8a50: 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45  _EXTENDED_PARAME
8a60: 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b 36  TERS))aSyscall[6
8a70: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
8a80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
8a90: 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  T && !defined(SQ
8aa0: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
8ab0: 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c  XTENSION).  { "L
8ac0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
8ad0: 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ry",     (SYSCAL
8ae0: 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69  L)LoadPackagedLi
8af0: 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c 0a  brary,     0 },.
8b00: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 50  #else.  { "LoadP
8b10: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
8b20: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
8b50: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
8b60: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
8b70: 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41  y ((HMODULE(WINA
8b80: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c 0a  PI*)(LPCWSTR, \.
8b90: 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61          DWORD))a
8ba0: 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75 72  Syscall[69].pCur
8bb0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
8bc0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
8bd0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c  GetTickCount64",
8be0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
8bf0: 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74 36  LL)GetTickCount6
8c00: 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  4,          0 },
8c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54  .#else.  { "GetT
8c20: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
8c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
8c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
8c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
8c70: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28 28  etTickCount64 ((
8c80: 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50 49  ULONGLONG(WINAPI
8c90: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
8ca0: 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[70].pCurrent).
8cb0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8cc0: 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61 74  INRT.  { "GetNat
8cd0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  iveSystemInfo", 
8ce0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8cf0: 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f  NativeSystemInfo
8d00: 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ,     0 },.#else
8d10: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
8d20: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
8d30: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8d60: 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74 69  define osGetNati
8d70: 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  veSystemInfo ((V
8d80: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a  OID(WINAPI*)( \.
8d90: 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d          LPSYSTEM
8da0: 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c 5b  _INFO))aSyscall[
8db0: 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  71].pCurrent)..#
8dc0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
8dd0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
8de0: 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62  ).  { "OutputDeb
8df0: 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20 20  ugStringA",     
8e00: 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75 74   (SYSCALL)Output
8e10: 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20 20  DebugStringA,   
8e20: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8e30: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
8e40: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8e50: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8e70: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8e80: 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62 75  ine osOutputDebu
8e90: 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44 28  gStringA ((VOID(
8ea0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
8eb0: 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70 43  )aSyscall[72].pC
8ec0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
8ed0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
8ee0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
8ef0: 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  "OutputDebugStri
8f00: 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngW",      (SYSC
8f10: 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53  ALL)OutputDebugS
8f20: 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20 7d  tringW,      0 }
8f30: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74  ,.#else.  { "Out
8f40: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8f50: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8f60: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8f70: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8f80: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8f90: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8fa0: 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  gW ((VOID(WINAPI
8fb0: 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79 73  *)(LPCWSTR))aSys
8fc0: 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65 6e  call[73].pCurren
8fd0: 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f 63  t)..  { "GetProc
8fe0: 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20 20  essHeap",       
8ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50     (SYSCALL)GetP
9000: 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20 20  rocessHeap,     
9010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
9020: 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48  ne osGetProcessH
9030: 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  eap ((HANDLE(WIN
9040: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
9050: 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65 6e  call[74].pCurren
9060: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
9070: 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65 66  S_WINRT && (!def
9080: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
9090: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
90a0: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
90b0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
90c0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c  MappingFromApp",
90d0: 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65   (SYSCALL)Create
90e0: 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41  FileMappingFromA
90f0: 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  pp, 0 },.#else. 
9100: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61   { "CreateFileMa
9110: 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28  ppingFromApp", (
9120: 53 59 53 43 41 4c 4c 29 30 2c 20 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: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
9150: 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c  fine osCreateFil
9160: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 20  eMappingFromApp 
9170: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
9180: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
9190: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
91a0: 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47 2c  TTRIBUTES,ULONG,
91b0: 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52 29  ULONG64,LPCWSTR)
91c0: 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70 43  )aSyscall[75].pC
91d0: 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e  urrent)../*.** N
91e0: 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75 62  OTE: On some sub
91f0: 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65 20  -platforms, the 
9200: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
9210: 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e 63  reExchange "func
9220: 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20 69  tion".**       i
9230: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
9240: 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73 20  macro that uses 
9250: 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72 69  a compiler intri
9260: 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29 2e  nsic (e.g. x64).
9270: 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f 20  .**       So do 
9280: 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65 20  not try to make 
9290: 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20 72  this is into a r
92a0: 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65 72  edefinable inter
92b0: 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  face..*/.#if def
92c0: 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64  ined(Interlocked
92d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29  CompareExchange)
92e0: 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65  .  { "Interlocke
92f0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9300: 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20  ", (SYSCALL)0,  
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9320: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
9330: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
9340: 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e 74  pareExchange Int
9350: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
9360: 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20 20  xchange.#else.  
9370: 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f  { "InterlockedCo
9380: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20  mpareExchange", 
9390: 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c 6f  (SYSCALL)Interlo
93a0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
93b0: 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69  nge, 0 },..#defi
93c0: 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64  ne osInterlocked
93d0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20  CompareExchange 
93e0: 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28  ((LONG(WINAPI*)(
93f0: 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20 53  LONG \.        S
9400: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
9410: 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47  TILE*, LONG,LONG
9420: 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e 70  ))aSyscall[76].p
9430: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 20  Current).#endif 
9440: 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65 72  /* defined(Inter
9450: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
9460: 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20 21  hange) */..#if !
9470: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
9480: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
9490: 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49  NRT && SQLITE_WI
94a0: 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b  N32_USE_UUID.  {
94b0: 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20 20   "UuidCreate",  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
94d0: 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74 65  SCALL)UuidCreate
94e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
94f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 75  },.#else.  { "Uu
9500: 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  idCreate",      
9510: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9520: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
9530: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
9540: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
9550: 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52 50  sUuidCreate ((RP
9560: 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54  C_STATUS(RPC_ENT
9570: 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73  RY*)(UUID*))aSys
9580: 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65 6e  call[77].pCurren
9590: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
95a0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
95b0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
95c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
95d0: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
95e0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 22  reateSequential"
95f0: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55  ,     (SYSCALL)U
9600: 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e 74  uidCreateSequent
9610: 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ial,   0 },.#els
9620: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
9630: 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20  eSequential",   
9640: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
9670: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
9680: 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20 5c  eateSequential \
9690: 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f 53  .        ((RPC_S
96a0: 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a  TATUS(RPC_ENTRY*
96b0: 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c  )(UUID*))aSyscal
96c0: 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[78].pCurrent).
96d0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
96e0: 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26 26  LITE_NO_SYNC) &&
96f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
9700: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c 75  _SIZE>0.  { "Flu
9710: 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  shViewOfFile",  
9720: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
9730: 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  )FlushViewOfFile
9740: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
9750: 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56 69  lse.  { "FlushVi
9760: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
9770: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (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 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
97a0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75 73  ..#define osFlus
97b0: 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20 20  hViewOfFile \.  
97c0: 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49 4e        ((BOOL(WIN
97d0: 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53 49  API*)(LPCVOID,SI
97e0: 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 37  ZE_T))aSyscall[7
97f0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d 3b  9].pCurrent)..};
9800: 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f   /* End of the o
9810: 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74  verrideable syst
9820: 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a  em calls */../*.
9830: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
9840: 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20  SetSystemCall() 
9850: 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65  method of sqlite
9860: 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66  3_vfs for all of
9870: 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22 20   the.** "win32" 
9880: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
9890: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
98a0: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
98b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
98c0: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
98d0: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
98e0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
98f0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
9900: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
9910: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
9920: 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74 53  atic int winSetS
9930: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
9940: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
9950: 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ed,        /* Th
9960: 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20  e VFS pointer.  
9970: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f  Not used */.  co
9980: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
9990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
99a0: 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61  ame of system ca
99b0: 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a  ll to override *
99c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
99d0: 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63  all_ptr pNewFunc
99e0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
99f0: 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  new system call 
9a00: 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e  value */.){.  un
9a10: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
9a20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
9a30: 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55  NOTFOUND;..  UNU
9a40: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9a50: 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a  otUsed);.  if( z
9a60: 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
9a70: 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73  * If no zName is
9a80: 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20   given, restore 
9a90: 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  all system calls
9aa0: 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c   to their defaul
9ab0: 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67  t.    ** setting
9ac0: 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c  s and return NUL
9ad0: 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  L.    */.    rc 
9ae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9af0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
9b00: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
9b10: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
9b20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9b30: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
9b40: 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20  efault ){.      
9b50: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
9b60: 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c  urrent = aSyscal
9b70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20  l[i].pDefault;. 
9b80: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
9b90: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
9ba0: 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69  zName is specifi
9bb0: 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f  ed, operate on o
9bc0: 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74  nly the one syst
9bd0: 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  em call.    ** s
9be0: 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f  pecified..    */
9bf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
9c00: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
9c10: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
9c20: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
9c30: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
9c40: 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  me, aSyscall[i].
9c50: 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
9c60: 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c       if( aSyscal
9c70: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30  l[i].pDefault==0
9c80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53   ){.          aS
9c90: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9ca0: 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  lt = aSyscall[i]
9cb0: 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20  .pCurrent;.     
9cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
9cd0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
9ce0: 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e       if( pNewFun
9cf0: 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20  c==0 ) pNewFunc 
9d00: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
9d10: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  efault;.        
9d20: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
9d30: 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b  rent = pNewFunc;
9d40: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9d60: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
9d80: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79  he value of a sy
9d90: 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75  stem call.  Retu
9da0: 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65  rn NULL if zName
9db0: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63   is not a.** rec
9dc0: 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63  ognized system c
9dd0: 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20  all name.  NULL 
9de0: 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
9df0: 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63   if the system c
9e00: 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  all.** is curren
9e10: 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a  tly undefined..*
9e20: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
9e30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69 6e  _syscall_ptr win
9e40: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
9e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
9e60: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
9e70: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
9e80: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
9e90: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
9ea0: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
9eb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9ec0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9ed0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9ee0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
9ef0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
9f00: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
9f10: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
9f20: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9f30: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
9f40: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
9f50: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
9f60: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
9f70: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
9f80: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
9f90: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
9fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
9fb0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
9fc0: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
9fd0: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
9fe0: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
9ff0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
a000: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
a010: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
a020: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
a030: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a040: 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65 6d  r *winNextSystem
a050: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
a060: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
a070: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
a080: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
a090: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
a0a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
a0b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
a0c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
a0d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
a0e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
a0f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
a100: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
a110: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
a120: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
a130: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
a140: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
a150: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
a160: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
a170: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
a180: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
a190: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
a1a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a  WIN32_MALLOC./*.
a1b0: 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e 61  ** If a Win32 na
a1c0: 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62 65  tive heap has be
a1d0: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 74  en configured, t
a1e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
a1f0: 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  l attempt to.** 
a200: 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70 6f  compact it.  Upo
a210: 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
a220: 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65 74  E_OK will be ret
a230: 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61 69  urned.  Upon fai
a240: 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20  lure, one.** of 
a250: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51  SQLITE_NOMEM, SQ
a260: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20 53  LITE_ERROR, or S
a270: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 77  QLITE_NOTFOUND w
a280: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
a290: 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72 67    The.** "pnLarg
a2a0: 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20 69  est" argument, i
a2b0: 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c  f non-zero, will
a2c0: 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74 75   be used to retu
a2d0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
a2e0: 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63 6f  he.** largest co
a2f0: 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c 6f  mmitted free blo
a300: 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c 20  ck in the heap, 
a310: 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74  in bytes..*/.int
a320: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 63   sqlite3_win32_c
a330: 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55 49  ompact_heap(LPUI
a340: 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a 20  NT pnLargest){. 
a350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a360: 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61 72  _OK;.  UINT nLar
a370: 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e 44  gest = 0;.  HAND
a380: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
a390: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
a3a0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
a3b0: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
a3c0: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
a3d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
a3e0: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
a3f0: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
a400: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
a410: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
a420: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
a430: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
a440: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
a450: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
a460: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
a470: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
a480: 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  if.#if !SQLITE_O
a490: 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
a4a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
a4b0: 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48 65  ( (nLargest=osHe
a4c0: 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70 2c  apCompact(hHeap,
a4d0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
a4e0: 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29 7b  AP_FLAGS))==0 ){
a4f0: 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
a500: 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
a510: 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66 28  Error();.    if(
a520: 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45   lastErrno==NO_E
a530: 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73 71  RROR ){.      sq
a540: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
a550: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
a560: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
a570: 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70 3d  no space), heap=
a580: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a590: 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48         (void*)hH
a5a0: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
a5b0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
a5c0: 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
a5d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
a5e0: 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22  (SQLITE_ERROR, "
a5f0: 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f  failed to HeapCo
a600: 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65 61  mpact (%lu), hea
a610: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
a620: 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61           osGetLa
a630: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
a640: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20 20  *)hHeap);.      
a650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
a660: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  R;.    }.  }.#el
a670: 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  se.  sqlite3_log
a680: 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  (SQLITE_NOTFOUND
a690: 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61  , "failed to Hea
a6a0: 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d 25  pCompact, heap=%
a6b0: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
a6c0: 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b    (void*)hHeap);
a6d0: 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  .  rc = SQLITE_N
a6e0: 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66 0a  OTFOUND;.#endif.
a6f0: 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74 20    if( pnLargest 
a700: 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20 6e  ) *pnLargest = n
a710: 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75 72  Largest;.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
a730: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
a740: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
a750: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
a760: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
a770: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73 74  tempt to.** dest
a780: 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65  roy and recreate
a790: 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69 6e   it.  If the Win
a7a0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 69  32 native heap i
a7b0: 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20 61  s not isolated a
a7c0: 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71 6c  nd/or.** the sql
a7d0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a7e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  () function does
a7f0: 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72 6f   not return zero
a800: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 69  , SQLITE_BUSY wi
a810: 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e 65  ll.** be returne
a820: 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65 73  d and no changes
a830: 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
a840: 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76   the Win32 nativ
a850: 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73  e heap..*/.int s
a860: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65 73  qlite3_win32_res
a870: 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e 74  et_heap(){.  int
a880: 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47   rc;.  MUTEX_LOG
a890: 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
a8a0: 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f 2a  x *pMaster; ) /*
a8b0: 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69 63   The main static
a8c0: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a8d0: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
a8e0: 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29 20  _mutex *pMem; ) 
a8f0: 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79 73     /* The memsys
a900: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a910: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a920: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a930: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a940: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a950: 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54  MASTER); ).  MUT
a960: 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d  EX_LOGIC( pMem =
a970: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
a980: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a990: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
a9a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
a9c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a9d0: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  wi
a9e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a9f0: 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
aa00: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
aa10: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
aa20: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
aa30: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
aa40: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
aa50: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
aa60: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
aa70: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
aa80: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
aa90: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
aaa0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
aab0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
aac0: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
aad0: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
aae0: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
aaf0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
ab00: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
ab10: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
ab20: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
ab30: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
ab40: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
ab50: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
ab60: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
ab70: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
ab80: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
ab90: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
aba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
abb0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
abc0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
abd0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
abe0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
abf0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac00: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
ac10: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
ac20: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
ac30: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
ac40: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
ac50: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
ac60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
ac70: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
ac80: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ac90: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
aca0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
acb0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
acc0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
acd0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
ace0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
acf0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
ad00: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
ad10: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
ad20: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
ad30: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
ad40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ad50: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
ad60: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
ad70: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
ad80: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
ad90: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
ada0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
adb0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
adc0: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
add0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
ade0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
adf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ae00: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
ae10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ae20: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
ae30: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
ae40: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
ae50: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
ae60: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
ae70: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
ae80: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
ae90: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
aea0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
aeb0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
aec0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
aed0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
aee0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
aef0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
af00: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
af10: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
af20: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
af30: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
af40: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
af50: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
af60: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
af70: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
af80: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
af90: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
afa0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
afb0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
afc0: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
afd0: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
afe0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
aff0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
b000: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
b010: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
b020: 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 28  ( !zBuf ){.    (
b030: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
b040: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
b050: 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  urn;.  }.#endif.
b060: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
b070: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
b080: 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20  I).  if( nMin>0 
b090: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 44  ){.    memset(zD
b0a0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
b0b0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
b0c0: 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  IZE);.    memcpy
b0d0: 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c 20  (zDbgBuf, zBuf, 
b0e0: 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74  nMin);.    osOut
b0f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 28  putDebugStringA(
b100: 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73  zDbgBuf);.  }els
b110: 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74 44  e{.    osOutputD
b120: 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75 66  ebugStringA(zBuf
b130: 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65 66  );.  }.#elif def
b140: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
b150: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d 65  2_HAS_WIDE).  me
b160: 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c  mset(zDbgBuf, 0,
b170: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
b180: 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69  G_BUF_SIZE);.  i
b190: 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65 54  f ( osMultiByteT
b1a0: 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20 20  oWideChar(.     
b1b0: 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41 70       osAreFileAp
b1c0: 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43  isANSI() ? CP_AC
b1d0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c  P : CP_OEMCP, 0,
b1e0: 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20   zBuf,.         
b1f0: 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a   nMin, (LPWSTR)z
b200: 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f 57  DbgBuf, SQLITE_W
b210: 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a  IN32_DBG_BUF_SIZ
b220: 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29 29  E/sizeof(WCHAR))
b230: 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  <=0 ){.    retur
b240: 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75  n;.  }.  osOutpu
b250: 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28 4c  tDebugStringW((L
b260: 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29 3b  PCWSTR)zDbgBuf);
b270: 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69  .#else.  if( nMi
b280: 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  n>0 ){.    memse
b290: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
b2a0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
b2b0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65  UF_SIZE);.    me
b2c0: 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a 42  mcpy(zDbgBuf, zB
b2d0: 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66  uf, nMin);.    f
b2e0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
b2f0: 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20  %s", zDbgBuf);. 
b300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
b310: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
b320: 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e  , zBuf);.  }.#en
b330: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
b340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
b350: 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65 20  ne suspends the 
b360: 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 66  current thread f
b370: 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a  or at least ms.*
b380: 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20  * milliseconds. 
b390: 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61 6c   This is equival
b3a0: 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33 32  ent to the Win32
b3b0: 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66 61   Sleep() interfa
b3c0: 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ce..*/.#if SQLIT
b3d0: 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74 69  E_OS_WINRT.stati
b3e0: 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62  c HANDLE sleepOb
b3f0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  j = NULL;.#endif
b400: 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77  ..void sqlite3_w
b410: 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52 44  in32_sleep(DWORD
b420: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a   milliseconds){.
b430: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
b440: 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65 70  NRT.  if ( sleep
b450: 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Obj==NULL ){.   
b460: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72   sleepObj = osCr
b470: 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55 4c  eateEventExW(NUL
b480: 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f  L, NULL, CREATE_
b490: 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53  EVENT_MANUAL_RES
b4a0: 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ET,.            
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4c0: 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29      SYNCHRONIZE)
b4d0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b4e0: 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
b4f0: 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69 6e  ;.  osWaitForSin
b500: 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65 65  gleObjectEx(slee
b510: 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e  pObj, millisecon
b520: 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73  ds, FALSE);.#els
b530: 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c  e.  osSleep(mill
b540: 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69  iseconds);.#endi
b550: 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
b560: 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
b570: 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45 5f  DS>0 && !SQLITE_
b580: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
b590: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b5a0: 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  \.        SQLITE
b5b0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44 57  _THREADSAFE>0.DW
b5c0: 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33 32  ORD sqlite3Win32
b5d0: 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a  Wait(HANDLE hObj
b5e0: 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72 63  ect){.  DWORD rc
b5f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d  ;.  while( (rc =
b600: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
b610: 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63 74  ObjectEx(hObject
b620: 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20  , 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 54 52 55 45 29 29 3d 3d 57 41 49 54 5f     TRUE))==WAIT_
b660: 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b  IO_COMPLETION ){
b670: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
b680: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
b690: 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d  eturn true (non-
b6a0: 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65 20  zero) if we are 
b6b0: 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69  running under Wi
b6c0: 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58  nNT, Win2K, WinX
b6d0: 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20  P,.** or WinCE. 
b6e0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
b6f0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
b700: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
b710: 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 61  .**.** Here is a
b720: 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f 62  n interesting ob
b730: 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39  servation:  Win9
b740: 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57 69  5, Win98, and Wi
b750: 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20  nME lack.** the 
b760: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
b770: 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73 74  .  But we can st
b780: 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20 6c  ill statically l
b790: 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61 74  ink against that
b7a0: 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67 20  .** API as long 
b7b0: 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c  as we don't call
b7c0: 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67   it when running
b7d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41   Win95/98/ME.  A
b7e0: 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73   call to.** this
b7f0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
b800: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
b810: 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69 6e   the host is Win
b820: 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57  95/98/ME or.** W
b830: 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68  inNT/2K/XP so th
b840: 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20  at we will know 
b850: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 77  whether or not w
b860: 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61 6c  e can safely cal
b870: 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  l.** the LockFil
b880: 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23  eEx() API..*/..#
b890: 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33 32  if !SQLITE_WIN32
b8a0: 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23 20  _GETVERSIONEX.# 
b8b0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b8c0: 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49 54   (1).#elif SQLIT
b8d0: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51  E_OS_WINCE || SQ
b8e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c  LITE_OS_WINRT ||
b8f0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b900: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
b910: 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54  .# define osIsNT
b920: 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21 64  ()  (1).#elif !d
b930: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b940: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23 20  N32_HAS_WIDE).# 
b950: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b960: 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65 66   (0).#else.# def
b970: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 28  ine osIsNT()  ((
b980: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d  sqlite3_os_type=
b990: 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77  =2) || sqlite3_w
b9a0: 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65  in32_is_nt()).#e
b9b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
b9c0: 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d   function determ
b9d0: 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63 68  ines if the mach
b9e0: 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ine is running a
b9f0: 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64   version of Wind
ba00: 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20  ows.** based on 
ba10: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a  the NT kernel..*
ba20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
ba30: 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b  n32_is_nt(void){
ba40: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
ba50: 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e  INRT.  /*.  ** N
ba60: 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20 73  OTE: The WinRT s
ba70: 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20 61  ub-platform is a
ba80: 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f  lways assumed to
ba90: 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65   be based on the
baa0: 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b   NT.  **       k
bab0: 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65  ernel..  */.  re
bac0: 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51  turn 1;.#elif SQ
bad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45  LITE_WIN32_GETVE
bae0: 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73  RSIONEX.  if( os
baf0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bb00: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bb10: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20  te3_os_type, 0, 
bb20: 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66  0)==0 ){.#if def
bb30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bb40: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20 20  2_HAS_ANSI).    
bb50: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73  OSVERSIONINFOA s
bb60: 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e  Info;.    sInfo.
bb70: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
bb80: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
bb90: 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65  fo);.    osGetVe
bba0: 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29  rsionExA(&sInfo)
bbb0: 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63  ;.    osInterloc
bbc0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
bbd0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
bbe0: 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49  ype,.        (sI
bbf0: 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64  nfo.dwPlatformId
bc00: 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d   == VER_PLATFORM
bc10: 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a  _WIN32_NT) ? 2 :
bc20: 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64 65   1, 0);.#elif de
bc30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
bc40: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
bc50: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20   OSVERSIONINFOW 
bc60: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
bc70: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
bc80: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
bc90: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
bca0: 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f  ersionExW(&sInfo
bcb0: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
bcc0: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
bcd0: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
bce0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
bcf0: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
bd00: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
bd10: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
bd20: 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  : 1, 0);.#endif.
bd30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 49    }.  return osI
bd40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
bd50: 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74  eExchange(&sqlit
bd60: 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32  e3_os_type, 2, 2
bd70: 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49  )==2;.#elif SQLI
bd80: 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  TE_TEST.  return
bd90: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
bda0: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73  mpareExchange(&s
bdb0: 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20  qlite3_os_type, 
bdc0: 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a  2, 2)==2;.#else.
bdd0: 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20    /*.  ** NOTE: 
bde0: 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d  All sub-platform
bdf0: 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74 56  s where the GetV
be00: 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e  ersionEx[AW] fun
be10: 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20  ctions are.  ** 
be20: 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65 64        deprecated
be30: 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73 75   are always assu
be40: 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64 20  med to be based 
be50: 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c  on the NT kernel
be60: 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
be70: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  1;.#endif.}..#if
be80: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
be90: 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c  _MALLOC./*.** Al
bea0: 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f 66  locate nBytes of
beb0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
bec0: 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d  ic void *winMemM
bed0: 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65 73  alloc(int nBytes
bee0: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bef0: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
bf00: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bf10: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bf20: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bf30: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bf40: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bf50: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bf60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bf70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bf80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bf90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bfa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bfb0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bfc0: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bfd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bfe0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
bff0: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
c000: 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20   nBytes>=0 );.  
c010: 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28  p = osHeapAlloc(
c020: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c030: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c040: 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b  (SIZE_T)nBytes);
c050: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
c060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c070: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
c080: 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20  ed to HeapAlloc 
c090: 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20  %u bytes (%lu), 
c0a0: 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20  heap=%p",.      
c0b0: 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 73            nBytes
c0c0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c0d0: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c0e0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
c0f0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  p;.}../*.** Free
c100: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
c110: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72  ic void winMemFr
c120: 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29  ee(void *pPrior)
c130: 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70  {.  HANDLE hHeap
c140: 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65 72  ;..  winMemAsser
c150: 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65 61  tMagic();.  hHea
c160: 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  p = winMemGetHea
c170: 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  p();.  assert( h
c180: 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  Heap!=0 );.  ass
c190: 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56 41  ert( hHeap!=INVA
c1a0: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
c1b0: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
c1c0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
c1d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
c1e0: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
c1f0: 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65  ).  assert( osHe
c200: 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61 70  apValidate(hHeap
c210: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
c220: 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f  EAP_FLAGS, pPrio
c230: 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  r) );.#endif.  i
c240: 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65 74  f( !pPrior ) ret
c250: 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20  urn; /* Passing 
c260: 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65 65  NULL to HeapFree
c270: 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a   is undefined. *
c280: 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70 46  /.  if( !osHeapF
c290: 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ree(hHeap, SQLIT
c2a0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c2b0: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a 20  GS, pPrior) ){. 
c2c0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c2d0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c2e0: 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65 65  iled to HeapFree
c2f0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c300: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c310: 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69 6f             pPrio
c320: 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  r, osGetLastErro
c330: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
c340: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
c350: 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65   Change the size
c360: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
c370: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
c380: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
c390: 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28   *winMemRealloc(
c3a0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e  void *pPrior, in
c3b0: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
c3c0: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
c3d0: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
c3e0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
c3f0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
c400: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
c410: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
c420: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c430: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
c440: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
c450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
c460: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
c470: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
c480: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
c490: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
c4a0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c4b0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
c4c0: 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66  Prior) );.#endif
c4d0: 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65  .  assert( nByte
c4e0: 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  s>=0 );.  if( !p
c4f0: 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d  Prior ){.    p =
c500: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
c510: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c520: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
c530: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
c540: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f  }else{.    p = o
c550: 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48 65  sHeapReAlloc(hHe
c560: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c570: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
c580: 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  ior, (SIZE_T)nBy
c590: 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  tes);.  }.  if( 
c5a0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
c5b0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
c5c0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 25  EM, "failed to %
c5d0: 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29  s %u bytes (%lu)
c5e0: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c5f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c600: 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f  or ? "HeapReAllo
c610: 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22  c" : "HeapAlloc"
c620: 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c  , nBytes, osGetL
c630: 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
c640: 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
c650: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
c660: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
c670: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
c680: 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74 61  ize of an outsta
c690: 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e  nding allocation
c6a0: 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  , in bytes..*/.s
c6b0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d  tatic int winMem
c6c0: 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20  Size(void *p){. 
c6d0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20   HANDLE hHeap;. 
c6e0: 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69   SIZE_T n;..  wi
c6f0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
c700: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
c710: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
c720: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
c730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
c740: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
c750: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
c760: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c770: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
c780: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
c790: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
c7a0: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
c7b0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
c7c0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c7d0: 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69 66  GS, p) );.#endif
c7e0: 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75  .  if( !p ) retu
c7f0: 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65  rn 0;.  n = osHe
c800: 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53 51  apSize(hHeap, SQ
c810: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c820: 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66 28  FLAGS, p);.  if(
c830: 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29   n==(SIZE_T)-1 )
c840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
c850: 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20  g(SQLITE_NOMEM, 
c860: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 53  "failed to HeapS
c870: 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c  ize block %p (%l
c880: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
c890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2c                p,
c8a0: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
c8b0: 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29  ), (void*)hHeap)
c8c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
c8d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
c8e0: 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  t)n;.}../*.** Ro
c8f0: 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73 74  und up a request
c900: 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65 78   size to the nex
c910: 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69  t valid allocati
c920: 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  on size..*/.stat
c930: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
c940: 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72  ndup(int n){.  r
c950: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
c960: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
c970: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c980: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
c990: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
c9a0: 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61  a){.  winMemData
c9b0: 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20   *pWinMemData = 
c9c0: 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41  (winMemData *)pA
c9d0: 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 21  ppData;..  if( !
c9e0: 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72 65  pWinMemData ) re
c9f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
ca00: 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  R;.  assert( pWi
ca10: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31  nMemData->magic1
ca20: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
ca30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 69  );.  assert( pWi
ca40: 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32  nMemData->magic2
ca50: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  ==WINMEM_MAGIC2 
ca60: 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  );..#if !SQLITE_
ca70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
ca80: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
ca90: 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69 6e  EATE.  if( !pWin
caa0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29  MemData->hHeap )
cab0: 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49 6e  {.    DWORD dwIn
cac0: 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49  itialSize = SQLI
cad0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e  TE_WIN32_HEAP_IN
cae0: 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f  IT_SIZE;.    DWO
caf0: 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65  RD dwMaximumSize
cb00: 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74 65   = (DWORD)sqlite
cb10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
cb20: 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77 4d  eap;.    if( dwM
cb30: 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b  aximumSize==0 ){
cb40: 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d  .      dwMaximum
cb50: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49  Size = SQLITE_WI
cb60: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
cb70: 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  E;.    }else if(
cb80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64   dwInitialSize>d
cb90: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a  wMaximumSize ){.
cba0: 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c 53        dwInitialS
cbb0: 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53  ize = dwMaximumS
cbc0: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ize;.    }.    p
cbd0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cbe0: 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74 65  p = osHeapCreate
cbf0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45  (SQLITE_WIN32_HE
cc00: 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20  AP_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: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64  dwInitialSize, d
cc40: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20  wMaximumSize);. 
cc50: 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44     if( !pWinMemD
cc60: 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20  ata->hHeap ){.  
cc70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
cc80: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20  SQLITE_NOMEM,.  
cc90: 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20          "failed 
cca0: 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28 25  to HeapCreate (%
ccb0: 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69  lu), flags=%u, i
ccc0: 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78  nitSize=%lu, max
ccd0: 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20  Size=%lu",.     
cce0: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
ccf0: 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57 49  ror(), SQLITE_WI
cd00: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
cd10: 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20  dwInitialSize,. 
cd20: 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69 6d           dwMaxim
cd30: 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72  umSize);.      r
cd40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
cd50: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
cd60: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
cd70: 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20  bOwned = TRUE;. 
cd80: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d     assert( pWinM
cd90: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
cda0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57  ;.  }.#else.  pW
cdb0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdc0: 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73 48   = osGetProcessH
cdd0: 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70 57  eap();.  if( !pW
cde0: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cdf0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
ce00: 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  log(SQLITE_NOMEM
ce10: 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c 65  ,.        "faile
ce20: 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73 48  d to GetProcessH
ce30: 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47 65  eap (%lu)", osGe
ce40: 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a 20  tLastError());. 
ce50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
ce60: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
ce70: 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  .  pWinMemData->
ce80: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
ce90: 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d    assert( !pWinM
cea0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29  emData->bOwned )
ceb0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
cec0: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
ced0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
cee0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
cef0: 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49  a->hHeap!=INVALI
cf00: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
cf10: 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ;.#if !SQLITE_OS
cf20: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
cf30: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  d(SQLITE_WIN32_M
cf40: 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a  ALLOC_VALIDATE).
cf50: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cf60: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
cf70: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
cf80: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
cf90: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
cfa0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
cfb0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cfc0: 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20  ** Deinitialize 
cfd0: 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  this module..*/.
cfe0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
cff0: 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20  emShutdown(void 
d000: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
d010: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
d020: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
d030: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
d040: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
d050: 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ata ) return;.  
d060: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d070: 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e  ata->magic1==WIN
d080: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20  MEM_MAGIC1 );.  
d090: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
d0a0: 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e  ata->magic2==WIN
d0b0: 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20  MEM_MAGIC2 );.. 
d0c0: 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61   if( pWinMemData
d0d0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61  ->hHeap ){.    a
d0e0: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
d0f0: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
d100: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
d110: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
d120: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
d130: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
d140: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
d150: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73 48  .    assert( osH
d160: 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e  eapValidate(pWin
d170: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20  MemData->hHeap, 
d180: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
d190: 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29  P_FLAGS, NULL) )
d1a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
d1b0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
d1c0: 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66  wned ){.      if
d1d0: 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79  ( !osHeapDestroy
d1e0: 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  (pWinMemData->hH
d1f0: 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eap) ){.        
d200: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
d210: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
d220: 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79  d to HeapDestroy
d230: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
d240: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
d250: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
d260: 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70  rror(), (void*)p
d270: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
d280: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
d290: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62    pWinMemData->b
d2a0: 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  Owned = FALSE;. 
d2b0: 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d     }.    pWinMem
d2c0: 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55  Data->hHeap = NU
d2d0: 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
d2e0: 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f   Populate the lo
d2f0: 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61  w-level memory a
d300: 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69  llocation functi
d310: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a  on pointers in.*
d320: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
d330: 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69  onfig.m with poi
d340: 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75  nters to the rou
d350: 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69  tines in this fi
d360: 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d  le. The.** argum
d370: 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68 65  ents specify the
d380: 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79   block of memory
d390: 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a   to manage..**.*
d3a0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
d3b0: 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  s only called by
d3c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d3d0: 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65  ), and therefore
d3e0: 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69  .** is not requi
d3f0: 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  red to be thread
d400: 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29  safe (it is not)
d410: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74  ..*/.const sqlit
d420: 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a  e3_mem_methods *
d430: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e  sqlite3MemGetWin
d440: 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  32(void){.  stat
d450: 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
d460: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e  _mem_methods win
d470: 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20  MemMethods = {. 
d480: 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c     winMemMalloc,
d490: 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c  .    winMemFree,
d4a0: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c  .    winMemReall
d4b0: 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69  oc,.    winMemSi
d4c0: 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f  ze,.    winMemRo
d4d0: 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65  undup,.    winMe
d4e0: 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65  mInit,.    winMe
d4f0: 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26  mShutdown,.    &
d500: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d  win_mem_data.  }
d510: 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d  ;.  return &winM
d520: 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f  emMethods;.}..vo
d530: 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74  id sqlite3MemSet
d540: 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20  Default(void){. 
d550: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
d560: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41  SQLITE_CONFIG_MA
d570: 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d  LLOC, sqlite3Mem
d580: 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23  GetWin32());.}.#
d590: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d5a0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a  WIN32_MALLOC */.
d5b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
d5c0: 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f   UTF-8 string to
d5d0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
d5e0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20  de..**.** Space 
d5f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75  to hold the retu
d600: 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f  rned string is o
d610: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
d620: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
d630: 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52 20  /.static LPWSTR 
d640: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
d650: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
d660: 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72  xt){.  int nChar
d670: 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65  ;.  LPWSTR zWide
d680: 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d  Text;..  nChar =
d690: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
d6a0: 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20  deChar(CP_UTF8, 
d6b0: 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55  0, zText, -1, NU
d6c0: 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 43  LL, 0);.  if( nC
d6d0: 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  har==0 ){.    re
d6e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57  turn 0;.  }.  zW
d6f0: 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74 65  ideText = sqlite
d700: 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68  3MallocZero( nCh
d710: 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ar*sizeof(WCHAR)
d720: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 54   );.  if( zWideT
d730: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d740: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43  turn 0;.  }.  nC
d750: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
d760: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
d770: 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d  TF8, 0, zText, -
d780: 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20 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 6e 43                nC
d7b0: 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68 61  har);.  if( nCha
d7c0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
d7d0: 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54 65  te3_free(zWideTe
d7e0: 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54 65  xt);.    zWideTe
d7f0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
d800: 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a  turn zWideText;.
d810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
d820: 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69   a Microsoft Uni
d830: 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20 55  code string to U
d840: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  TF-8..**.** Spac
d850: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d860: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d870: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d880: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d890: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
d8a0: 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66  *winUnicodeToUtf
d8b0: 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65 54  8(LPCWSTR zWideT
d8c0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  ext){.  int nByt
d8d0: 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  e;.  char *zText
d8e0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
d8f0: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d900: 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a  te(CP_UTF8, 0, z
d910: 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c  WideText, -1, 0,
d920: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28   0, 0, 0);.  if(
d930: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
d940: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d950: 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69 74  .  zText = sqlit
d960: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
d970: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54 65  yte );.  if( zTe
d980: 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  xt==0 ){.    ret
d990: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79  urn 0;.  }.  nBy
d9a0: 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72 54  te = osWideCharT
d9b0: 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55 54  oMultiByte(CP_UT
d9c0: 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74  F8, 0, zWideText
d9d0: 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79  , -1, zText, nBy
d9e0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
d9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da00: 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66 28      0, 0);.  if(
da10: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
da20: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
da30: 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78  zText);.    zTex
da40: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
da50: 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a  urn zText;.}../*
da60: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41  .** Convert an A
da70: 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  NSI string to Mi
da80: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c  crosoft Unicode,
da90: 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49 20   using the ANSI 
daa0: 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70  or OEM.** code p
dab0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  age..**.** Space
dac0: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
dad0: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
dae0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
daf0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
db00: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
db10: 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64   winMbcsToUnicod
db20: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
db30: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
db40: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
db50: 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54 65    LPWSTR zMbcsTe
db60: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  xt;.  int codepa
db70: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43  ge = useAnsi ? C
db80: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
db90: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d  ;..  nByte = osM
dba0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
dbb0: 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  ar(codepage, 0, 
dbc0: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  zText, -1, NULL,
dbd0: 0a 20 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 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52   0)*sizeof(WCHAR
dc00: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
dc10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc20: 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65  0;.  }.  zMbcsTe
dc30: 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  xt = sqlite3Mall
dc40: 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69  ocZero( nByte*si
dc50: 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20  zeof(WCHAR) );. 
dc60: 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d   if( zMbcsText==
dc70: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
dc80: 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d  0;.  }.  nByte =
dc90: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
dca0: 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65 2c  deChar(codepage,
dcb0: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a   0, zText, -1, z
dcc0: 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20 20  MbcsText,.      
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 6e 42 79 74 65 29            nByte)
dcf0: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
dd00: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dd10: 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29 3b  free(zMbcsText);
dd20: 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20 3d  .    zMbcsText =
dd30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
dd40: 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f   zMbcsText;.}../
dd50: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d  *.** Convert a M
dd60: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
dd70: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
dd80: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
dd90: 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69  r string,.** usi
dda0: 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20 4f  ng the ANSI or O
ddb0: 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  EM code page..**
ddc0: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
ddd0: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
dde0: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
ddf0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
de00: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
de10: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
de20: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54  odeToMbcs(LPCWST
de30: 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e 74  R zWideText, int
de40: 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74   useAnsi){.  int
de50: 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20 2a   nByte;.  char *
de60: 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64  zText;.  int cod
de70: 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20  epage = useAnsi 
de80: 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45  ? CP_ACP : CP_OE
de90: 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20  MCP;..  nByte = 
dea0: 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74  osWideCharToMult
deb0: 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c 20  iByte(codepage, 
dec0: 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d 31  0, zWideText, -1
ded0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
dee0: 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20   if( nByte == 0 
def0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
df00: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73  .  }.  zText = s
df10: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
df20: 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28  ( nByte );.  if(
df30: 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20   zText==0 ){.   
df40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
df50: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
df60: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
df70: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
df80: 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74  eText, -1, zText
df90: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfb0: 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a    nByte, 0, 0);.
dfc0: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
dfd0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
dfe0: 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20 20  free(zText);.   
dff0: 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a   zText = 0;.  }.
e000: 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a    return zText;.
e010: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
e020: 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63 68   a multi-byte ch
e030: 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20 74  aracter string t
e040: 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53  o UTF-8..**.** S
e050: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
e060: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
e070: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
e080: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
e090: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ()..*/.static ch
e0a0: 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66  ar *winMbcsToUtf
e0b0: 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  8(const char *zT
e0c0: 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69  ext, int useAnsi
e0d0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74  ){.  char *zText
e0e0: 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a  Utf8;.  LPWSTR z
e0f0: 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70  TmpWide;..  zTmp
e100: 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f  Wide = winMbcsTo
e110: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20 75  Unicode(zText, u
e120: 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a  seAnsi);.  if( z
e130: 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20  TmpWide==0 ){.  
e140: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e150: 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77 69    zTextUtf8 = wi
e160: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
e170: 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c 69  TmpWide);.  sqli
e180: 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64  te3_free(zTmpWid
e190: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65  e);.  return zTe
e1a0: 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xtUtf8;.}../*.**
e1b0: 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
e1c0: 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c   string to a mul
e1d0: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
e1e0: 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  r string..**.** 
e1f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
e200: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
e210: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
e220: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
e230: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
e240: 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62  har *winUtf8ToMb
e250: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e260: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
e270: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
e280: 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52 20  tMbcs;.  LPWSTR 
e290: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
e2a0: 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38 54  pWide = winUtf8T
e2b0: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b  oUnicode(zText);
e2c0: 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65 3d  .  if( zTmpWide=
e2d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
e2e0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d   0;.  }.  zTextM
e2f0: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  bcs = winUnicode
e300: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 2c  ToMbcs(zTmpWide,
e310: 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c   useAnsi);.  sql
e320: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
e330: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
e340: 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  extMbcs;.}../*.*
e350: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
e360: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
e370: 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  he winUtf8ToUnic
e380: 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  ode() function..
e390: 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74 65  */.LPWSTR sqlite
e3a0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
e3b0: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
e3c0: 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64  ar *zText){.#ifd
e3d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e3e0: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e3f0: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28   !zText ){.    (
e400: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e410: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e420: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e430: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e440: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e450: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e460: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e470: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e480: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 55  eturn winUtf8ToU
e490: 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d  nicode(zText);.}
e4a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e4b0: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
e4c0: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69 63   for the winUnic
e4d0: 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e 63  odeToUtf8() func
e4e0: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e4f0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69  qlite3_win32_uni
e500: 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43  code_to_utf8(LPC
e510: 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b  WSTR zWideText){
e520: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e530: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e540: 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78 74    if( !zWideText
e550: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e560: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e570: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e580: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e590: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e5a0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e5b0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e5c0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e5d0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e5e0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
e5f0: 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f  zWideText);.}../
e600: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e610: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e620: 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55  r the winMbcsToU
e630: 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  tf8() function..
e640: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e650: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
e660: 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tf8(const char *
e670: 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53  zText){.#ifdef S
e680: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e690: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e6a0: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e6b0: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e6c0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e6d0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e6e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e6f0: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e700: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e710: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e720: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e730: 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28  n winMbcsToUtf8(
e740: 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65  zText, osAreFile
e750: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a  ApisANSI());.}..
e760: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e770: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e780: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e790: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e7a0: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e7b0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e7c0: 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68  utf8_v2(const ch
e7d0: 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75  ar *zText, int u
e7e0: 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20  seAnsi){.#ifdef 
e7f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e800: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e810: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e820: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e830: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e840: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e850: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e860: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e870: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e880: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e890: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e8a0: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e8b0: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
e8c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e8d0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
e8e0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
e8f0: 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63  tf8ToMbcs() func
e900: 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  tion..*/.char *s
e910: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
e920: 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20  8_to_mbcs(const 
e930: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69  char *zText){.#i
e940: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e950: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e960: 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20  f( !zText ){.   
e970: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
e980: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
e990: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
e9a0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
e9b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
e9c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
e9d0: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
e9e0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
e9f0: 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54   return winUtf8T
ea00: 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73 41  oMbcs(zText, osA
ea10: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
ea20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
ea30: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
ea40: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
ea50: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
ea60: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
ea70: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
ea80: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f  f8_to_mbcs_v2(co
ea90: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c  nst char *zText,
eaa0: 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 23   int useAnsi){.#
eab0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
eac0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
ead0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
eae0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
eaf0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
eb00: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
eb10: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
eb20: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
eb30: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
eb40: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
eb50: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
eb60: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
eb70: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75 73  ToMbcs(zText, us
eb80: 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eAnsi);.}../*.**
eb90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
eba0: 65 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72  ets the data dir
ebb0: 65 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65  ectory or the te
ebc0: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
ebd0: 79 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68  y based on.** th
ebe0: 65 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d  e provided argum
ebf0: 65 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20  ents.  The type 
ec00: 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65  argument must be
ec10: 20 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73   1 in order to s
ec20: 65 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64  et the.** data d
ec30: 69 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e  irectory or 2 in
ec40: 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68   order to set th
ec50: 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65  e temporary dire
ec60: 63 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c  ctory.  The zVal
ec70: 75 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  ue.** argument i
ec80: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
ec90: 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75  e directory to u
eca0: 73 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  se.  The return 
ecb0: 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a  value will be.**
ecc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
ecd0: 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74  ccessful..*/.int
ece0: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
ecf0: 65 74 5f 64 69 72 65 63 74 6f 72 79 28 44 57 4f  et_directory(DWO
ed00: 52 44 20 74 79 70 65 2c 20 4c 50 43 57 53 54 52  RD type, LPCWSTR
ed10: 20 7a 56 61 6c 75 65 29 7b 0a 20 20 63 68 61 72   zValue){.  char
ed20: 20 2a 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d   **ppDirectory =
ed30: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
ed40: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
ed50: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
ed60: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
ed70: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
ed80: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
ed90: 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54   if( type==SQLIT
eda0: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
edb0: 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20  ECTORY_TYPE ){. 
edc0: 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d     ppDirectory =
edd0: 20 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64   &sqlite3_data_d
ede0: 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73  irectory;.  }els
edf0: 65 20 69 66 28 20 74 79 70 65 3d 3d 53 51 4c 49  e if( type==SQLI
ee00: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
ee10: 52 45 43 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a  RECTORY_TYPE ){.
ee20: 20 20 20 20 70 70 44 69 72 65 63 74 6f 72 79 20      ppDirectory 
ee30: 3d 20 26 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  = &sqlite3_temp_
ee40: 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20  directory;.  }. 
ee50: 20 61 73 73 65 72 74 28 20 21 70 70 44 69 72 65   assert( !ppDire
ee60: 63 74 6f 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53  ctory || type==S
ee70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41  QLITE_WIN32_DATA
ee80: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
ee90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 79 70            || typ
eea0: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
eeb0: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
eec0: 59 50 45 0a 20 20 29 3b 0a 20 20 61 73 73 65 72  YPE.  );.  asser
eed0: 74 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20  t( !ppDirectory 
eee0: 7c 7c 20 73 71 6c 69 74 65 33 4d 65 6d 64 65 62  || sqlite3Memdeb
eef0: 75 67 48 61 73 54 79 70 65 28 2a 70 70 44 69 72  ugHasType(*ppDir
ef00: 65 63 74 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f  ectory, MEMTYPE_
ef10: 48 45 41 50 29 20 29 3b 0a 20 20 69 66 28 20 70  HEAP) );.  if( p
ef20: 70 44 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20  pDirectory ){.  
ef30: 20 20 63 68 61 72 20 2a 7a 56 61 6c 75 65 55 74    char *zValueUt
ef40: 66 38 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  f8 = 0;.    if( 
ef50: 7a 56 61 6c 75 65 20 26 26 20 7a 56 61 6c 75 65  zValue && zValue
ef60: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 7a 56 61  [0] ){.      zVa
ef70: 6c 75 65 55 74 66 38 20 3d 20 77 69 6e 55 6e 69  lueUtf8 = winUni
ef80: 63 6f 64 65 54 6f 55 74 66 38 28 7a 56 61 6c 75  codeToUtf8(zValu
ef90: 65 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 7a  e);.      if ( z
efa0: 56 61 6c 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a  ValueUtf8==0 ){.
efb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
efc0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
efd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
efe0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
eff0: 28 2a 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a  (*ppDirectory);.
f000: 20 20 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79      *ppDirectory
f010: 20 3d 20 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20   = zValueUtf8;. 
f020: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f030: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  _OK;.  }.  retur
f040: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
f050: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74  }../*.** The ret
f060: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 77 69 6e  urn value of win
f070: 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a  GetLastErrorMsg.
f080: 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
f090: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
f0a0: 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
f0b0: 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
f0c0: 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
f0d0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
f0e0: 20 74 72 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a   truncated)..*/.
f0f0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
f100: 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 44 57  tLastErrorMsg(DW
f110: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69  ORD lastErrno, i
f120: 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
f130: 42 75 66 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61  Buf){.  /* Forma
f140: 74 4d 65 73 73 61 67 65 20 72 65 74 75 72 6e 73  tMessage returns
f150: 20 30 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20   0 on failure.  
f160: 4f 74 68 65 72 77 69 73 65 20 69 74 0a 20 20 2a  Otherwise it.  *
f170: 2a 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75  * returns the nu
f180: 6d 62 65 72 20 6f 66 20 54 43 48 41 52 73 20 77  mber of TCHARs w
f190: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6f 75  ritten to the ou
f1a0: 74 70 75 74 0a 20 20 2a 2a 20 62 75 66 66 65 72  tput.  ** buffer
f1b0: 2c 20 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20  , excluding the 
f1c0: 74 65 72 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c  terminating null
f1d0: 20 63 68 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57   char..  */.  DW
f1e0: 4f 52 44 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20  ORD dwLen = 0;. 
f1f0: 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b   char *zOut = 0;
f200: 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
f210: 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
f220: 53 5f 57 49 4e 52 54 0a 20 20 20 20 57 43 48 41  S_WINRT.    WCHA
f230: 52 20 7a 54 65 6d 70 57 69 64 65 5b 53 51 4c 49  R zTempWide[SQLI
f240: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
f250: 4d 53 47 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20  MSG_CHARS+1];.  
f260: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
f270: 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41  atMessageW(FORMA
f280: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
f290: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
f2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2b0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
f2c0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
f2d0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
f2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2f0: 20 4e 55 4c 4c 2c 0a 20 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 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      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 30 2c 0a 20              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 7a 54 65 6d              zTem
f360: 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20  pWide,.         
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f380: 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
f390: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
f3a0: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
f3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3c0: 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50  0);.#else.    LP
f3d0: 57 53 54 52 20 7a 54 65 6d 70 57 69 64 65 20 3d  WSTR zTempWide =
f3e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
f3f0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
f400: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
f410: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
f420: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f450: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _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 46 4f 52 4d              FORM
f480: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
f490: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_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 4e 55 4c 4c 2c 0a 20 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 6c 61 73 74 45             lastE
f4e0: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
f4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f500: 20 20 20 30 2c 0a 20 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 28 4c 50 57 53 54 52 29 20 26 7a 54 65     (LPWSTR) &zTe
f530: 6d 70 57 69 64 65 2c 0a 20 20 20 20 20 20 20 20  mpWide,.        
f540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f550: 20 20 20 20 20 30 2c 0a 20 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 30 29 3b 0a 23 65 6e 64 69 66 0a       0);.#endif.
f580: 20 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20      if( dwLen > 
f590: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c  0 ){.      /* al
f5a0: 6c 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20  locate a buffer 
f5b0: 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55  and convert to U
f5c0: 54 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  TF8 */.      sql
f5d0: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
f5e0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a  alloc();.      z
f5f0: 4f 75 74 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  Out = winUnicode
f600: 54 6f 55 74 66 38 28 7a 54 65 6d 70 57 69 64 65  ToUtf8(zTempWide
f610: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f620: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
f630: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
f640: 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a  S_WINRT.      /*
f650: 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65 6d   free the system
f660: 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74 65   buffer allocate
f670: 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73 61  d by FormatMessa
f680: 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f  ge */.      osLo
f690: 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 57 69 64  calFree(zTempWid
f6a0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
f6b0: 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
f6c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
f6d0: 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
f6e0: 61 72 20 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c  ar *zTemp = NULL
f6f0: 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73  ;.    dwLen = os
f700: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 28 46  FormatMessageA(F
f710: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c  ORMAT_MESSAGE_AL
f720: 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a  LOCATE_BUFFER |.
f730: 20 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 46 4f 52               FOR
f750: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d  MAT_MESSAGE_FROM
f760: 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20  _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 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f790: 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53  SSAGE_IGNORE_INS
f7a0: 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20  ERTS,.          
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 4e 55 4c 4c 2c 0a 20 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 6c 61 73 74 45 72 72 6e 6f 2c        lastErrno,
f7f0: 0a 20 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 30 2c                0,
f810: 0a 20 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 28 4c                (L
f830: 50 53 54 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20  PSTR) &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 30 2c 0a 20 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 30 29 3b 0a 20             0);. 
f880: 20 20 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30     if( dwLen > 0
f890: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c   ){.      /* all
f8a0: 6f 63 61 74 65 20 61 20 62 75 66 66 65 72 20 61  ocate a buffer a
f8b0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54  nd convert to UT
f8c0: 46 38 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  F8 */.      sqli
f8d0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
f8e0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f  lloc();.      zO
f8f0: 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ut = winMbcsToUt
f900: 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46  f8(zTemp, osAreF
f910: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
f920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
f930: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
f940: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
f950: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
f960: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
f970: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
f980: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
f990: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
f9a0: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
f9b0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
f9c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
f9d0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
f9e0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
f9f0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
fa00: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
fa10: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
fa20: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
fa30: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
fa40: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
fa50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
fa60: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
fa70: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
fa80: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
fa90: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
faa0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
fab0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fac0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
fad0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
fae0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
faf0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
fb00: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
fb10: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
fb20: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
fb30: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
fb40: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
fb50: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
fb60: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
fb70: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
fb80: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
fb90: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
fba0: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
fbb0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
fbc0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
fbd0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
fbe0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
fbf0: 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f  alent from.** Fo
fc00: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
fc10: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
fc20: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
fc30: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
fc40: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
fc50: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
fc60: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
fc70: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
fc80: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
fc90: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
fca0: 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  )..** The two su
fcb0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
fcc0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
fcd0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
fce0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
fcf0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
fd00: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
fd10: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
fd20: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
fd30: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
fd40: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
fd50: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
fd60: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
fd70: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
fd80: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
fd90: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
fda0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
fdb0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
fdc0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
fdd0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
fde0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
fdf0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
fe00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe20: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
fe30: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
fe40: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
fe50: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
fe60: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
fe70: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
fe80: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
fe90: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
fea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
feb0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
fec0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
fed0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
fee0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff00: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
ff10: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
ff20: 0a 20 20 69 6e 74 20 69 3b 20 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 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ff50: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
ff60: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61   = 0;.  winGetLa
ff70: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
ff80: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
ff90: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
ffa0: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
ffb0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
ffc0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
ffd0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
ffe0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
fff0: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
10000 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
10010 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
10020 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
10030 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
10040 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
10050 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
10060 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
10070 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
10080 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
10090 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
100a0 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
100b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
100c0 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
100d0 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
100e0 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
100f0 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
10100 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
10110 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
10120 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
10130 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72  ed by.** antivir
10140 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c  us software.  Al
10150 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64  so the initial d
10160 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  elay before the 
10170 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20  first retry..** 
10180 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61  The delay increa
10190 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74  ses linearly wit
101a0 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f  h each retry..*/
101b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
101c0 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
101d0 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
101e0 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
101f0 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69  TRY 10.#endif.#i
10200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
10210 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
10220 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ELAY.# define SQ
10230 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10240 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a  _RETRY_DELAY 25.
10250 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
10260 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  t winIoerrRetry 
10270 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
10280 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
10290 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
102a0 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
102b0 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
102c0 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
102d0 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  ** The "winIoerr
102e0 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f  CanRetry1" macro
102f0 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
10300 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69  rmine if a parti
10310 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72  cular I/O.** err
10320 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64  or code obtained
10330 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f   via GetLastErro
10340 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20  r() is eligible 
10350 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  to be retried.  
10360 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70  It.** must accep
10370 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  t the error code
10380 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e   DWORD as its on
10390 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ly argument and 
103a0 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a  should return.**
103b0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
103c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74   error code is t
103d0 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75  ransient in natu
103e0 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61  re and the opera
103f0 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  tion.** responsi
10400 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69  ble for generati
10410 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ng the original 
10420 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63  error might succ
10430 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a  eed upon being.*
10440 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20  * retried.  The 
10450 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
10460 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
10470 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a   a variable..**.
10480 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  ** Additionally,
10490 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22   a macro named "
104a0 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
104b0 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65  2" may be define
104c0 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20  d.  If it.** is 
104d0 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c  defined, it will
104e0 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e   be consulted on
104f0 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72  ly when the macr
10500 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  o "winIoerrCanRe
10510 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73  try1".** returns
10520 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e   zero.  The "win
10530 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
10540 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74  macro is complet
10550 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64  ely optional and
10560 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20  .** may be used 
10570 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74  to include addit
10580 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65  ional error code
10590 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61  s in the set tha
105a0 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75  t should.** resu
105b0 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e  lt in the failin
105c0 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20  g I/O operation 
105d0 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62 79  being retried by
105e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66   the caller.  If
105f0 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65  .** defined, the
10600 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
10610 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20  ry2" macro must 
10620 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c  exhibit external
10630 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64   semantics.** id
10640 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65  entical to those
10650 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72   of the "winIoer
10660 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
10670 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  o..*/.#if !defin
10680 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ed(winIoerrCanRe
10690 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69  try1).#define wi
106a0 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28  nIoerrCanRetry1(
106b0 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f  a) (((a)==ERROR_
106c0 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20  ACCESS_DENIED)  
106d0 20 20 20 20 20 20 7c 7c 20 5c 0a 20 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 28 28 61 29 3d 3d 45           ((a)==E
10700 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
10710 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a  LATION)    || \.
10720 20 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 28 28                ((
10740 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56  a)==ERROR_LOCK_V
10750 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20  IOLATION)       
10760 7c 7c 20 5c 0a 20 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 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44     ((a)==ERROR_D
10790 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20  EV_NOT_EXIST)   
107a0 20 20 20 20 20 7c 7c 20 5c 0a 20 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 28 28 61 29 3d 3d 45 52          ((a)==ER
107d0 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45  ROR_NETNAME_DELE
107e0 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20  TED)      || \. 
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 28 28 61               ((a
10810 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d  )==ERROR_SEM_TIM
10820 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20 7c  EOUT)          |
10830 7c 20 5c 0a 20 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 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45    ((a)==ERROR_NE
10860 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c  TWORK_UNREACHABL
10870 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E)).#endif../*.*
10880 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
10890 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
108a0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
108b0 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
108c0 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
108d0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
108e0 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
108f0 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
10900 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
10910 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
10920 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
10930 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f  c int winRetryIo
10940 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
10950 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29  , DWORD *pError)
10960 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
10970 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
10980 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d    if( *pnRetry>=
10990 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b  winIoerrRetry ){
109a0 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20  .    if( pError 
109b0 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
109c0 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = e;.    }.    
109d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
109e0 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  if( winIoerrCanR
109f0 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20  etry1(e) ){.    
10a00 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
10a10 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
10a20 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
10a30 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
10a40 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
10a50 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69   1;.  }.#if defi
10a60 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52  ned(winIoerrCanR
10a70 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66  etry2).  else if
10a80 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  ( winIoerrCanRet
10a90 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71  ry2(e) ){.    sq
10aa0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
10ab0 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  p(winIoerrRetryD
10ac0 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
10ad0 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
10ae0 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
10af0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
10b00 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
10b10 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
10b20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
10b30 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f  ./*.** Log a I/O
10b40 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69   error retry epi
10b50 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sode..*/.static 
10b60 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72  void winLogIoerr
10b70 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e 74  (int nRetry, int
10b80 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
10b90 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
10ba0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
10bb0 5f 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20 22  _NOTICE,.      "
10bc0 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
10bd0 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
10be0 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20 25  nflict at line %
10bf0 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65  d",.      winIoe
10c00 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
10c10 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
10c20 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a  , lineno.    );.
10c30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
10c40 73 20 23 69 66 20 64 6f 65 73 20 6e 6f 74 20 72  s #if does not r
10c50 65 6c 79 20 6f 6e 20 74 68 65 20 53 51 4c 49 54  ely on the SQLIT
10c60 45 5f 4f 53 5f 57 49 4e 43 45 20 64 65 66 69 6e  E_OS_WINCE defin
10c70 65 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a  e because the.**
10c80 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
10c90 65 63 74 69 6f 6e 20 69 6e 20 22 64 61 74 65 2e  ection in "date.
10ca0 63 22 20 63 61 6e 6e 6f 74 20 75 73 65 20 69 74  c" cannot use it
10cb0 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
10cc0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
10cd0 43 41 4c 54 49 4d 45 29 20 26 26 20 64 65 66 69  CALTIME) && defi
10ce0 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 20  ned(_WIN32_WCE) 
10cf0 26 26 20 5c 0a 20 20 20 20 28 21 64 65 66 69 6e  && \.    (!defin
10d00 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  ed(SQLITE_MSVC_L
10d10 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c 7c  OCALTIME_API) ||
10d20 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c 4f   !SQLITE_MSVC_LO
10d30 43 41 4c 54 49 4d 45 5f 41 50 49 29 0a 2f 2a 0a  CALTIME_API)./*.
10d40 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20  ** The MSVC CRT 
10d50 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61  on Windows CE ma
10d60 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  y not have a loc
10d70 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
10d80 6e 2e 0a 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20  n..** So define 
10d90 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f  a substitute..*/
10da0 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d  .#  include <tim
10db0 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
10dc0 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
10dd0 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
10de0 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
10df0 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
10e00 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
10e10 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
10e20 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
10e30 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
10e40 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
10e50 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
10e60 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
10e70 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
10e80 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
10e90 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
10ea0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
10eb0 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
10ec0 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
10ed0 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
10ee0 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
10ef0 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
10f00 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
10f10 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
10f20 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
10f30 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
10f40 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
10f50 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
10f60 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
10f70 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
10f80 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
10f90 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
10fa0 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
10fb0 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
10fc0 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
10fd0 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
10fe0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
10ff0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_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 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
11050 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
11060 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
11070 6e 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  nly..*/.#define 
11080 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
11090 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26  E(a) (winFile*)&
110a0 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74  ((char*)a)[-(int
110b0 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  )offsetof(winFil
110c0 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
110d0 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
110e0 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
110f0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
11100 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
11110 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
11120 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
11130 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57       dwErr = osW
11140 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
11150 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
11160 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
11170 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
11180 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
11190 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
111a0 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
111b0 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
111c0 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
111d0 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
111e0 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
111f0 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
11200 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
11210 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
11220 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
11230 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
11240 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
11250 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
11260 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
11270 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
11280 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
11290 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
112a0 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54  *pFile){.  LPWST
112b0 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52  R zTok;.  LPWSTR
112c0 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20   zName;.  DWORD 
112d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f  lastErrno;.  BOO
112e0 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53  L bLogged = FALS
112f0 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  E;.  BOOL bInit 
11300 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65  = TRUE;..  zName
11310 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
11320 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
11330 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
11340 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20  {.    /* out of 
11350 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65  memory */.    re
11360 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
11370 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
11380 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
11390 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
113a0 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
113b0 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
113c0 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
113d0 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
113e0 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
113f0 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
11400 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
11410 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
11420 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
11430 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
11440 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
11450 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
11460 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
11470 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
11480 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
11490 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
114a0 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
114b0 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
114c0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
114d0 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
114e0 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
114f0 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
11500 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
11510 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11520 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11530 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
11540 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
11550 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
11560 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
11570 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
11580 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
11590 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
115a0 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
115b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Filename);.  }..
115c0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
115d0 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
115e0 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
115f0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
11600 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11610 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
11620 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
11630 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
11640 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
11650 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63  s etc are.  ** c
11660 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
11670 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
11680 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
11690 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
116a0 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
116b0 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
116c0 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
116d0 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
116e0 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
116f0 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
11700 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
11710 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
11720 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
11730 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , 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 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
11770 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
11780 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
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 7a 4e                zN
117b0 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ame);..  /* Set 
117c0 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
117d0 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
117e0 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
117f0 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
11800 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
11810 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
11820 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  /.  lastErrno = 
11830 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
11840 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e  ;.  if (lastErrn
11850 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  o == ERROR_ALREA
11860 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
11870 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
11880 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
11890 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  ee(zName);..  /*
118a0 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
118b0 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73   in making the s
118c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
118d0 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a  dle, map it. */.
118e0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
118f0 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c  ared ){.    pFil
11900 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
11910 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65  ceLock*)osMapVie
11920 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
11930 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
11940 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
11950 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
11960 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
11970 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
11980 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
11990 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
119a0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
119b0 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
119c0 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  it */.    if( !p
119d0 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a  File->shared ){.
119e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
119f0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11a00 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
11a10 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11a20 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
11a30 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11a50 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
11a60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
11a70 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
11a80 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  RUE;.      osClo
11a90 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
11aa0 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
11ab0 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
11ac0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
11ad0 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
11ae0 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
11af0 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
11b00 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
11b10 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
11b20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
11b30 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  red==NULL ){.   
11b40 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b   if( !bLogged ){
11b50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
11b60 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11b70 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  rno;.      winLo
11b80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11b90 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
11ba0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
11bb0 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
11bc0 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69  reateLock3", zFi
11bd0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
11be0 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
11bf0 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75     }.    winceMu
11c00 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
11c10 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
11c20 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
11c30 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
11c40 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
11c50 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
11c60 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
11c70 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
11c80 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
11c90 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
11ca0 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
11cb0 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20   if( bInit ){.  
11cc0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
11cd0 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
11ce0 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
11cf0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
11d00 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
11d10 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
11d20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11d30 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
11d40 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
11d50 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
11d60 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
11d70 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
11d80 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
11d90 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
11da0 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
11db0 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
11dc0 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
11dd0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
11de0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
11df0 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
11e00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
11e10 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
11e20 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
11e30 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
11e40 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
11e50 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
11e60 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
11e70 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
11e80 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11e90 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
11ea0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11eb0 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
11ec0 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
11ed0 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
11ee0 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
11ef0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
11f00 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
11f10 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
11f20 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
11f30 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11f40 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
11f50 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
11f60 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
11f70 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
11f80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11f90 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
11fa0 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
11fb0 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
11fc0 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
11fd0 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
11fe0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
11ff0 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
12000 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
12010 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
12020 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
12030 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
12040 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
12050 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
12060 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
12070 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
12080 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
12090 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
120a0 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
120b0 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
120c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
120d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
120e0 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
120f0 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
12100 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
12110 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
12120 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
12130 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
12140 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
12150 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
12160 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
12170 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
12180 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
12190 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
121a0 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
121b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
121c0 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
121d0 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
121e0 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
121f0 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
12200 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
12210 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
12220 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
12230 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
12240 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
12250 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
12260 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
12270 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
12280 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
12290 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
122a0 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
122b0 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
122c0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
122d0 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
122e0 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
122f0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
12300 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
12310 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
12320 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
12330 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
12340 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
12350 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
12360 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
12370 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
12380 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
12390 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
123a0 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
123b0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
123c0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
123d0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
123e0 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
123f0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
12400 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
12410 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
12420 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
12430 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
12440 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
12450 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
12460 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
12470 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
12480 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
12490 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
124a0 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
124b0 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
124c0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
124d0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
124e0 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
124f0 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
12500 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
12510 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
12520 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
12530 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
12540 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
12550 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
12560 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
12570 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
12580 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
12590 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
125a0 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
125b0 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
125c0 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
125d0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
125e0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
125f0 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
12600 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
12610 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
12620 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
12630 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
12640 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
12650 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
12660 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
12670 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
12680 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
12690 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
126a0 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
126b0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
126c0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
126d0 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
126e0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
126f0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
12700 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
12710 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12720 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
12730 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
12740 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
12750 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
12760 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12770 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
12780 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
12790 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
127a0 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
127b0 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
127c0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
127d0 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
127e0 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
127f0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
12800 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
12810 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
12820 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
12830 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
12840 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12850 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
12860 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12870 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
12880 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
12890 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
128a0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
128b0 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
128c0 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
128d0 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
128e0 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
128f0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
12900 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
12910 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12920 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12930 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
12940 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
12950 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
12960 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
12970 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
12980 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
12990 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
129a0 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
129b0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
129c0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
129d0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
129e0 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
129f0 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
12a00 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
12a10 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
12a20 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
12a30 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
12a40 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
12a50 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
12a60 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12a70 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
12a80 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
12a90 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
12aa0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12ab0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
12ac0 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
12ad0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
12ae0 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
12af0 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
12b00 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
12b10 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
12b20 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
12b30 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
12b40 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12b50 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
12b60 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20  )SHARED_SIZE.   
12b70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75            || nNu
12b80 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12b90 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
12ba0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
12bb0 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
12bc0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
12bd0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
12be0 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
12bf0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12c00 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
12c10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
12c20 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12c30 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
12c40 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
12c50 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
12c60 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
12c70 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
12c80 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
12c90 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
12ca0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
12cb0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
12cc0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12cd0 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
12ce0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
12cf0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
12d00 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12d10 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
12d20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
12d30 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12d40 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
12d50 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
12d60 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
12d70 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
12d80 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
12d90 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20  SERVED_BYTE.    
12da0 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
12db0 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
12dc0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
12dd0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
12de0 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20  bReserved) {.   
12df0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
12e00 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
12e10 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
12e20 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
12e30 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
12e40 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
12e50 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
12e60 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12e70 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12e80 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
12e90 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
12ea0 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
12eb0 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e 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 2f 0a 23 65 6e 64 69  *********/.#endi
12f10 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
12f20 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  INCE */../*.** L
12f30 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
12f40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  n..*/.static BOO
12f50 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20  L winLockFile(. 
12f60 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
12f70 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c  ,.  DWORD flags,
12f80 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
12f90 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
12fa0 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
12fb0 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
12fc0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
12fd0 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
12fe0 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
12ff0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
13000 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
13010 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
13020 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
13030 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
13040 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
13050 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
13060 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
13070 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
13080 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
13090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130a0 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
130b0 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
130c0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
130d0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
130e0 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
130f0 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
13100 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
13110 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
13120 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
13130 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
13140 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
13150 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
13160 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a  n osLockFileEx(*
13170 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30  phFile, flags, 0
13180 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
13190 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
131a0 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
131b0 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
131c0 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
131d0 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
131e0 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
131f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13200 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
13210 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
13220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
13230 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
13240 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
13250 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
13260 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
13270 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
13280 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
13290 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
132a0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
132b0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
132c0 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
132d0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
132e0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
132f0 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
13300 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
13310 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
13320 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
13330 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b        API Unlock
13340 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
13350 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  urn winceUnlockF
13360 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
13370 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
13380 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
13390 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
133a0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
133b0 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
133c0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
133d0 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
133e0 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
133f0 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
13400 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
13410 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
13420 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
13430 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
13440 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
13450 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
13460 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
13470 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
13480 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
13490 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
134a0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
134b0 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
134c0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
134d0 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
134e0 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
134f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
13500 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
13510 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 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 0a 2a 2a 20 54 68 65 20  ********.** The 
13570 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
13580 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
13590 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
135a0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
135b0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
135c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
135d0 2a 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 2f 0a  **************/.
13620 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72  ./*.** Some Micr
13630 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20  osoft compilers 
13640 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69  lack this defini
13650 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
13660 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
13670 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69  E_POINTER.# defi
13680 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ne INVALID_SET_F
13690 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57  ILE_POINTER ((DW
136a0 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
136b0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
136c0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
136d0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
136e0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
136f0 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
13700 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
13710 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
13720 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
13730 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ful, return 0..*
13740 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
13750 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13760 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
13770 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
13780 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65   int winSeekFile
13790 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
137a0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
137b0 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51  Offset){.#if !SQ
137c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
137d0 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
13800 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
13810 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
13820 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
13830 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
13840 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
13850 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
13860 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13890 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
138a0 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
138b0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
138c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
138d0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
138e0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
138f0 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  */..  OSTRACE(("
13900 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66  SEEK file=%p, of
13910 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46  fset=%lld\n", pF
13920 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29  ile->h, iOffset)
13930 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  );..  upperBits 
13940 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
13950 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
13960 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
13970 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
13980 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
13990 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
139a0 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
139b0 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
139c0 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
139d0 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ord.  ** contain
139e0 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
139f0 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
13a00 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
13a10 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
13a20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
13a30 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
13a40 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
13a50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
13a60 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  DN,.  ** INVALID
13a70 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13a80 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
13a90 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
13aa0 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
13ab0 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61  e.  ** whether a
13ac0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
13ad0 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
13ae0 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
13af0 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  ary to call.  **
13b00 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e   GetLastError().
13b10 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20  .  */.  dwRet = 
13b20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13b30 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
13b40 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
13b50 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
13b60 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e    if( (dwRet==IN
13b70 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13b80 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
13b90 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
13ba0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
13bb0 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
13bc0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
13bd0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
13be0 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
13bf0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
13c00 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
13c10 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13c20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
13c30 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
13c40 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
13c50 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
13c60 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
13c70 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
13c80 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13c90 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
13ca0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
13cb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
13cc0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
13cd0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
13ce0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
13cf0 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
13d00 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
13d10 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
13d20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
13d30 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
13d40 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
13d50 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
13d60 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
13d70 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
13d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13d90 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
13da0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
13db0 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
13dc0 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
13dd0 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
13de0 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
13df0 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
13e00 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
13e10 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
13e20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13e30 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
13e40 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
13e50 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
13e60 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13e70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13e80 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
13e90 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13ea0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
13eb0 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
13ec0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
13ed0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
13ee0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
13ef0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
13f00 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
13f10 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13f20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
13f30 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
13f40 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13f50 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20  _MMAP_SIZE>0./* 
13f60 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
13f70 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
13f80 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
13f90 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
13fa0 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
13fb0 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
13fc0 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  inFile*, sqlite3
13fd0 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20  _int64);.static 
13fe0 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
13ff0 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64  (winFile*);.#end
14000 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
14010 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
14020 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
14030 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
14040 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
14050 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
14060 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
14070 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
14080 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
14090 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
140a0 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
140b0 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
140c0 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
140d0 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
140e0 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
140f0 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
14100 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
14110 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
14120 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
14130 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
14140 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
14150 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
14160 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
14170 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
14180 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
14190 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
141a0 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
141b0 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
141c0 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
141d0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
141e0 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
141f0 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
14200 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
14210 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
14220 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
14230 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14240 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
14250 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
14260 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
14270 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20   pFile->h!=NULL 
14280 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56  && pFile->h!=INV
14290 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
142a0 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  E );.  OSTRACE((
142b0 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  "CLOSE pid=%lu, 
142c0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
142d0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
142e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
142f0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14300 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69   pFile->h));..#i
14310 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
14320 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
14330 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
14340 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
14350 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
14360 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
14370 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
14380 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
14390 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
143a0 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
143b0 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
143c0 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
143d0 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
143e0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
143f0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
14400 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
14410 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
14420 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
14430 20 20 7b 0a 20 20 20 20 77 69 6e 56 66 73 41 70    {.    winVfsAp
14440 70 44 61 74 61 20 2a 70 41 70 70 44 61 74 61 20  pData *pAppData 
14450 3d 20 28 77 69 6e 56 66 73 41 70 70 44 61 74 61  = (winVfsAppData
14460 2a 29 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 70  *)pFile->pVfs->p
14470 41 70 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28  AppData;.    if(
14480 20 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c 4c 20   pAppData==NULL 
14490 7c 7c 20 21 70 41 70 70 44 61 74 61 2d 3e 62 4e  || !pAppData->bN
144a0 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 77  oLock ){.      w
144b0 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
144c0 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
144d0 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a  }.  if( pFile->z
144e0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b  DeleteOnClose ){
144f0 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  .    int cnt = 0
14500 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20 20 20  ;.    while(.   
14510 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65 74 65          osDelete
14520 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a 44 65  FileW(pFile->zDe
14530 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a  leteOnClose)==0.
14540 20 20 20 20 20 20 20 20 26 26 20 6f 73 47 65 74          && osGet
14550 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 28  FileAttributesW(
14560 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e  pFile->zDeleteOn
14570 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66 66 66  Close)!=0xffffff
14580 66 66 0a 20 20 20 20 20 20 20 20 26 26 20 63 6e  ff.        && cn
14590 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45 4c 45  t++ < WINCE_DELE
145a0 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a 20 20  TION_ATTEMPTS.  
145b0 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69    ){.       sqli
145c0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
145d0 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74 20 61  100);  /* Wait a
145e0 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65 20 74   little before t
145f0 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f 0a 20  rying again */. 
14600 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14610 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a 44 65  _free(pFile->zDe
14620 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20  leteOnClose);.  
14630 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
14640 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  c ){.    pFile->
14650 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20  h = NULL;.  }.  
14660 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
14670 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f  .  OSTRACE(("CLO
14680 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  SE pid=%lu, pFil
14690 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
146a0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
146b0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
146c0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
146d0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  le, pFile->h, rc
146e0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
146f0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
14700 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  c ? SQLITE_OK.  
14710 20 20 20 20 20 20 20 20 20 20 3a 20 77 69 6e 4c            : winL
14720 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
14730 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73 47 65  OERR_CLOSE, osGe
14740 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
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 22 77 69 6e 43 6c 6f 73          "winClos
14770 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
14780 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
14790 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
147a0 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
147b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
147c0 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
147d0 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
147e0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
147f0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
14800 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
14810 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
14820 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20 20 73  int winRead(.  s
14830 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
14840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
14850 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  e to read from *
14860 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14880 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e 74 20  * Write content 
14890 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
148a0 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20   */.  int amt,  
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
148d0 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20  tes to read */. 
148e0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
148f0 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a 20 42  ffset       /* B
14900 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
14910 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
14920 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
14930 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
14940 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
14950 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
14960 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
14970 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 20  lapped;         
14980 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66   /* The offset f
14990 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a 2f 0a  or ReadFile. */.
149a0 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69 6c 65  #endif.  winFile
149b0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
149c0 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69 6c 65  le*)id;  /* file
149d0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44 57 4f   handle */.  DWO
149e0 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  RD nRead;       
149f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
14a10 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72  actually read fr
14a20 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  om file */.  int
14a30 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20   nRetry = 0;    
14a40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14a50 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72 79 73  Number of retrys
14a60 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
14a70 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  d!=0 );.  assert
14a80 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73  ( amt>0 );.  ass
14a90 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29  ert( offset>=0 )
14aa0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
14ab0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
14ac0 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b 0a 20  E_IOERR_READ);. 
14ad0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
14ae0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14af0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  p, file=%p, buff
14b00 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
14b10 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
14b20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
14b30 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75  k=%d\n", osGetCu
14b40 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14b50 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
14b60 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
14b70 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
14b80 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14b90 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
14ba0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
14bb0 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
14bc0 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72  s much of this r
14bd0 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70  ead request as p
14be0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
14bf0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
14c00 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
14c10 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
14c20 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
14c30 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
14c40 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
14c50 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
14c60 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
14c70 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
14c80 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
14c90 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
14ca0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61  ion))[offset], a
14cb0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
14cc0 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50 20 70  CE(("READ-MMAP p
14cd0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
14ce0 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
14cf0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
14d00 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
14d10 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14d20 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
14d30 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
14d40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14d60 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74  int nCopy = (int
14d70 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  )(pFile->mmapSiz
14d80 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  e - offset);.   
14d90 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
14da0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
14db0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
14dc0 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  set], nCopy);.  
14dd0 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38      pBuf = &((u8
14de0 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b   *)pBuf)[nCopy];
14df0 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43  .      amt -= nC
14e00 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  opy;.      offse
14e10 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t += nCopy;.    
14e20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
14e30 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
14e40 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  E || defined(SQL
14e50 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45  ITE_WIN32_NO_OVE
14e60 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28 20 77  RLAPPED).  if( w
14e70 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
14e80 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20 20 20  , offset) ){.   
14e90 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
14ea0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14eb0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14ec0 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20  QLITE_FULL\n",. 
14ed0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
14ee0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14ef0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14f00 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
14f10 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
14f20 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21 6f 73    }.  while( !os
14f30 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e  ReadFile(pFile->
14f40 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e  h, pBuf, amt, &n
14f50 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65 6c 73  Read, 0) ){.#els
14f60 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72  e.  memset(&over
14f70 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f  lapped, 0, sizeo
14f80 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a  f(OVERLAPPED));.
14f90 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
14fa0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
14fb0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
14fc0 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
14fd0 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
14fe0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
14ff0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
15000 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64    while( !osRead
15010 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
15020 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
15030 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 26  , &overlapped) &
15040 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47 65 74  &.         osGet
15050 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45 52 52  LastError()!=ERR
15060 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20 29 7b  OR_HANDLE_EOF ){
15070 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57 4f 52  .#endif.    DWOR
15080 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  D lastErrno;.   
15090 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
150a0 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
150b0 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
150c0 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ue;.    pFile->l
150d0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
150e0 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
150f0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
15100 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
15110 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
15120 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a 20 20  OERR_READ\n",.  
15130 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
15140 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
15150 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
15160 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
15170 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
15180 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 2c  LITE_IOERR_READ,
15190 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
151a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
151b0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 52 65            "winRe
151c0 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ad", pFile->zPat
151d0 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c 6f 67  h);.  }.  winLog
151e0 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f  Ioerr(nRetry, __
151f0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28 20 6e  LINE__);.  if( n
15200 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d 74 20  Read<(DWORD)amt 
15210 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  ){.    /* Unread
15220 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
15230 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
15240 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
15250 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
15260 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20 30 2c  pBuf)[nRead], 0,
15270 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20 20 20   amt-nRead);.   
15280 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
15290 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
152a0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
152b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
152c0 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20  T_READ\n",.     
152d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
152e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
152f0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15300 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
15310 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
15320 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f  T_READ;.  }..  O
15330 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
15340 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15350 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15360 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
15370 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15380 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15390 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
153a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
153b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  E_OK;.}../*.** W
153c0 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61  rite data from a
153d0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66   buffer into a f
153e0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ile.  Return SQL
153f0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
15400 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68  s.** or some oth
15410 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e  er error code on
15420 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61   failure..*/.sta
15430 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69 74 65  tic int winWrite
15440 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
15450 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   *id,           
15460 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77      /* File to w
15470 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63  rite into */.  c
15480 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154a0 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62  * The bytes to b
154b0 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  e written */.  i
154c0 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
154d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
154e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
154f0 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  s to write */.  
15500 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
15510 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20  fset            
15520 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74  /* Offset into t
15530 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e  he file to begin
15540 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29   writing at */.)
15550 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  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 2f 2a 20 54 72 75 65 20 69 66 20 65      /* True if e
15580 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
15590 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20 2a 2f  d, else false */
155a0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
155b0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
155c0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
155d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72  e */.  int nRetr
155e0 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
155f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
15600 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f 0a 0a   of retries */..
15610 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
15620 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  );.  assert( pFi
15630 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
15640 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  IOError(return S
15650 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
15660 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  E);.  SimulateDi
15670 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65 74 75  skfullError(retu
15680 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 29 3b  rn SQLITE_FULL);
15690 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ..  OSTRACE(("WR
156a0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
156b0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
156c0 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e  buffer=%p, amoun
156d0 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  t=%d, ".        
156e0 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c     "offset=%lld,
156f0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47   lock=%d\n", osG
15700 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15710 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
15720 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
15730 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66  , pBuf, amt, off
15740 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  set, pFile->lock
15750 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64 65 66  type));..#if def
15760 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50  ined(SQLITE_MMAP
15770 5f 52 45 41 44 57 52 49 54 45 29 20 26 26 20 53  _READWRITE) && S
15780 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
15790 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20  IZE>0.  /* Deal 
157a0 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20  with as much of 
157b0 74 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65  this write reque
157c0 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
157d0 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
157e0 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
157f0 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
15800 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
15810 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
15820 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
15830 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
15840 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
15850 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
15860 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20     memcpy(&((u8 
15870 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
15880 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
15890 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20  pBuf, amt);.    
158a0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
158b0 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  E-MMAP pid=%lu, 
158c0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
158d0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
158e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
158f0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
15900 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
15910 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
15920 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15930 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
15940 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
15950 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65 2d  y = (int)(pFile-
15960 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
15970 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  et);.      memcp
15980 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
15990 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
159a0 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
159b0 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
159c0 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
159d0 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
159e0 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
159f0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
15a00 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
15a10 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
15a20 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66  _OS_WINCE || def
15a30 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15a40 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
15a50 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65 6b 46  .  rc = winSeekF
15a60 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
15a70 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  t);.  if( rc==0 
15a80 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23 65 6e  ){.#else.  {.#en
15a90 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
15aa0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
15ab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
15ac0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
15ad0 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20  .    OVERLAPPED 
15ae0 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20  overlapped;     
15af0 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
15b00 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65 2e 20   for WriteFile. 
15b10 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38  */.#endif.    u8
15b20 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a 29 70   *aRem = (u8 *)p
15b30 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  Buf;        /* D
15b40 61 74 61 20 79 65 74 20 74 6f 20 62 65 20 77 72  ata yet to be wr
15b50 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
15b60 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20 20 20   nRem = amt;    
15b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
15b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 79 65  mber of bytes ye
15b90 74 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  t to be written 
15ba0 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e 57 72  */.    DWORD nWr
15bb0 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
15bc0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 77 72       /* Bytes wr
15bd0 69 74 74 65 6e 20 62 79 20 65 61 63 68 20 57 72  itten by each Wr
15be0 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c 20 2a  iteFile() call *
15bf0 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  /.    DWORD last
15c00 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
15c10 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74  ;   /* Value ret
15c20 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73 74  urned by GetLast
15c30 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69 66 20  Error() */..#if 
15c40 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
15c50 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15c60 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45  ITE_WIN32_NO_OVE
15c70 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d 65 6d  RLAPPED).    mem
15c80 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
15c90 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
15ca0 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 65  APPED));.    ove
15cb0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
15cc0 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
15cd0 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
15ce0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
15cf0 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29  setHigh = (LONG)
15d00 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20  ((offset>>32) & 
15d10 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e  0x7fffffff);.#en
15d20 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  dif..    while( 
15d30 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20 53 51  nRem>0 ){.#if SQ
15d40 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
15d50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15d60 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
15d70 50 45 44 29 0a 20 20 20 20 20 20 69 66 28 20 21  PED).      if( !
15d80 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c  osWriteFile(pFil
15d90 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d  e->h, aRem, nRem
15da0 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20 29 7b  , &nWrite, 0) ){
15db0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28  .#else.      if(
15dc0 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
15dd0 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
15de0 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26 6f 76  em, &nWrite, &ov
15df0 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23 65 6e  erlapped) ){.#en
15e00 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
15e10 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e  winRetryIoerr(&n
15e20 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e  Retry, &lastErrn
15e30 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  o) ) continue;. 
15e40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
15e50 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
15e60 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  rt( nWrite==0 ||
15e70 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52 44 29   nWrite<=(DWORD)
15e80 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20 69 66  nRem );.      if
15e90 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e  ( nWrite==0 || n
15ea0 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e 52 65  Write>(DWORD)nRe
15eb0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  m ){.        las
15ec0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
15ed0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
15ee0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15ef0 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  }.#if !SQLITE_OS
15f00 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e  _WINCE && !defin
15f10 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
15f20 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20  NO_OVERLAPPED). 
15f30 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
15f40 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f 76 65  Write;.      ove
15f50 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d  rlapped.Offset =
15f60 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26   (LONG)(offset &
15f70 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20   0xffffffff);.  
15f80 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
15f90 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
15fa0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
15fb0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
15fc0 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52 65 6d  endif.      aRem
15fd0 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
15fe0 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69 74 65    nRem -= nWrite
15ff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16000 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRem>0 ){.      
16010 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16020 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
16030 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
16040 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20  }.  }..  if( rc 
16050 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28 20 70  ){.    if(   ( p
16060 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
16070 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 44 49  =ERROR_HANDLE_DI
16080 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20 20 20  SK_FULL ).      
16090 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73   || ( pFile->las
160a0 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49  tErrno==ERROR_DI
160b0 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20 20 20  SK_FULL )){.    
160c0 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54    OSTRACE(("WRIT
160d0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
160e0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
160f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
16100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16110 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
16120 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
16130 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
16140 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
16150 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55 4c 4c  rror(SQLITE_FULL
16160 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
16170 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
16190 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c 65 2d  nWrite1", pFile-
161a0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
161b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49     OSTRACE(("WRI
161c0 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
161d0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
161e0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  c=SQLITE_IOERR_W
161f0 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20 20 20  RITE\n",.       
16200 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
16210 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
16220 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
16230 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
16240 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
16250 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70 46 69  IOERR_WRITE, pFi
16260 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->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 22 77 69 6e 57 72 69 74 65 32        "winWrite2
16290 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
162a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  ;.  }else{.    w
162b0 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
162c0 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  y, __LINE__);.  
162d0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  }.  OSTRACE(("WR
162e0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
162f0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
16300 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16310 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
16320 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16330 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
16340 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
16350 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
16360 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
16370 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
16380 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
16390 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
163a0 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33  Truncate(sqlite3
163b0 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
163c0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
163d0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
163e0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
163f0 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c  ;  /* File handl
16400 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  e object */.  in
16410 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16420 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
16430 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 6f 72   Return code for
16440 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
16450 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  /.  DWORD lastEr
16460 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  rno;..  assert( 
16470 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
16480 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
16490 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  n SQLITE_IOERR_T
164a0 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53 54 52  RUNCATE);.  OSTR
164b0 41 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70  ACE(("TRUNCATE p
164c0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
164d0 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a 65 3d  , file=%p, size=
164e0 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
164f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
16500 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16510 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
16520 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 70 46  le->h, nByte, pF
16530 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
16540 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
16550 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
16560 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
16570 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
16580 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
16590 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
165a0 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
165b0 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
165c0 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
165d0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
165e0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
165f0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
16600 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
16610 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
16620 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
16630 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
16640 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
16650 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
16660 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
16670 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
16680 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
16690 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  nk;.  }..  /* Se
166a0 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74  tEndOfFile() ret
166b0 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  urns non-zero wh
166c0 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  en successful, o
166d0 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66  r zero when it f
166e0 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77  ails. */.  if( w
166f0 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65  inSeekFile(pFile
16700 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
16710 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
16720 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
16730 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
16740 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
16760 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70  winTruncate1", p
16770 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
16780 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53  }else if( 0==osS
16790 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c  etEndOfFile(pFil
167a0 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20  e->h) &&.       
167b0 20 20 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f       ((lastErrno
167c0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
167d0 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52  r())!=ERROR_USER
167e0 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b  _MAPPED_FILE) ){
167f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
16800 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
16810 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  o;.    rc = winL
16820 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
16830 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70  OERR_TRUNCATE, p
16840 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
16850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16860 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61        "winTrunca
16870 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
16880 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51  th);.  }..#if SQ
16890 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
168a0 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74 68 65  ZE>0.  /* If the
168b0 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e 63 61   file was trunca
168c0 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
168d0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
168e0 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61  urrently.  ** ma
168f0 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64  pped region, red
16900 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76  uce the effectiv
16910 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61  e mapping size a
16920 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77  s well. SQLite w
16930 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72 65 61  ill.  ** use rea
16940 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
16950 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
16960 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
16970 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20   from now on..  
16980 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16990 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20 6e 42  pMapRegion && nB
169a0 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
169b0 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ize ){.    pFile
169c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79  ->mmapSize = nBy
169d0 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  te;.  }.#endif..
169e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e    OSTRACE(("TRUN
169f0 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  CATE pid=%lu, pF
16a00 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
16a10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
16a20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
16a30 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
16a40 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
16a50 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
16a60 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
16a70 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
16a80 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43  ITE_TEST./*.** C
16a90 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
16aa0 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64  of fullsyncs and
16ab0 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20   normal syncs.  
16ac0 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
16ad0 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e  test.** that syn
16ae0 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73  cs and fullsyncs
16af0 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20 61 74   are occuring at
16b00 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
16b10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16b20 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
16b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
16b40 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
16b50 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
16b60 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
16b70 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
16b80 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
16b90 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
16ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
16bb0 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  nSync(sqlite3_fi
16bc0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67  le *id, int flag
16bd0 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s){.#ifndef SQLI
16be0 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a  TE_NO_SYNC.  /*.
16bf0 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79 20 77    ** Used only w
16c00 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  hen SQLITE_NO_SY
16c10 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  NC is not define
16c20 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20  d..   */.  BOOL 
16c30 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  rc;.#endif.#if !
16c40 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
16c50 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
16c60 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c  TE_NO_SYNC) || \
16c70 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c  .    defined(SQL
16c80 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
16c90 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  E).  /*.  ** Use
16ca0 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  d when SQLITE_NO
16cb0 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
16cc0 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68 65 20  ined and by the 
16cd0 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f 72 0a  assert() and/or.
16ce0 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29 20 6d    ** OSTRACE() m
16cf0 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20 20 77  acros..   */.  w
16d00 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
16d10 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 23 65  (winFile*)id;.#e
16d20 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
16d30 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65 6e 64  AMETER(id);.#end
16d40 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  if..  assert( pF
16d50 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68 65 63  ile );.  /* Chec
16d60 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51  k that one of SQ
16d70 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
16d80 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73   or FULL was pas
16d90 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  sed */.  assert(
16da0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
16db0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
16dc0 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73  .      || (flags
16dd0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
16de0 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20  YNC_FULL.  );.. 
16df0 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c   /* Unix cannot,
16e00 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d   but some system
16e10 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  s may return SQL
16e20 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65  ITE_FULL from he
16e30 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69  re. This.  ** li
16e40 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74 68  ne is to test th
16e50 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73  at doing so does
16e60 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70   not cause any p
16e70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20  roblems..  */.  
16e80 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
16e90 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16ea0 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20  LITE_FULL );..  
16eb0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70  OSTRACE(("SYNC p
16ec0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
16ed0 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73  , file=%p, flags
16ee0 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%x, lock=%d\n",
16ef0 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
16f00 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16f10 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
16f20 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20 20 20  e->h, flags,.   
16f30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
16f40 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 6e  ocktype));..#ifn
16f50 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16f60 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16f70 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c 73 65  ER(flags);.#else
16f80 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26 30 78  .  if( (flags&0x
16f90 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
16fa0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c  _FULL ){.    sql
16fb0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
16fc0 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c  unt++;.  }.  sql
16fd0 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
16fe0 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
16ff0 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
17000 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
17010 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
17020 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
17030 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23   ** no-op.  */.#
17040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f  ifdef SQLITE_NO_
17050 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45 28 28  SYNC.  OSTRACE((
17060 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d 25 6c  "SYNC-NOP pid=%l
17070 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
17080 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
17090 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
170a0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
170b0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
170c0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
170d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
170e0 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51 4c 49  ;.#else.#if SQLI
170f0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
17100 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
17110 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
17120 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56 69 65    if( osFlushVie
17130 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 70  wOfFile(pFile->p
17140 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20 29 7b  MapRegion, 0) ){
17150 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
17160 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d 25  "SYNC-MMAP pid=%
17170 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d  lu, pFile=%p, pM
17180 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72                "r
171a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
171b0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
171c0 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20 20  essId(),.       
171d0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20 70          pFile, p
171e0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
171f0 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
17200 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
17210 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
17220 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
17230 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d  OSTRACE(("SYNC-M
17240 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
17250 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
17260 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
17270 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
17280 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c  E_IOERR_MMAP\n",
17290 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
172a0 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20 20  cessId(),.      
172b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c 20           pFile, 
172c0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
172d0 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n));.      retur
172e0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
172f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c  LITE_IOERR_MMAP,
17300 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17310 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17320 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
17330 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  Sync1", pFile->z
17340 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
17350 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 6f  .#endif.  rc = o
17360 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  sFlushFileBuffer
17370 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 53  s(pFile->h);.  S
17380 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
17390 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20 69 66  rc=FALSE );.  if
173a0 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53 54 52  ( rc ){.    OSTR
173b0 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25  ACE(("SYNC pid=%
173c0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
173d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
173e0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
173f0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
17400 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
17410 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
17420 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17430 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
17440 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
17450 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17460 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f 53 54  Error();.    OST
17470 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d  RACE(("SYNC pid=
17480 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
17490 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
174a0 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c 6e 22  E_IOERR_FSYNC\n"
174b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
174c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
174d0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
174e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
174f0 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
17500 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
17510 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SYNC, pFile->las
17520 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
17540 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69 6c 65  winSync2", pFile
17550 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 23 65  ->zPath);.  }.#e
17560 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
17570 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72  termine the curr
17580 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69  ent size of a fi
17590 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73  le in bytes.*/.s
175a0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 69 6c  tatic int winFil
175b0 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  eSize(sqlite3_fi
175c0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
175d0 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  int64 *pSize){. 
175e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
175f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
17600 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
17610 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
17620 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
17630 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29 3b 0a  rt( pSize!=0 );.
17640 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
17650 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  r(return SQLITE_
17660 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a 20 20  IOERR_FSTAT);.  
17670 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
17680 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
17690 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
176a0 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c  Size));..#if SQL
176b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
176c0 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e 44 41  .    FILE_STANDA
176d0 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20  RD_INFO info;.  
176e0 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c 65 49    if( osGetFileI
176f0 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64  nformationByHand
17700 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 46  leEx(pFile->h, F
17710 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66 6f 2c  ileStandardInfo,
17720 0a 20 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 26 69 6e 66 6f 2c 20 73 69 7a        &info, siz
17750 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a 20 20  eof(info)) ){.  
17760 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69 6e 66      *pSize = inf
17770 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75 61 64  o.EndOfFile.Quad
17780 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Part;.    }else{
17790 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
177a0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
177b0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
177c0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
177d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
177e0 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
177f0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
17800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17810 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
17820 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17830 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20    }.  }.#else.  
17840 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70 70 65  {.    DWORD uppe
17850 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44  rBits;.    DWORD
17860 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20   lowerBits;.    
17870 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
17880 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74 73 20  ..    lowerBits 
17890 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a 65 28  = osGetFileSize(
178a0 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70 65 72  pFile->h, &upper
178b0 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53 69 7a  Bits);.    *pSiz
178c0 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33 5f 69  e = (((sqlite3_i
178d0 6e 74 36 34 29 75 70 70 65 72 42 69 74 73 29 3c  nt64)upperBits)<
178e0 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
178f0 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c 6f 77  ;.    if(   (low
17900 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41 4c 49  erBits == INVALI
17910 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20 20 20  D_FILE_SIZE).   
17920 20 20 20 20 26 26 20 28 28 6c 61 73 74 45 72 72      && ((lastErr
17930 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
17940 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52  ror())!=NO_ERROR
17950 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
17960 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
17970 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
17980 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
17990 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
179a0 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AT, pFile->lastE
179b0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
179d0 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c  nFileSize", pFil
179e0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
179f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
17a00 54 52 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c  TRACE(("SIZE fil
17a10 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70 2c 20  e=%p, pSize=%p, 
17a20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d  *pSize=%lld, rc=
17a30 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
17a40 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a    pFile->h, pSiz
17a50 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c 69 74  e, *pSize, sqlit
17a60 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
17a70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17a80 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f  ./*.** LOCKFILE_
17a90 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
17aa0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 6f 6e   is undefined on
17ab0 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20 73 79   some Windows sy
17ac0 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
17ad0 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f  f LOCKFILE_FAIL_
17ae0 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20 64 65  IMMEDIATELY.# de
17af0 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  fine LOCKFILE_FA
17b00 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 31  IL_IMMEDIATELY 1
17b10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
17b20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
17b30 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e  IVE_LOCK.# defin
17b40 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55  e LOCKFILE_EXCLU
17b50 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64  SIVE_LOCK 2.#end
17b60 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72  if../*.** Histor
17b70 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65 20 68  ically, SQLite h
17b80 61 73 20 75 73 65 64 20 62 6f 74 68 20 74 68 65  as used both the
17b90 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20 4c 6f   LockFile and Lo
17ba0 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
17bb0 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ns..** When the 
17bc0 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74 69 6f  LockFile functio
17bd0 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74 20 77  n was used, it w
17be0 61 73 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  as always expect
17bf0 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d  ed to fail.** im
17c00 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74 68 65  mediately if the
17c10 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
17c20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20 41 6c  be obtained.  Al
17c30 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20 65 78  so, it always ex
17c40 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f 62 74  pected to.** obt
17c50 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ain an exclusive
17c60 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20 66 6c   lock.  These fl
17c70 61 67 73 20 61 72 65 20 75 73 65 64 20 77 69 74  ags are used wit
17c80 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  h the LockFileEx
17c90 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64   function.** and
17ca0 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65 20 65   reflect those e
17cb0 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74 68 65  xpectations; the
17cc0 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73 68 6f  refore, they sho
17cd0 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61 6e 67  uld not be chang
17ce0 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
17cf0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46  QLITE_LOCKFILE_F
17d00 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51  LAGS.# define SQ
17d10 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17d20 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c 45 5f  AGS   (LOCKFILE_
17d30 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
17d40 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20   | \.           
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 4c 4f 43 4b 46 49 4c 45 5f         LOCKFILE_
17d70 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a  EXCLUSIVE_LOCK).
17d80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75  #endif../*.** Cu
17d90 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74 65 20  rrently, SQLite 
17da0 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68 65 20  never calls the 
17db0 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
17dc0 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61 6e 74  ion without want
17dd0 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20  ing the.** call 
17de0 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69 61 74  to fail immediat
17df0 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ely if the lock 
17e00 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
17e10 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ed..*/.#ifndef S
17e20 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
17e30 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
17e40 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
17e50 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46 49 4c  X_FLAGS (LOCKFIL
17e60 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17e70 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  LY).#endif../*.*
17e80 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61 64  * Acquire a read
17e90 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66  er lock..** Diff
17ea0 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74 69 6e  erent API routin
17eb0 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20 64 65  es are called de
17ec0 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
17ed0 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73 0a 2a  er or not this.*
17ee0 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20 57 69  * is Win9x or Wi
17ef0 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nNT..*/.static i
17f00 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  nt winGetReadLoc
17f10 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
17f20 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
17f30 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4c  OSTRACE(("READ-L
17f40 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
17f50 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
17f60 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
17f70 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
17f80 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
17f90 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20  TE_OS_WINCE.    
17fa0 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
17fb0 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61  Windows CE is ha
17fc0 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c  ndled differentl
17fd0 79 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c  y here due its l
17fe0 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32  ack of the Win32
17ff0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 50  .    **       AP
18000 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a 20 20  I LockFileEx..  
18010 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 77    */.    res = w
18020 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26 70 46  inceLockFile(&pF
18030 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
18040 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  IRST, 0, 1, 0);.
18050 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20 3d 20  #else.    res = 
18060 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
18070 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
18080 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 20  CKFILEEX_FLAGS, 
18090 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
180a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
180b0 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49         SHARED_SI
180c0 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  ZE, 0);.#endif. 
180d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
180e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
180f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20    else{.    int 
18100 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lk;.    sqlite3_
18110 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
18120 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20 20  f(lk), &lk);.   
18130 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
18140 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72 74 29  ckByte = (short)
18150 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66  ((lk & 0x7ffffff
18160 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  f)%(SHARED_SIZE 
18170 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73 20 3d  - 1));.    res =
18180 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
18190 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
181a0 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20  OCKFILE_FLAGS,. 
181b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181c0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
181d0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
181e0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
181f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
18200 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29 7b 0a  if( res == 0 ){.
18210 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
18220 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18230 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f 2a 20  Error();.    /* 
18240 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67 20 61  No need to log a
18250 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f 63 6b   failure to lock
18260 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43   */.  }.  OSTRAC
18270 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69  E(("READ-LOCK fi
18280 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
18290 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
182a0 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  es));.  return r
182b0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64  es;.}../*.** Und
182c0 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a  o a readlock.*/.
182d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
182e0 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77 69 6e  lockReadLock(win
182f0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
18300 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f 52 44  int res;.  DWORD
18310 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 4f 53   lastErrno;.  OS
18320 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c  TRACE(("READ-UNL
18330 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
18340 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  k=%d\n", pFile->
18350 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
18360 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73 49 73  pe));.  if( osIs
18370 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65 73 20  NT() ){.    res 
18380 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
18390 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
183a0 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52  D_FIRST, 0, SHAR
183b0 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 7d  ED_SIZE, 0);.  }
183c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
183d0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
183e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
183f0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
18400 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f  File->h, SHARED_
18410 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61  FIRST+pFile->sha
18420 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20  redLockByte, 0, 
18430 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  1, 0);.  }.#endi
18440 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26  f.  if( res==0 &
18450 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20  & ((lastErrno = 
18460 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
18470 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43  )!=ERROR_NOT_LOC
18480 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  KED) ){.    pFil
18490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
184a0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
184b0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
184c0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70  _IOERR_UNLOCK, p
184d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
184e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
184f0 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c   "winUnlockReadL
18500 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ock", pFile->zPa
18510 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  th);.  }.  OSTRA
18520 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b  CE(("READ-UNLOCK
18530 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
18540 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
18550 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72  , res));.  retur
18560 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
18570 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
18580 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
18590 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
185a0 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20 6f 6e  er locktype - on
185b0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
185c0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
185d0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
185e0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
185f0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
18600 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
18610 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
18620 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
18630 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
18640 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
18650 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
18660 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
18670 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
18680 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
18690 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
186a0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
186b0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
186c0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
186d0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
186e0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
186f0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
18700 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
18710 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
18720 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
18730 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
18740 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
18750 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
18760 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
18770 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
18780 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
18790 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
187a0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
187b0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
187c0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
187d0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
187e0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
187f0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
18800 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
18810 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
18820 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
18830 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
18840 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65 20 77  e a lock.  The w
18850 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75 74 69  inUnlock() routi
18860 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61 6c 6c  ne.** erases all
18870 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65 20 61   locks at once a
18880 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20 69 6d  nd returns us im
18890 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c 6f 63  mediately to loc
188a0 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a  king level 0..**
188b0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
188c0 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74 68 65  ble to lower the
188d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
188e0 6e 65 20 73 74 65 70 20 61 74 20 61 20 74 69 6d  ne step at a tim
188f0 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73 74 20  e.  You.** must 
18900 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f 20 6c  go straight to l
18910 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
18920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
18930 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nLock(sqlite3_fi
18940 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
18950 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
18960 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
18970 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
18980 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
18990 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
189a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
189b0 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e 64 6f  esult of a Windo
189c0 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
189d0 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
189e0 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
189f0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
18a00 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65  to this value be
18a10 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a  fore exiting */.
18a20 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67    int gotPending
18a30 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65  Lock = 0;/* True
18a40 20 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20   if we acquired 
18a50 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
18a60 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69  his time */.  wi
18a70 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
18a80 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 44  winFile*)id;.  D
18a90 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
18aa0 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
18ab0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
18ac0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
18ad0 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
18ae0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
18af0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
18b00 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
18b10 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
18b20 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
18b30 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
18b40 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
18b50 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
18b60 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
18b70 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
18b80 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f  ve on the.  ** O
18b90 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  sFile, do nothin
18ba0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
18bb0 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
18bc0 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71  path, as.  ** sq
18bd0 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65  lite3OsEnterMute
18be0 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
18bf0 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
18c00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f  .  if( pFile->lo
18c10 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65  cktype>=locktype
18c20 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
18c30 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69 6c 65  ("LOCK-HELD file
18c40 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
18c50 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
18c60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18c70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
18c80 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
18c90 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69 74 65  ny kind of write
18ca0 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61 64 2d  -lock on a read-
18cb0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a 20 20  only database.  
18cc0 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
18cd0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
18ce0 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d 30 20  FILE_RDONLY)!=0 
18cf0 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  && locktype>=RES
18d00 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
18d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18d20 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  IOERR_LOCK;.  }.
18d30 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
18d40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
18d50 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
18d60 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
18d70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d  File->locktype!=
18d80 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74  NO_LOCK || lockt
18d90 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
18db0 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f  cktype!=PENDING_
18dc0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
18dd0 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45 53 45  ( locktype!=RESE
18de0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
18df0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  le->locktype==SH
18e00 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
18e10 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44  /* Lock the PEND
18e20 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66  ING_LOCK byte if
18e30 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63 71 75   we need to acqu
18e40 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
18e50 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41  ck or.  ** a SHA
18e60 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65  RED lock.  If we
18e70 20 61 72 65 20 61 63 71 75 69 72 69 6e 67 20 61   are acquiring a
18e80 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
18e90 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6f 66  e acquisition of
18ea0 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e  .  ** the PENDIN
18eb0 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73 20 74  G_LOCK byte is t
18ec0 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20  emporary..  */. 
18ed0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70   newLocktype = p
18ee0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a  File->locktype;.
18ef0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
18f00 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20  ktype==NO_LOCK. 
18f10 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d    || (locktype==
18f20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
18f30 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  & pFile->locktyp
18f40 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  e<=RESERVED_LOCK
18f50 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  ).  ){.    int c
18f60 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c  nt = 3;.    whil
18f70 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
18f80 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
18f90 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
18fa0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
18fb0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
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 50 45 4e 44              PEND
18fe0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
18ff0 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
19000 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74  /* Try 3 times t
19010 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e  o get the pendin
19020 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73  g lock.  This is
19030 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a   needed to work.
19040 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20        ** around 
19050 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20  problems caused 
19060 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f  by indexing and/
19070 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f  or anti-virus so
19080 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20  ftware on.      
19090 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  ** Windows syste
190a0 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20  ms..      ** If 
190b0 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68  you are using th
190c0 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64  is code as a mod
190d0 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69  el for alternati
190e0 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74  ve VFSes, do not
190f0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74  .      ** copy t
19100 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e  his retry logic.
19110 20 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69    It is a hack i
19120 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64  ntended for Wind
19130 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ows only..      
19140 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  */.      lastErr
19150 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
19160 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54  ror();.      OST
19170 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44  RACE(("LOCK-PEND
19180 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  ING-FAIL file=%p
19190 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75  , count=%d, resu
191a0 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  lt=%d\n",.      
191b0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
191c0 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20  h, cnt, res));. 
191d0 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72       if( lastErr
191e0 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49  no==ERROR_INVALI
191f0 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20  D_HANDLE ){.    
19200 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
19210 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
19220 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
19230 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
19240 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
19250 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69  E(("LOCK-FAIL fi
19260 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c  le=%p, count=%d,
19270 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
19280 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
19290 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74  e->h, cnt, sqlit
192a0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
192b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
192c0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
192d0 20 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69    if( cnt ) sqli
192e0 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28  te3_win32_sleep(
192f0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  1);.    }.    go
19300 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72  tPendingLock = r
19310 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73  es;.    if( !res
19320 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72   ){.      lastEr
19330 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
19340 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20  rror();.    }.  
19350 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
19360 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20  a shared lock.  
19370 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
19380 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
19390 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73  & res ){.    ass
193a0 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ert( pFile->lock
193b0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  type==NO_LOCK );
193c0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65  .    res = winGe
193d0 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
193e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
193f0 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
19400 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  pe = SHARED_LOCK
19410 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19420 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
19430 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
19440 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19450 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
19460 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
19470 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
19480 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
19490 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
194a0 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
194b0 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e==SHARED_LOCK )
194c0 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
194d0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
194e0 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
194f0 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56  LE_FLAGS, RESERV
19500 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  ED_BYTE, 0, 1, 0
19510 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
19520 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
19530 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c  ype = RESERVED_L
19540 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
19550 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
19560 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
19570 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ();.    }.  }.. 
19580 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45   /* Acquire a PE
19590 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  NDING lock.  */.
195a0 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
195b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
195c0 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77  & res ){.    new
195d0 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49  Locktype = PENDI
195e0 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74  NG_LOCK;.    got
195f0 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b  PendingLock = 0;
19600 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69  .  }..  /* Acqui
19610 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  re an EXCLUSIVE 
19620 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lock.  */.  if( 
19630 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53  locktype==EXCLUS
19640 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  IVE_LOCK && res 
19650 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
19660 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
19670 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19680 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
19690 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
196a0 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
196b0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
196c0 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
196d0 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45  ILE_FLAGS, SHARE
196e0 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20  D_FIRST, 0,.    
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30    SHARED_SIZE, 0
19710 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29  );.    if( res )
19720 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74  {.      newLockt
19730 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f  ype = EXCLUSIVE_
19740 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
19750 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f  .      lastErrno
19760 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
19770 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65  r();.      winGe
19780 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
19790 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
197a0 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64  * If we are hold
197b0 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ing a PENDING lo
197c0 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f  ck that ought to
197d0 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68   be released, th
197e0 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20  en.  ** release 
197f0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69  it now..  */.  i
19800 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  f( gotPendingLoc
19810 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53  k && locktype==S
19820 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
19830 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
19840 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49  &pFile->h, PENDI
19850 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
19860 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64  );.  }..  /* Upd
19870 61 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ate the state of
19880 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65   the lock has he
19890 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64  ld in the file d
198a0 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20  escriptor then. 
198b0 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61   ** return the a
198c0 70 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c  ppropriate resul
198d0 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69  t code..  */.  i
198e0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63  f( res ){.    rc
198f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19900 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
19910 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
19920 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  stErrno;.    rc 
19930 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
19940 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
19950 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
19960 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25  wanted=%d, got=%
19970 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
19980 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63     pFile->h, loc
19990 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79  ktype, newLockty
199a0 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c  pe));.  }.  pFil
199b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75  e->locktype = (u
199c0 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20  8)newLocktype;. 
199d0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
199e0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
199f0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
19a00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
19a10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
19a20 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
19a30 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
19a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
19a50 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
19a60 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
19a70 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
19a80 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
19a90 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
19aa0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
19ab0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
19ac0 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
19ad0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  , return.** non-
19ae0 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20  zero, otherwise 
19af0 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
19b00 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65  int winCheckRese
19b10 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
19b20 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
19b30 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
19b40 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  res;.  winFile *
19b50 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
19b60 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
19b70 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
19b80 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
19b90 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
19ba0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
19bb0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
19bc0 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
19bd0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
19be0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73  ResOut));..  ass
19bf0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
19c00 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  if( pFile->lockt
19c10 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
19c20 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  CK ){.    res = 
19c30 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  1;.    OSTRACE((
19c40 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
19c50 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
19c60 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69   (local)\n", pFi
19c70 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
19c80 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d  }else{.    res =
19c90 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46   winLockFile(&pF
19ca0 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c  ile->h, SQLITE_L
19cb0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c  OCKFILEEX_FLAGS,
19cc0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c  RESERVED_BYTE,0,
19cd0 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65  1,0);.    if( re
19ce0 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e  s ){.      winUn
19cf0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
19d00 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
19d10 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20  E, 0, 1, 0);.   
19d20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65   }.    res = !re
19d30 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  s;.    OSTRACE((
19d40 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
19d50 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64  le=%p, result=%d
19d60 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46   (remote)\n", pF
19d70 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
19d80 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
19d90 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  res;.  OSTRACE((
19da0 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69  "TEST-WR-LOCK fi
19db0 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25  le=%p, pResOut=%
19dc0 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20  p, *pResOut=%d, 
19dd0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
19de0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
19df0 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a  e->h, pResOut, *
19e00 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74  pResOut));.  ret
19e10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19e20 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
19e30 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
19e40 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
19e50 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70  or id to locktyp
19e60 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20  e.  locktype.** 
19e70 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
19e80 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
19e90 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
19ea0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
19eb0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
19ec0 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
19ed0 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
19ee0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
19ef0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
19f00 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
19f10 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
19f20 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
19f30 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  e for this routi
19f40 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68  ne to fail if th
19f50 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
19f60 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e  t.** is NO_LOCK.
19f70 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20    If the second 
19f80 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52  argument is SHAR
19f90 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69  ED_LOCK then thi
19fa0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67  s routine.** mig
19fb0 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
19fc0 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69  _IOERR;.*/.stati
19fd0 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28  c int winUnlock(
19fe0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19ff0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
1a000 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77  .  int type;.  w
1a010 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
1a020 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
1a030 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a040 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46  OK;.  assert( pF
1a050 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ile!=0 );.  asse
1a060 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48  rt( locktype<=SH
1a070 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f  ARED_LOCK );.  O
1a080 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
1a090 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b  file=%p, oldLock
1a0a0 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b  =%d(%d), newLock
1a0b0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
1a0c0 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69     pFile->h, pFi
1a0d0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46  le->locktype, pF
1a0e0 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
1a0f0 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b  yte, locktype));
1a100 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d  .  type = pFile-
1a110 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28  >locktype;.  if(
1a120 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45   type>=EXCLUSIVE
1a130 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
1a140 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1a150 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  e->h, SHARED_FIR
1a160 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49  ST, 0, SHARED_SI
1a170 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ZE, 0);.    if( 
1a180 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
1a190 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74  _LOCK && !winGet
1a1a0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20  ReadLock(pFile) 
1a1b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1a1c0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61   should never ha
1a1d0 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64  ppen.  We should
1a1e0 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20   always be able 
1a1f0 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63  to.      ** reac
1a200 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c  quire the read l
1a210 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  ock */.      rc 
1a220 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
1a230 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
1a240 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  K, osGetLastErro
1a250 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1a260 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
1a270 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  Unlock", pFile->
1a280 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
1a290 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45  }.  if( type>=RE
1a2a0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
1a2b0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
1a2c0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
1a2d0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
1a2e0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c   0);.  }.  if( l
1a2f0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
1a300 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
1a310 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
1a320 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70  UnlockReadLock(p
1a330 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  File);.  }.  if(
1a340 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c   type>=PENDING_L
1a350 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
1a360 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1a370 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
1a380 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
1a390 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
1a3a0 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65  e = (u8)locktype
1a3b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
1a3c0 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f  LOCK file=%p, lo
1a3d0 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c  ck=%d, rc=%s\n",
1a3e0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
1a3f0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
1a400 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72  ktype, sqlite3Er
1a410 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
1a420 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn 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 0a 2a 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 20 4e 6f 2d 6f  *********** No-o
1a4a0 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  p 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 0a 2a 2a 0a  ************.**.
1a4d0 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75  ** Of the variou
1a4e0 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  s locking implem
1a4f0 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61  entations availa
1a500 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20  ble, this is by 
1a510 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c  far the.** simpl
1a520 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73  est:  locking is
1a530 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74   ignored.  No at
1a540 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
1a550 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61   lock the databa
1a560 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72  se.** file for r
1a570 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1a580 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f  g..**.** This lo
1a590 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70  cking mode is ap
1a5a0 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73  propriate for us
1a5b0 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64  e on read-only d
1a5c0 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a  atabases.** (ex:
1a5d0 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20   databases that 
1a5e0 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20  are burned into 
1a5f0 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d  CD-ROM, for exam
1a600 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a  ple.)  It can.**
1a610 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66   also be used if
1a620 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
1a630 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78   employs some ex
1a640 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d  ternal mechanism
1a650 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73   to.** prevent s
1a660 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65  imultaneous acce
1a670 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64  ss of the same d
1a680 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f  atabase by two o
1a690 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61  r more.** databa
1a6a0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  se connections. 
1a6b0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
1a6c0 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20  serious risk of 
1a6d0 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72  database.** corr
1a6e0 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c  uption if this l
1a6f0 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75  ocking mode is u
1a700 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e  sed in situation
1a710 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65  s where multiple
1a720 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e  .** database con
1a730 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63  nections are acc
1a740 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
1a750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
1a760 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d   the same.** tim
1a770 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  e and one or mor
1a780 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
1a790 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69  ctions are writi
1a7a0 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  ng..*/..static i
1a7b0 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63 6b  nt winNolockLock
1a7c0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1a7d0 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29  d, int locktype)
1a7e0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
1a7f0 45 54 45 52 28 69 64 29 3b 0a 20 20 55 4e 55 53  ETER(id);.  UNUS
1a800 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6c 6f 63  ED_PARAMETER(loc
1a810 6b 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e  ktype);.  return
1a820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
1a830 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f 6c  tatic int winNol
1a840 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
1a850 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
1a860 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
1a870 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Out){.  UNUSED_P
1a880 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20  ARAMETER(id);.  
1a890 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a8a0 28 70 52 65 73 4f 75 74 29 3b 0a 20 20 72 65 74  (pResOut);.  ret
1a8b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1a8c0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ..static int win
1a8d0 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  NolockUnlock(sql
1a8e0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1a8f0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
1a900 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a910 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (id);.  UNUSED_P
1a920 41 52 41 4d 45 54 45 52 28 6c 6f 63 6b 74 79 70  ARAMETER(locktyp
1a930 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
1a940 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  ITE_OK;.}../****
1a950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1a960 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
1a970 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
1a980 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
1a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 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 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
1a9f0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1aa00 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1aa10 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1aa20 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1aa30 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1aa40 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1aa50 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1aa60 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1aa70 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1aa80 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1aa90 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1aaa0 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1aab0 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1aac0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1aad0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1aae0 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
1aaf0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
1ab00 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
1ab10 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
1ab20 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
1ab30 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
1ab40 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
1ab50 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
1ab60 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
1ab70 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1ab80 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
1ab90 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1aba0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
1abb0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
1abc0 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1abd0 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
1abe0 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
1abf0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
1ac00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1ac10 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
1ac20 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
1ac30 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
1ac40 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
1ac50 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
1ac60 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
1ac70 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
1ac80 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
1ac90 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
1aca0 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
1acb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
1acc0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
1acd0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1ace0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
1acf0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
1ad00 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
1ad10 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
1ad20 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
1ad30 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
1ad40 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
1ad50 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
1ad60 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
1ad70 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1ad80 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1ad90 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1ada0 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1adb0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
1adc0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1add0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1ade0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1adf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1ae00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1ae10 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ae20 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1ae30 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1ae40 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1ae50 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
1ae60 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
1ae70 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1ae80 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1ae90 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1aea0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1aeb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1aec0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1aed0 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1aee0 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
1aef0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
1af00 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1af10 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1af20 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1af30 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1af40 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1af50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1af60 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1af70 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1af80 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
1af90 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1afa0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1afb0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
1afc0 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
1afd0 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1afe0 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
1aff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1b010 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1b020 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
1b030 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
1b040 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
1b050 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
1b060 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
1b070 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b080 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
1b090 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1b0a0 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
1b0b0 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
1b0c0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1b0d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b0e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b0f0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b100 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
1b110 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
1b120 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1b130 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
1b140 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1b150 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b160 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b170 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1b180 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1b190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b1a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1b1b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1b1c0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1b1d0 20 20 20 20 69 6e 74 20 62 50 65 72 73 69 73 74      int bPersist
1b1e0 20 3d 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a   = *(int*)pArg;.
1b1f0 20 20 20 20 20 20 69 66 28 20 62 50 65 72 73 69        if( bPersi
1b200 73 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  st<0 ){.        
1b210 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1b220 69 6c 65 2d 3e 62 50 65 72 73 69 73 74 57 61 6c  ile->bPersistWal
1b230 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1b240 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 62 50         pFile->bP
1b250 65 72 73 69 73 74 57 61 6c 20 3d 20 62 50 65 72  ersistWal = bPer
1b260 73 69 73 74 21 3d 30 3b 0a 20 20 20 20 20 20 7d  sist!=0;.      }
1b270 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b280 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b290 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b2a0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
1b2b0 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64  : {.      winMod
1b2c0 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46  eBit(pFile, WINF
1b2d0 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1b2e0 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1b2f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1b300 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1b310 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1b320 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1b330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b350 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1b360 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1b370 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f  E: {.      winMo
1b380 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e  deBit(pFile, WIN
1b390 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
1b3a0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
1b3b0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1b3c0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1b3d0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1b3e0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b3f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b400 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1b410 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a  E_FCNTL_VFSNAME:
1b420 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a   {.      *(char*
1b430 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33  *)pArg = sqlite3
1b440 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70  _mprintf("%s", p
1b450 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d  File->pVfs->zNam
1b460 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  e);.      OSTRAC
1b470 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25  E(("FCNTL file=%
1b480 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
1b490 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1b4a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b4b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b4c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1b4d0 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
1b4e0 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  RY: {.      int 
1b4f0 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b  *a = (int*)pArg;
1b500 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e  .      if( a[0]>
1b510 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e  0 ){.        win
1b520 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30  IoerrRetry = a[0
1b530 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  ];.      }else{.
1b540 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77          a[0] = w
1b550 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20  inIoerrRetry;.  
1b560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1b570 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20  a[1]>0 ){.      
1b580 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44    winIoerrRetryD
1b590 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20  elay = a[1];.   
1b5a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b5b0 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72    a[1] = winIoer
1b5c0 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20  rRetryDelay;.   
1b5d0 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1b5e0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1b5f0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1b600 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1b610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b630 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b640 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48  CNTL_WIN32_GET_H
1b650 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c  ANDLE: {.      L
1b660 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d  PHANDLE phFile =
1b670 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b   (LPHANDLE)pArg;
1b680 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65 20 3d  .      *phFile =
1b690 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20 20   pFile->h;.     
1b6a0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1b6b0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1b6c0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1b6d0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1b6e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b6f0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
1b700 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73 65  TE_TEST.    case
1b710 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1b720 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a 20  N32_SET_HANDLE: 
1b730 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c 45  {.      LPHANDLE
1b740 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41 4e   phFile = (LPHAN
1b750 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20 20  DLE)pArg;.      
1b760 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65 20  HANDLE hOldFile 
1b770 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20 20  = pFile->h;.    
1b780 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70 68    pFile->h = *ph
1b790 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68 46  File;.      *phF
1b7a0 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b 0a  ile = hOldFile;.
1b7b0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b7c0 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25 70  FCNTL oldFile=%p
1b7d0 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72 63  , newFile=%p, rc
1b7e0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4f                hO
1b800 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68  ldFile, pFile->h
1b810 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1b820 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b830 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
1b840 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
1b850 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20  EMPFILENAME: {. 
1b860 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c       char *zTFil
1b870 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  e = 0;.      int
1b880 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70   rc = winGetTemp
1b890 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
1b8a0 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  , &zTFile);.    
1b8b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b8c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  _OK ){.        *
1b8d0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
1b8e0 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
1b8f0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1b900 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1b910 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1b920 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1b930 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1b940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1b950 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1b960 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61  AP_SIZE>0.    ca
1b970 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b980 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  MMAP_SIZE: {.   
1b990 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20     i64 newLimit 
1b9a0 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20  = *(i64*)pArg;. 
1b9b0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51       int rc = SQ
1b9c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
1b9d0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69  f( newLimit>sqli
1b9e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b9f0 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20  mxMmap ){.      
1ba00 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c    newLimit = sql
1ba10 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ba20 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d  .mxMmap;.      }
1ba30 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  ..      /* The v
1ba40 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74  alue of newLimit
1ba50 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c   may be eventual
1ba60 6c 79 20 63 61 73 74 20 74 6f 20 28 53 49 5a 45  ly cast to (SIZE
1ba70 5f 54 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20  _T) and passed. 
1ba80 20 20 20 20 20 2a 2a 20 74 6f 20 4d 61 70 56 69       ** to MapVi
1ba90 65 77 4f 66 46 69 6c 65 28 29 2e 20 52 65 73 74  ewOfFile(). Rest
1baa0 72 69 63 74 20 69 74 73 20 76 61 6c 75 65 20 74  rict its value t
1bab0 6f 20 32 47 42 20 69 66 20 28 53 49 5a 45 5f 54  o 2GB if (SIZE_T
1bac0 29 20 69 73 20 6e 6f 74 20 61 74 0a 20 20 20 20  ) is not at.    
1bad0 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 36 34 2d    ** least a 64-
1bae0 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  bit type. */.   
1baf0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1bb00 30 20 26 26 20 73 69 7a 65 6f 66 28 53 49 5a 45  0 && sizeof(SIZE
1bb10 5f 54 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20  _T)<8 ){.       
1bb20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77   newLimit = (new
1bb30 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46 46 46  Limit & 0x7FFFFF
1bb40 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  FF);.      }..  
1bb50 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20      *(i64*)pArg 
1bb60 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1bb70 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20  eMax;.      if( 
1bb80 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e  newLimit>=0 && n
1bb90 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e  ewLimit!=pFile->
1bba0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70  mmapSizeMax && p
1bbb0 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  File->nFetchOut=
1bbc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1bbd0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  ile->mmapSizeMax
1bbe0 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20   = newLimit;.   
1bbf0 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e       if( pFile->
1bc00 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20  mmapSize>0 ){.  
1bc10 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d 61 70          winUnmap
1bc20 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  file(pFile);.   
1bc30 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4d         rc = winM
1bc40 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1bc50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1bc60 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41     }.      OSTRA
1bc70 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1bc80 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46  %p, rc=%s\n", pF
1bc90 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
1bca0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1bcb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1bcc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
1bcd0 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1bce0 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
1bcf0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c 6e 22  LITE_NOTFOUND\n"
1bd00 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1bd10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
1bd20 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
1bd30 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
1bd40 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
1bd50 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1bd60 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
1bd70 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
1bd80 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
1bd90 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
1bda0 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
1bdb0 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
1bdc0 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
1bdd0 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
1bde0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
1bdf0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
1be00 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
1be10 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
1be20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
1be30 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
1be40 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
1be50 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
1be60 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
1be70 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
1be80 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
1be90 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
1bea0 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
1beb0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
1bec0 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f 72 53  c int winSectorS
1bed0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1bee0 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64 29 69   *id){.  (void)i
1bef0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1bf00 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
1bf10 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  R_SIZE;.}../*.**
1bf20 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f 72   Return a vector
1bf30 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72 61   of device chara
1bf40 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a 73  cteristics..*/.s
1bf50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 76  tatic int winDev
1bf60 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1bf70 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
1bf80 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  *id){.  winFile 
1bf90 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  *p = (winFile*)i
1bfa0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
1bfb0 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c 45 54  TE_IOCAP_UNDELET
1bfc0 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e 20 7c  ABLE_WHEN_OPEN |
1bfd0 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d 3e 63  .         ((p->c
1bfe0 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49  trlFlags & WINFI
1bff0 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54 45 5f  LE_PSOW)?SQLITE_
1c000 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
1c010 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a 7d 0a  OVERWRITE:0);.}.
1c020 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 77  ./*.** Windows w
1c030 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79 6f 75  ill only let you
1c040 20 63 72 65 61 74 65 20 66 69 6c 65 20 76 69 65   create file vie
1c050 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20 6f 6e  w mappings.** on
1c060 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
1c070 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62 6f 75   granularity bou
1c080 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75 72 69  ndaries..** Duri
1c090 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  ng sqlite3_os_in
1c0a0 69 74 28 29 20 77 65 20 64 6f 20 61 20 47 65 74  it() we do a Get
1c0b0 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a 2a 20  SystemInfo().** 
1c0c0 74 6f 20 67 65 74 20 74 68 65 20 67 72 61 6e 75  to get the granu
1c0d0 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a 2f 0a  larity size..*/.
1c0e0 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f 49 4e  static SYSTEM_IN
1c0f0 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b 0a 0a  FO winSysInfo;..
1c100 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c110 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48  MIT_WAL../*.** H
1c120 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  elper functions 
1c130 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72 65  to obtain and re
1c140 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67 6c 6f  linquish the glo
1c150 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65 0a 2a  bal mutex. The.*
1c160 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 69  * global mutex i
1c170 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74 65 63  s used to protec
1c180 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49 6e 66  t the winLockInf
1c190 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62  o objects used b
1c1a0 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65 2c 20  y.** this file, 
1c1b0 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
1c1c0 20 62 65 20 73 68 61 72 65 64 20 62 79 20 6d 75   be shared by mu
1c1d0 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
1c1e0 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 77  **.** Function w
1c1f0 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29  inShmMutexHeld()
1c200 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
1c210 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
1c220 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20 69 73  obal mutex.** is
1c230 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69   held when requi
1c240 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69  red. This functi
1c250 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
1c260 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
1c270 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  t().** statement
1c280 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
1c290 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1c2a0 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
1c2b0 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  ( winShmMutexHel
1c2c0 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69 6e 53  d() );.**   winS
1c2d0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29 0a 2a  hmLeaveMutex().*
1c2e0 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
1c2f0 5f 6d 75 74 65 78 20 2a 77 69 6e 42 69 67 4c 6f  _mutex *winBigLo
1c300 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76  ck = 0;.static v
1c310 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  oid winShmEnterM
1c320 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
1c330 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c340 72 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b 0a 7d  r(winBigLock);.}
1c350 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1c360 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  ShmLeaveMutex(vo
1c370 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
1c380 75 74 65 78 5f 6c 65 61 76 65 28 77 69 6e 42 69  utex_leave(winBi
1c390 67 4c 6f 63 6b 29 3b 0a 7d 0a 23 69 66 6e 64 65  gLock);.}.#ifnde
1c3a0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
1c3b0 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
1c3c0 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
1c3d0 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1c3e0 65 78 5f 68 65 6c 64 28 77 69 6e 42 69 67 4c 6f  ex_held(winBigLo
1c3f0 63 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ck);.}.#endif../
1c400 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
1c410 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20   to represent a 
1c420 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65 6e  single file open
1c430 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20 74  ed and mmapped t
1c440 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68 61  o provide.** sha
1c450 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65  red memory.  Whe
1c460 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  n multiple threa
1c470 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  ds all reference
1c480 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f 67   the same.** log
1c490 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20 74  -summary, each t
1c4a0 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f 77  hread has its ow
1c4b0 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63 74  n winFile object
1c4c0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a 2a  , but they all.*
1c4d0 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  * point to a sin
1c4e0 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  gle instance of 
1c4f0 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49 6e  this object.  In
1c500 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
1c510 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72  ch.** log-summar
1c520 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c 79  y is opened only
1c530 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
1c540 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d 4d  s..**.** winShmM
1c550 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20  utexHeld() must 
1c560 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65  be true when cre
1c570 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79  ating or destroy
1c580 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65  ing.** this obje
1c590 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64  ct or while read
1c5a0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1c5b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65  he following fie
1c5c0 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  lds:.**.**      
1c5d0 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e 65  nRef.**      pNe
1c5e0 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  xt.**.** The fol
1c5f0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1c600 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
1c610 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
1c620 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20  created:.**.**  
1c630 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
1c640 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
1c650 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f 64  Either winShmNod
1c660 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  e.mutex must be 
1c670 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e 6f  held or winShmNo
1c680 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a  de.nRef==0 and.*
1c690 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c  * winShmMutexHel
1c6a0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
1c6b0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
1c6c0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
1c6d0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
1c6e0 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f 0a  tructure..**.*/.
1c6f0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1c700 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e {.  sqlite3_mu
1c710 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
1c720 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
1c730 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
1c740 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
1c750 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
1c760 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
1c770 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65  ile */.  winFile
1c780 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20   hFile;         
1c790 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64      /* File hand
1c7a0 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e 20  le from winOpen 
1c7b0 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67 69  */..  int szRegi
1c7c0 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1c7d0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72   /* Size of shar
1c7e0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
1c7f0 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 69  s */.  int nRegi
1c800 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
1c810 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72    /* Size of arr
1c820 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20  ay apRegion */. 
1c830 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20   u8 isReadonly; 
1c840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c850 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79  rue if read-only
1c860 20 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63   */.  u8 isUnloc
1c870 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ked;            
1c880 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44   /* True if no D
1c890 4d 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a  MS lock held */.
1c8a0 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67  .  struct ShmReg
1c8b0 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45  ion {.    HANDLE
1c8c0 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20   hMap;          
1c8d0 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c     /* File handl
1c8e0 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c  e from CreateFil
1c8f0 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20  eMapping */.    
1c900 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20  void *pMap;.  } 
1c910 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52  *aRegion;.  DWOR
1c920 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
1c930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69         /* The Wi
1c940 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d  ndows errno from
1c950 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72   the last I/O er
1c960 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52  ror */..  int nR
1c970 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
1c980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1c990 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73  f winShm objects
1c9a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
1c9b0 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  s */.  winShm *p
1c9c0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
1c9d0 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20    /* All winShm 
1c9e0 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67  objects pointing
1c9f0 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69   to this */.  wi
1ca00 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b  nShmNode *pNext;
1ca10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1ca20 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20   in list of all 
1ca30 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1ca40 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ts */.#if define
1ca50 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1ca60 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1ca70 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1ca80 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b  .  u8 nextShmId;
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1caa0 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20   Next available 
1cab0 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20  winShm.id value 
1cac0 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
1cad0 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72  .** A global arr
1cae0 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d  ay of all winShm
1caf0 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a  Node objects..**
1cb00 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75  .** The winShmMu
1cb10 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
1cb20 65 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61  e true while rea
1cb30 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1cb40 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  this list..*/.st
1cb50 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20  atic winShmNode 
1cb60 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20  *winShmNodeList 
1cb70 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75  = 0;../*.** Stru
1cb80 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72  cture used inter
1cb90 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46  nally by this VF
1cba0 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20  S to record the 
1cbb0 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f  state of an.** o
1cbc0 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  pen shared memor
1cbd0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  y connection..**
1cbe0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
1cbf0 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69  g fields are ini
1cc00 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68  tialized when th
1cc10 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  is object is cre
1cc20 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20  ated and.** are 
1cc30 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61  read-only therea
1cc40 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77  fter:.**.**    w
1cc50 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a  inShm.pShmNode.*
1cc60 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a  *    winShm.id.*
1cc70 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
1cc80 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
1cc90 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68  rite.  The winSh
1cca0 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  m.pShmNode->mute
1ccb0 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
1ccc0 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
1ccd0 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
1cce0 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
1ccf0 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69  ct winShm {.  wi
1cd00 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1cd10 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20  de;      /* The 
1cd20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68  underlying winSh
1cd30 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
1cd40 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b    winShm *pNext;
1cd50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1cd60 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68  Next winShm with
1cd70 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d   the same winShm
1cd80 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
1cd90 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
1cda0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1cdb0 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53  holding the winS
1cdc0 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
1cdd0 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
1cde0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1cdf0 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
1ce00 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
1ce10 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
1ce20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
1ce30 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
1ce40 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66  ocks held */.#if
1ce50 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ce60 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1ce70 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53  d(SQLITE_HAVE_OS
1ce80 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b  _TRACE).  u8 id;
1ce90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cea0 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
1ceb0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
1cec0 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64  th its winShmNod
1ced0 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1cee0 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20  /*.** Constants 
1cef0 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
1cf00 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f  .*/.#define WIN_
1cf10 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b  SHM_BASE   ((22+
1cf20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1cf30 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66  )*4)        /* f
1cf40 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a  irst lock byte *
1cf50 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48  /.#define WIN_SH
1cf60 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48  M_DMS    (WIN_SH
1cf70 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48  M_BASE+SQLITE_SH
1cf80 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61  M_NLOCK)  /* dea
1cf90 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a  dman switch */..
1cfa0 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69  /*.** Apply advi
1cfb0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
1cfc0 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e  ll n bytes begin
1cfd0 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f  ning at ofst..*/
1cfe0 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f  .#define WINSHM_
1cff0 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
1d000 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20 20 32   WINSHM_RDLCK  2
1d010 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48 4d 5f  .#define WINSHM_
1d020 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
1d030 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
1d040 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
1d050 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
1d060 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
1d070 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
1d080 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
1d090 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
1d0a0 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 49  e,         /* WI
1d0b0 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 53  NSHM_UNLCK, WINS
1d0c0 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57 49 4e  HM_RDLCK, or WIN
1d0d0 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69  SHM_WRLCK */.  i
1d0e0 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1d0f0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
1d100 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f 20  o first byte to 
1d110 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f 63 6b  be locked/unlock
1d120 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ed */.  int nByt
1d130 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
1d140 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1d150 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
1d160 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ck */.){.  int r
1d170 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1d180 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1d190 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f 63 6b  form Lock/Unlock
1d1a0 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20 20 2f  FileEx() */..  /
1d1b0 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
1d1c0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1d1d0 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
1d1e0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
1d1f0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1d200 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73 71 6c  ->nRef==0 || sql
1d210 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1d220 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b  pFile->mutex) );
1d230 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ..  OSTRACE(("SH
1d240 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  M-LOCK file=%p, 
1d250 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65 74 3d  lock=%d, offset=
1d260 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22 2c 0a  %d, size=%d\n",.
1d270 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1d280 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63 6b 54  ->hFile.h, lockT
1d290 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79 74 65  ype, ofst, nByte
1d2a0 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  ));..  /* Releas
1d2b0 65 2f 41 63 71 75 69 72 65 20 74 68 65 20 73 79  e/Acquire the sy
1d2c0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 20  stem-level lock 
1d2d0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  */.  if( lockTyp
1d2e0 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 20  e==WINSHM_UNLCK 
1d2f0 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 55  ){.    rc = winU
1d300 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
1d310 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74 2c  ->hFile.h, ofst,
1d320 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1d330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
1d340 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f  nitialize the lo
1d350 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  cking parameters
1d360 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64 77   */.    DWORD dw
1d370 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c 45  Flags = LOCKFILE
1d380 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
1d390 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  Y;.    if( lockT
1d3a0 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 57 52  ype == WINSHM_WR
1d3b0 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d  LCK ) dwFlags |=
1d3c0 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53   LOCKFILE_EXCLUS
1d3d0 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63  IVE_LOCK;.    rc
1d3e0 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
1d3f0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1d400 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30  dwFlags, ofst, 0
1d410 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d  , nByte, 0);.  }
1d420 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29  ..  if( rc!= 0 )
1d430 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1d440 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
1d450 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
1d460 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74  rno =  osGetLast
1d470 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20  Error();.    rc 
1d480 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1d490 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22   }..  OSTRACE(("
1d4a0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1d4b0 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f  , func=%s, errno
1d4c0 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  =%lu, rc=%s\n",.
1d4d0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1d4e0 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b  ->hFile.h, (lock
1d4f0 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f 55  Type == WINSHM_U
1d500 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f  NLCK) ? "winUnlo
1d510 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20  ckFile" :.      
1d520 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c       "winLockFil
1d530 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  e", pFile->lastE
1d540 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72  rrno, sqlite3Err
1d550 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72  Name(rc)));..  r
1d560 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1d570 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1d580 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
1d590 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1d5a0 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
1d5b0 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
1d5c0 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
1d5d0 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
1d5e0 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
1d5f0 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
1d600 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
1d610 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1d620 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
1d630 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1d640 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
1d650 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1d660 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1d670 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d680 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1d690 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1d6a0 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1d6b0 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1d6c0 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1d6d0 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1d6e0 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
1d6f0 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
1d700 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
1d710 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
1d720 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
1d730 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1d740 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f  texHeld() );.  O
1d750 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1d760 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65  GE pid=%lu, dele
1d770 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20  teFlag=%d\n",.  
1d780 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1d790 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1d7a0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a  , deleteFlag));.
1d7b0 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f    pp = &winShmNo
1d7c0 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
1d7d0 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b   (p = *pp)!=0 ){
1d7e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
1d7f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1d800 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   i;.      if( p-
1d810 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65  >mutex ){ sqlite
1d820 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1d830 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20  mutex); }.      
1d840 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1d850 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1d860 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20       BOOL bRc = 
1d870 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1d880 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1d890 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
1d8a0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1d8b0 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
1d8c0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1d8d0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1d8e0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1d8f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1d900 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1d910 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1d920 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1d930 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1d940 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
1d950 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
1d960 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
1d970 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1d980 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c  E(("SHM-PURGE-CL
1d990 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  OSE pid=%lu, reg
1d9a0 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1d9b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d9c0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1d9d0 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1d9e0 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1d9f0 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1da00 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1da10 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1da20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
1da30 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26  >hFile.h!=NULL &
1da40 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e  & p->hFile.h!=IN
1da50 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1da60 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
1da70 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1da80 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1da90 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
1daa0 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
1dab0 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
1dac0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1dad0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1dae0 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
1daf0 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
1db00 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1db10 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1db20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
1db30 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1db40 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
1db50 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
1db60 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
1db70 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1db80 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1db90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1dba0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1dbb0 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
1dbc0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1dbd0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1dbe0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  Region);.      s
1dbf0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1dc00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1dc10 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b   pp = &p->pNext;
1dc20 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1dc30 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f 63 6b  .** The DMS lock
1dc40 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1dc50 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d 20 66  n taken on shm f
1dc60 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20 41 74  ile pShmNode. At
1dc70 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61 6b 65  tempt to.** take
1dc80 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72 6e 20   it now. Return 
1dc90 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
1dca0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
1dcb0 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
1dcc0 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
1dcd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d 53 20  *.** If the DMS 
1dce0 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64  cannot be locked
1dcf0 20 62 65 63 61 75 73 65 20 74 68 69 73 20 69 73   because this is
1dd00 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d   a readonly_shm=
1dd10 31 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  1.** connection 
1dd20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  and no other pro
1dd30 63 65 73 73 20 61 6c 72 65 61 64 79 20 68 6f 6c  cess already hol
1dd40 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72  ds a lock, retur
1dd50 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44  n.** SQLITE_READ
1dd60 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e  ONLY_CANTINIT an
1dd70 64 20 73 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e  d set pShmNode->
1dd80 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f  isUnlocked=1..*/
1dd90 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c  .static int winL
1dda0 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
1ddb0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1ddc0 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  Node){.  int rc 
1ddd0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1dde0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1ddf0 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_WRLCK, WIN_S
1de00 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 0a 20 20 69  HM_DMS, 1);..  i
1de10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1de20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   ){.    if( pShm
1de30 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
1de40 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f   ){.      pShmNo
1de50 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d  de->isUnlocked =
1de60 20 31 3b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d   1;.      winShm
1de70 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1de80 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1de90 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1dea0 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
1deb0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1dec0 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d  _CANTINIT;.    }
1ded0 65 6c 73 65 20 69 66 28 20 77 69 6e 54 72 75 6e  else if( winTrun
1dee0 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69  cate((sqlite3_fi
1def0 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68  le*)&pShmNode->h
1df00 46 69 6c 65 2c 20 30 29 20 29 7b 0a 20 20 20 20  File, 0) ){.    
1df10 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
1df20 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e  ck(pShmNode, WIN
1df30 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53  SHM_UNLCK, WIN_S
1df40 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20  HM_DMS, 1);.    
1df50 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
1df60 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1df70 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1df80 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dfa0 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 53 68        "winLockSh
1dfb0 61 72 65 64 4d 65 6d 6f 72 79 22 2c 20 70 53 68  aredMemory", pSh
1dfc0 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1dfd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1dfe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1dff0 4b 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 53  K ){.    winShmS
1e000 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1e010 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b  de, WINSHM_UNLCK
1e020 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1e030 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1e040 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1e050 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49 4e 53  k(pShmNode, WINS
1e060 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
1e070 4d 5f 44 4d 53 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  M_DMS, 1);.}../*
1e080 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61  .** Open the sha
1e090 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1e0a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1e0b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1e0c0 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  bFd..**.** When 
1e0d0 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1e0e0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1e0f0 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1e100 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1e110 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1e120 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1e130 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1e140 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1e150 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1e160 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1e170 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1e180 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1e190 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1e1a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1e1b0 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1e1c0 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  ry(winFile *pDbF
1e1d0 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  d){.  struct win
1e1e0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1e1f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e200 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1e210 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 77 69 6e   opened */.  win
1e220 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1e230 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e240 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1e250 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1e260 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1e270 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1e280 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1e290 20 63 6f 64 65 20 2a 2f 0a 20 20 77 69 6e 53 68   code */.  winSh
1e2a0 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20 20 20  mNode *pNew;    
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e2c0 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1e2d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1e2e0 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
1e310 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
1e320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ..  assert( pDbF
1e330 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20  d->pShm==0 );   
1e340 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73   /* Not previous
1e350 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20  ly opened */..  
1e360 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1e370 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1e380 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1e390 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74  .  Also speculat
1e3a0 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ively.  ** alloc
1e3b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
1e3c0 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61  new winShmNode a
1e3d0 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a  nd filename..  *
1e3e0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  /.  p = sqlite3M
1e3f0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1e400 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1e410 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1e420 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1e430 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  BKPT;.  nName = 
1e440 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1e450 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1e460 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1e470 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1e480 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1e490 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1e4a0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1e4b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e4c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1e4d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e4e0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65  _BKPT;.  }.  pNe
1e4f0 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1e500 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1e510 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1e520 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
1e530 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1e540 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1e550 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Path);.  sqlite3
1e560 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1e570 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e  d->zPath, pNew->
1e580 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zFilename);..  /
1e590 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1e5a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1e5b0 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1e5c0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1e5d0 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1e5e0 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1e5f0 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1e600 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1e610 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1e620 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1e630 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1e640 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1e650 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1e660 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1e670 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1e680 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1e690 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1e6a0 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1e6b0 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1e6c0 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1e6d0 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1e6e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1e6f0 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1e700 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1e710 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1e720 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1e730 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1e740 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e750 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1e760 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 6e  else{.    int in
1e770 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
1e780 50 45 4e 5f 57 41 4c 3b 0a 20 20 20 20 69 6e 74  PEN_WAL;.    int
1e790 20 6f 75 74 46 6c 61 67 73 20 3d 20 30 3b 0a 0a   outFlags = 0;..
1e7a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
1e7b0 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1e7c0 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
1e7d0 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
1e7e0 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
1e7f0 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1e800 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1e810 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
1e820 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
1e830 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
1e840 4e 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28 20 73  Node;..    if( s
1e850 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1e860 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
1e870 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1e880 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
1e890 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
1e8a0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
1e8b0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
1e8c0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
1e8d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1e8e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1e8f0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67  _BKPT;.        g
1e900 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
1e910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1e920 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
1e930 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
1e940 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72  pDbFd->zPath, "r
1e950 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29  eadonly_shm", 0)
1e960 20 29 7b 0a 20 20 20 20 20 20 69 6e 46 6c 61 67   ){.      inFlag
1e970 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
1e980 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
1e990 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
1e9a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e9b0 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c    inFlags |= SQL
1e9c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
1e9d0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  Y;.    }.    rc 
1e9e0 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64 2d  = winOpen(pDbFd-
1e9f0 3e 70 56 66 73 2c 20 70 53 68 6d 4e 6f 64 65 2d  >pVfs, pShmNode-
1ea00 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  >zFilename,.    
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1ea20 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1ea30 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 0a 20 20  mNode->hFile,.  
1ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1ea50 6e 46 6c 61 67 73 2c 20 26 6f 75 74 46 6c 61 67  nFlags, &outFlag
1ea60 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
1ea70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ea80 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1ea90 72 6f 72 28 72 63 2c 20 6f 73 47 65 74 4c 61 73  ror(rc, osGetLas
1eaa0 74 45 72 72 6f 72 28 29 2c 20 22 77 69 6e 4f 70  tError(), "winOp
1eab0 65 6e 53 68 6d 22 2c 0a 20 20 20 20 20 20 20 20  enShm",.        
1eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ead0 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1eae0 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  me);.      goto 
1eaf0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
1eb00 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 75 74 46    }.    if( outF
1eb10 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  lags==SQLITE_OPE
1eb20 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 20 70 53 68  N_READONLY ) pSh
1eb30 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
1eb40 79 20 3d 20 31 3b 0a 0a 20 20 20 20 72 63 20 3d  y = 1;..    rc =
1eb50 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65   winLockSharedMe
1eb60 6d 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29 3b 0a  mory(pShmNode);.
1eb70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eb80 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1eb90 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
1eba0 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68 6d  TINIT ) goto shm
1ebb0 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a  _open_err;.  }..
1ebc0 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65    /* Make the ne
1ebd0 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63  w connection a c
1ebe0 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53  hild of the winS
1ebf0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70  hmNode */.  p->p
1ec00 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
1ec10 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  de;.#if defined(
1ec20 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1ec30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1ec40 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
1ec50 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64   p->id = pShmNod
1ec60 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a  e->nextShmId++;.
1ec70 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64  #endif.  pShmNod
1ec80 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62  e->nRef++;.  pDb
1ec90 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20  Fd->pShm = p;.  
1eca0 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1ecb0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
1ecc0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
1ecd0 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
1ece0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
1ecf0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
1ed00 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
1ed10 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75  he winShmEnterMu
1ed20 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
1ed30 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
1ed40 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
1ed50 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62  truct winShm) ob
1ed60 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d  ject to the pShm
1ed70 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65  Node has been se
1ed80 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20  t. All that is. 
1ed90 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69   ** left to do i
1eda0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65  s to link the ne
1edb0 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68  w object into th
1edc0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74  e linked list st
1edd0 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70  arting.  ** at p
1ede0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e  ShmNode->pFirst.
1edf0 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f   This must be do
1ee00 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67  ne while holding
1ee10 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   the pShmNode->m
1ee20 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  utex.  ** mutex.
1ee30 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1ee40 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1ee50 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1ee60 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
1ee70 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
1ee80 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
1ee90 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
1eea0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1eeb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1eec0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1eed0 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
1eee0 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
1eef0 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d  en_err:.  winShm
1ef00 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1ef10 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43  ode, WINSHM_UNLC
1ef20 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20  K, WIN_SHM_DMS, 
1ef30 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75 72 67  1);.  winShmPurg
1ef40 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20 30  e(pDbFd->pVfs, 0
1ef50 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  );      /* This 
1ef60 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e  call frees pShmN
1ef70 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20  ode if required 
1ef80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1ef90 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  e(p);.  sqlite3_
1efa0 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 77 69  free(pNew);.  wi
1efb0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1efc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1efd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
1efe0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
1eff0 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
1f000 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
1f010 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69  ing.** storage i
1f020 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20  f deleteFlag is 
1f030 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  true..*/.static 
1f040 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61 70 28  int winShmUnmap(
1f050 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1f060 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
1f070 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1f080 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1f090 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46  */.  int deleteF
1f0a0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
1f0b0 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65 72 20  /* Delete after 
1f0c0 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75 65 20  closing if true 
1f0d0 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  */.){.  winFile 
1f0e0 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 2f 2a  *pDbFd;       /*
1f0f0 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   Database holdin
1f100 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1f110 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 3b 20  */.  winShm *p; 
1f120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f130 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1f140 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 77  be closed */.  w
1f150 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1f160 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e 64 65  ode; /* The unde
1f170 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65  rlying shared-me
1f180 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 77  mory file */.  w
1f190 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  inShm **pp;     
1f1a0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1f1b0 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67  ing over sibling
1f1c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1f1d0 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69 6e 46  .  pDbFd = (winF
1f1e0 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70  ile*)fd;.  p = p
1f1f0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66  DbFd->pShm;.  if
1f200 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1f210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68  SQLITE_OK;.  pSh
1f220 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
1f230 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  ode;..  /* Remov
1f240 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
1f250 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
1f260 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
1f270 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
1f280 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
1f290 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1f2a0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1f2b0 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
1f2c0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1f2d0 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
1f2e0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
1f2f0 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
1f300 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
1f310 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
1f320 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1f330 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
1f340 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
1f350 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1f360 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
1f370 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
1f380 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
1f390 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
1f3a0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
1f3b0 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
1f3c0 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
1f3d0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1f3e0 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
1f3f0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
1f400 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
1f410 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
1f420 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
1f430 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50 75 72  ){.    winShmPur
1f440 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 20  ge(pDbFd->pVfs, 
1f450 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20 20 7d  deleteFlag);.  }
1f460 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  .  winShmLeaveMu
1f470 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1f480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f490 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
1f4a0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
1f4b0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
1f4c0 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  egment..*/.stati
1f4d0 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f 63 6b  c int winShmLock
1f4e0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1f4f0 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
1f500 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
1f510 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
1f520 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
1f530 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
1f540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1f550 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
1f560 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
1f570 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f590 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
1f5a0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
1f5b0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
1f5c0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
1f5d0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
1f5e0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
1f5f0 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ck */.){.  winFi
1f600 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e  le *pDbFd = (win
1f610 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 20  File*)fd;       
1f620 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
1f630 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
1f640 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  mory */.  winShm
1f650 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
1f660 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1f670 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
1f680 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
1f690 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  d */.  winShm *p
1f6a0 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f6c0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
1f6d0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
1f6e0 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1f6f0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1f700 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
1f710 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f730 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1f740 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20  .  u16 mask;    
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f760 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1f770 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b   of locks to tak
1f780 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1f790 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
1f7a0 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
1f7b0 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
1f7c0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
1f7d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
1f7e0 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1f7f0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
1f800 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
1f810 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1f820 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
1f830 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1f840 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
1f850 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
1f860 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
1f870 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1f880 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1f890 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1f8a0 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
1f8b0 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
1f8c0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
1f8d0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
1f8e0 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
1f8f0 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 75   );..  mask = (u
1f900 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74 2b 6e  16)((1U<<(ofst+n
1f910 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74 29 29  )) - (1U<<ofst))
1f920 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
1f930 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
1f940 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
1f950 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
1f960 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1f970 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
1f980 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
1f990 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
1f9a0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
1f9b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
1f9c0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
1f9d0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
1f9e0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
1f9f0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
1fa00 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
1fa10 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
1fa20 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
1fa30 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
1fa40 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1fa50 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
1fa60 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
1fa70 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
1fa80 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
1fa90 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
1faa0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1fab0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
1fac0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
1fad0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
1fae0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
1faf0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
1fb00 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1fb10 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1fb20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f 66  WINSHM_UNLCK, of
1fb30 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
1fb40 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
1fb50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1fb60 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
1fb70 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
1fb80 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
1fb90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1fba0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
1fbb0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
1fbc0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1fbd0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
1fbe0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1fbf0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
1fc00 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  SHM_SHARED ){.  
1fc10 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20    u16 allShared 
1fc20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f  = 0;  /* Union o
1fc30 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
1fc40 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
1fc50 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20  r than "p" */.. 
1fc60 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77     /* Find out w
1fc70 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b  hich shared lock
1fc80 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65  s are already he
1fc90 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f  ld by sibling co
1fca0 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a  nnections..    *
1fcb0 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  * If any sibling
1fcc0 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61   already holds a
1fcd0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1fce0 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72  , go ahead and r
1fcf0 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c  eturn.    ** SQL
1fd00 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f  ITE_BUSY..    */
1fd10 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1fd20 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1fd30 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1fd40 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
1fd50 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
1fd60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
1fd70 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1fd80 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1fd90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c        }.      al
1fda0 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73  lShared |= pX->s
1fdb0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
1fdc0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61  ..    /* Get sha
1fdd0 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  red locks at the
1fde0 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69   system level, i
1fdf0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1fe00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1fe10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
1fe20 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d  ( (allShared & m
1fe30 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
1fe40 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1fe50 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1fe60 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 2c  e, WINSHM_RDLCK,
1fe70 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1fe80 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
1fe90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1fea0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1feb0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1fec0 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
1fed0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
1fee0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1fef0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ff00 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
1ff10 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
1ff20 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
1ff30 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
1ff40 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
1ff50 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
1ff60 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
1ff70 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
1ff80 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
1ff90 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
1ffa0 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
1ffb0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
1ffc0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
1ffd0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
1ffe0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
1fff0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
20000 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
20010 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
20020 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
20030 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
20040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
20050 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
20060 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
20070 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
20080 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
20090 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
200a0 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
200b0 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
200c0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
200d0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
200e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
200f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20100 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
20110 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
20120 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  NSHM_WRLCK, ofst
20130 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
20140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
20170 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
20180 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
20190 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
201a0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
201b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
201c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
201d0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
201e0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
201f0 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
20200 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
20210 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
20220 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
20230 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20240 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20250 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
20260 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
20270 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
20280 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
20290 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
202a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
202b0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
202c0 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
202d0 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
202e0 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  red memory..**.*
202f0 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
20300 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
20310 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
20320 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
20330 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
20340 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
20350 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
20360 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
20370 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
20380 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
20390 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
203a0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
203b0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
203c0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
203d0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
203e0 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
203f0 42 61 72 72 69 65 72 28 29 3b 20 20 20 2f 2a 20  Barrier();   /* 
20400 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
20410 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
20420 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
20430 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 2f  Mutex();       /
20440 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
20450 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
20460 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
20470 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
20480 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20490 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
204a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
204b0 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
204c0 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  the.** shared-me
204d0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
204e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
204f0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
20500 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20510 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
20520 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
20530 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
20540 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
20550 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79  s szRegion.** by
20560 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
20570 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
20580 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
20590 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
205a0 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
205b0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
205c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
205d0 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
205e0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
205f0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
20600 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
20610 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
20620 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
20630 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
20640 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
20650 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
20660 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
20670 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
20680 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
20690 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
206a0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
206b0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
206c0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
206d0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
206e0 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61  ot yet.** been a
206f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
20700 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
20710 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
20720 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
20730 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
20740 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
20750 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
20760 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
20770 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
20780 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
20790 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
207a0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
207b0 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  es.** address sp
207c0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
207d0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
207e0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
207f0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a  to the mapped.**
20800 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
20810 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
20820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
20830 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
20840 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
20850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
20860 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
20870 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20880 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208a0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
208b0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
208c0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
208d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
208e0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
208f0 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
20900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20910 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
20920 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
20930 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
20940 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
20950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
20960 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
20970 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
20980 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
20990 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
209a0 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46 64 2d  m *pShm = pDbFd-
209b0 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
209c0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
209d0 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74 20 3d   DWORD protect =
209e0 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b   PAGE_READWRITE;
209f0 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 20 3d  .  DWORD flags =
20a00 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
20a10 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  | FILE_MAP_READ;
20a20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20a30 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70  TE_OK;..  if( !p
20a40 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Shm ){.    rc = 
20a50 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  winOpenSharedMem
20a60 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20  ory(pDbFd);.    
20a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20a80 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
20a90 20 20 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d     pShm = pDbFd-
20aa0 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68  >pShm;.  }.  pSh
20ab0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53  mNode = pShm->pS
20ac0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74  hmNode;..  sqlit
20ad0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
20ae0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
20af0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20b00 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20  >isUnlocked ){. 
20b10 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 53     rc = winLockS
20b20 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 53 68 6d  haredMemory(pShm
20b30 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Node);.    if( r
20b40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
20b50 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
20b60 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69  .    pShmNode->i
20b70 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  sUnlocked = 0;. 
20b80 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52   }.  assert( szR
20b90 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d  egion==pShmNode-
20ba0 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68  >szRegion || pSh
20bb0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d  mNode->nRegion==
20bc0 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  0 );..  if( pShm
20bd0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
20be0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73 74  Region ){.    st
20bf0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
20c00 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  apNew;          
20c10 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e 5b   /* New aRegion[
20c20 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69  ] array */.    i
20c30 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65 67  nt nByte = (iReg
20c40 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e 3b  ion+1)*szRegion;
20c50 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71    /* Minimum req
20c60 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20  uired file size 
20c70 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  */.    sqlite3_i
20c80 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20 20  nt64 sz;        
20c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
20ca0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61 6c  rent size of wal
20cb0 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a 0a  -index file */..
20cc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
20cd0 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
20ce0 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  n;..    /* The r
20cf0 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
20d00 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
20d10 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
20d20 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
20d30 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  .    ** Check to
20d40 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
20d50 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
20d60 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
20d70 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
20d80 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
20d90 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
20da0 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
20db0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
20dc0 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28   = winFileSize((
20dd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
20de0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
20df0 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 72   &sz);.    if( r
20e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20e10 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
20e20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20e30 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
20e40 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
20e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e60 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
20e70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  1", pDbFd->zPath
20e80 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  );.      goto sh
20e90 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
20ea0 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42 79  ..    if( sz<nBy
20eb0 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  te ){.      /* T
20ec0 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
20ed0 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
20ee0 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69 73  not exist. If is
20ef0 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f 0a  Write is set to.
20f00 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65        ** zero, e
20f10 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
20f20 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
20f30 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
20f40 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
20f50 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c 74   **.      ** Alt
20f60 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 69  ernatively, if i
20f70 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65  sWrite is non-ze
20f80 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61 74  ro, use ftruncat
20f90 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65 0a  e() to allocate.
20fa0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 71        ** the req
20fb0 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
20fc0 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  gion..      */. 
20fd0 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69 74       if( !isWrit
20fe0 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  e ) goto shmpage
20ff0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  _out;.      rc =
21000 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71   winTruncate((sq
21010 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53  lite3_file *)&pS
21020 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 6e  hmNode->hFile, n
21030 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
21040 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21050 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  {.        rc = w
21060 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
21070 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
21080 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21090 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
210a0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
210b0 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64 2d  ShmMap2", pDbFd-
210c0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  >zPath);.       
210d0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
210e0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
210f0 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
21100 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
21110 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
21120 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
21130 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
21140 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72 75     apNew = (stru
21150 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29 73  ct ShmRegion *)s
21160 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
21170 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  (.        pShmNo
21180 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69 52  de->aRegion, (iR
21190 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66 28  egion+1)*sizeof(
211a0 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29 3b  apNew[0]).    );
211b0 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
211c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
211d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
211e0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
211f0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
21200 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
21210 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61 70 4e  e->aRegion = apN
21220 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68  ew;..    if( pSh
21230 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
21240 79 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 74 65  y ){.      prote
21250 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e  ct = PAGE_READON
21260 4c 59 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20  LY;.      flags 
21270 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 3b  = FILE_MAP_READ;
21280 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
21290 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
212a0 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20 29 7b  gion<=iRegion ){
212b0 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4d  .      HANDLE hM
212c0 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20 20 20  ap = NULL;      
212d0 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70 70 69     /* file-mappi
212e0 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20  ng handle */.   
212f0 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20 3d 20     void *pMap = 
21300 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
21310 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20  * Mapped memory 
21320 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66 20 53  region */..#if S
21330 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
21340 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
21350 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
21360 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64 65 2d  romApp(pShmNode-
21370 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20  >hFile.h,.      
21380 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63      NULL, protec
21390 74 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  t, nByte, NULL. 
213a0 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
213b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
213c0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
213d0 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
213e0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
213f0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
21400 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
21410 2c 20 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42  , protect, 0, nB
21420 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
21430 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
21440 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
21450 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54  S_ANSI) && SQLIT
21460 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49  E_WIN32_CREATEFI
21470 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 20  LEMAPPINGA.     
21480 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65   hMap = osCreate
21490 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 53 68  FileMappingA(pSh
214a0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
214b0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
214c0 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42 79 74  protect, 0, nByt
214d0 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b  e, NULL.      );
214e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53  .#endif.      OS
214f0 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d  TRACE(("SHM-MAP-
21500 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  CREATE pid=%lu, 
21510 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d  region=%d, size=
21520 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
21540 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
21550 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  Id(), pShmNode->
21560 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a  nRegion, nByte,.
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
21580 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  Map ? "ok" : "fa
21590 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69  iled"));.      i
215a0 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20  f( hMap ){.     
215b0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d     int iOffset =
215c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
215d0 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
215e0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
215f0 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20  Shift = iOffset 
21600 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41  % winSysInfo.dwA
21610 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61  llocationGranula
21620 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45  rity;.#if SQLITE
21630 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20  _OS_WINRT.      
21640 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
21650 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
21660 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20 20 20  hMap, flags,.   
21670 20 20 20 20 20 20 20 20 20 69 4f 66 66 73 65 74           iOffset
21680 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c   - iOffsetShift,
21690 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66   szRegion + iOff
216a0 73 65 74 53 68 69 66 74 0a 20 20 20 20 20 20 20  setShift.       
216b0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
216c0 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69    pMap = osMapVi
216d0 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c 20 66  ewOfFile(hMap, f
216e0 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
216f0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
21700 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
21710 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
21720 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
21730 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
21740 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
21750 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
21760 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
21770 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
21780 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
21790 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
217a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
217b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
217c0 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
217e0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
217f0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
21800 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21810 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
21820 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
21830 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
21840 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
21850 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
21860 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
21870 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
21880 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
21890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218a0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
218b0 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
218c0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
218d0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
218e0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
218f0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
21900 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
21910 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21920 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
21930 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
21940 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
21950 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
21960 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
21970 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
21980 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21990 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
219a0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
219b0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
219c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
219d0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
219e0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
219f0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
21a00 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
21a10 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
21a20 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
21a30 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
21a40 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
21a50 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
21a60 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
21a70 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
21a80 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
21a90 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
21aa0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
21ab0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
21ac0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
21ad0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
21ae0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
21af0 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
21b00 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
21b10 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
21b20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21b30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
21b40 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20 30 0a  winShmMap     0.
21b50 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4c  # define winShmL
21b60 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
21b70 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 20  e winShmBarrier 
21b80 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
21b90 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
21ba0 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
21bb0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
21bc0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20 75 70  ./*.** Cleans up
21bd0 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
21be0 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63 69 66  on of the specif
21bf0 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61 6e 79  ied file, if any
21c00 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
21c10 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
21c20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e  static int winUn
21c30 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20  mapfile(winFile 
21c40 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73 65 72  *pFile){.  asser
21c50 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20  t( pFile!=0 );. 
21c60 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50   OSTRACE(("UNMAP
21c70 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70  -FILE pid=%lu, p
21c80 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70  File=%p, hMap=%p
21c90 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c  , pMapRegion=%p,
21ca0 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22 6d   ".           "m
21cb0 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d  mapSize=%lld, mm
21cc0 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25 6c 6c  apSizeActual=%ll
21cd0 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78 3d 25  d, mmapSizeMax=%
21ce0 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  lld\n",.        
21cf0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
21d00 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
21d10 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70 2c 20  e, pFile->hMap, 
21d20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
21d30 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  n,.           pF
21d40 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c 20 70  ile->mmapSize, p
21d50 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63  File->mmapSizeAc
21d60 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61  tual, pFile->mma
21d70 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20 69 66  pSizeMax));.  if
21d80 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
21d90 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ion ){.    if( !
21da0 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
21db0 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  e(pFile->pMapReg
21dc0 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ion) ){.      pF
21dd0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
21de0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21df0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21e00 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
21e10 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
21e20 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
21e30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
21e40 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52   "rc=SQLITE_IOER
21e50 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74  R_MMAP\n", osGet
21e60 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
21e70 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
21e80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
21e90 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20  >pMapRegion));. 
21ea0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
21eb0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21ec0 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65  OERR_MMAP, pFile
21ed0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66        "winUnmapf
21f00 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ile1", pFile->zP
21f10 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
21f20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
21f30 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  n = 0;.    pFile
21f40 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
21f50 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
21f60 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
21f70 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e   }.  if( pFile->
21f80 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  hMap!=NULL ){.  
21f90 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65 48 61    if( !osCloseHa
21fa0 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 61 70  ndle(pFile->hMap
21fb0 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
21fc0 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
21fd0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
21fe0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21ff0 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25  UNMAP-FILE pid=%
22000 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d  lu, pFile=%p, hM
22010 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  ap=%p, rc=SQLITE
22020 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a  _IOERR_MMAP\n",.
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
22040 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
22050 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
22060 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a 20 20  File->hMap));.  
22070 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
22080 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
22090 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
220a0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70 66 69       "winUnmapfi
220d0 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  le2", pFile->zPa
220e0 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  th);.    }.    p
220f0 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
22100 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  L;.  }.  OSTRACE
22110 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69  (("UNMAP-FILE pi
22120 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
22130 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
22140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
22150 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
22160 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b 0a 20  Id(), pFile));. 
22170 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
22180 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  K;.}../*.** Memo
22190 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
221a0 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
221b0 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
221c0 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
221d0 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
221e0 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
221f0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
22200 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
22210 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 0a 2a  e new). Or, if.*
22220 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 20  * there already 
22230 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67  exists a mapping
22240 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
22250 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73 74  and there are st
22260 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69  ill.** outstandi
22270 6e 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65  ng xFetch() refe
22280 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68  rences to it, th
22290 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
222a0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
222b0 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65   parameter nByte
222c0 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   is non-negative
222d0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
222e0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
222f0 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  of.** the mappin
22300 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
22310 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
22320 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
22330 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
22340 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69  requested size i
22350 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
22360 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20  e file on disk. 
22370 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  The actual size 
22380 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65  of the.** create
22390 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74  d mapping is eit
223a0 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65  her the requeste
223b0 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61  d size or the va
223c0 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  lue configured.*
223d0 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
223e0 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20  CNTL_MMAP_SIZE, 
223f0 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
22400 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
22410 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
22420 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
22430 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
22440 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
22450 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
22460 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
22470 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
22480 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
22490 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
224a0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
224b0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
224c0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 64  ile(winFile *pFd
224d0 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
224e0 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69 74 65  nByte){.  sqlite
224f0 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d 20 6e  3_int64 nMap = n
22500 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Byte;.  int rc;.
22510 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e  .  assert( nMap>
22520 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63  =0 || pFd->nFetc
22530 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f 53 54  hOut==0 );.  OST
22540 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
22550 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22560 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c  p, size=%lld\n",
22570 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
22580 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
22590 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74 65 29  d(), pFd, nByte)
225a0 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e  );..  if( pFd->n
225b0 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74  FetchOut>0 ) ret
225c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
225d0 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a    if( nMap<0 ){.
225e0 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69 6c 65      rc = winFile
225f0 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f 66 69  Size((sqlite3_fi
22600 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70 29 3b  le*)pFd, &nMap);
22610 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
22620 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
22630 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
22640 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
22650 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
22660 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22670 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22680 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64  ProcessId(), pFd
22690 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
226a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
226b0 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  TAT;.    }.  }. 
226c0 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
226d0 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
226e0 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
226f0 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20  apSizeMax;.  }. 
22700 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c 69 74   nMap &= ~(sqlit
22710 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53 79 73  e3_int64)(winSys
22720 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 20  Info.dwPageSize 
22730 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  - 1);..  if( nMa
22740 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d 6d 61  p==0 && pFd->mma
22750 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 77  pSize>0 ){.    w
22760 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  inUnmapfile(pFd)
22770 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70  ;.  }.  if( nMap
22780 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
22790 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65  ){.    void *pNe
227a0 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f 52 44  w = 0;.    DWORD
227b0 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f   protect = PAGE_
227c0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 44 57  READONLY;.    DW
227d0 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49 4c 45  ORD flags = FILE
227e0 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20 20 20  _MAP_READ;..    
227f0 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 64  winUnmapfile(pFd
22800 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
22810 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a  _MMAP_READWRITE.
22820 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74      if( (pFd->ct
22830 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c  rlFlags & WINFIL
22840 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a  E_RDONLY)==0 ){.
22850 20 20 20 20 20 20 70 72 6f 74 65 63 74 20 3d 20        protect = 
22860 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 3b 0a  PAGE_READWRITE;.
22870 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 46        flags |= F
22880 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b 0a 20  ILE_MAP_WRITE;. 
22890 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
228a0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
228b0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
228c0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
228d0 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e  ingFromApp(pFd->
228e0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
228f0 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23  , nMap, NULL);.#
22900 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
22910 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
22920 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61  DE).    pFd->hMa
22930 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  p = osCreateFile
22940 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e 68 2c  MappingW(pFd->h,
22950 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 0a   NULL, protect,.
22960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e 3e 33  (DWORD)((nMap>>3
22990 32 29 20 26 20 30 78 66 66 66 66 66 66 66 66 29  2) & 0xffffffff)
229a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
229b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229c0 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70 20 26    (DWORD)(nMap &
229d0 20 30 78 66 66 66 66 66 66 66 66 29 2c 20 4e 55   0xffffffff), NU
229e0 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  LL);.#elif defin
229f0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
22a00 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c  HAS_ANSI) && SQL
22a10 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
22a20 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20  FILEMAPPINGA.   
22a30 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
22a40 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
22a50 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  A(pFd->h, NULL, 
22a60 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a80 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
22a90 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
22aa0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
22ad0 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
22ae0 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
22af0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 46 64  ndif.    if( pFd
22b00 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap==NULL ){.
22b10 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74 45        pFd->lastE
22b20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
22b30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72  Error();.      r
22b40 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
22b50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
22b60 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e  P, pFd->lastErrn
22b70 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
22b80 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d 61            "winMa
22b90 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e 7a 50  pfile1", pFd->zP
22ba0 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c  ath);.      /* L
22bb0 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62 75  og the error, bu
22bc0 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61  t continue norma
22bd0 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69 6e  l operation usin
22be0 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20 2a  g xRead/xWrite *
22bf0 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  /.      OSTRACE(
22c00 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45 41 54  ("MAP-FILE-CREAT
22c10 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
22c20 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
22c40 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22c50 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
22c60 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
22c70 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
22c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
22c90 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 4d 61      assert( (nMa
22ca0 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  p % winSysInfo.d
22cb0 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20 29 3b  wPageSize)==0 );
22cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
22cd0 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73 69 7a  eof(SIZE_T)==siz
22ce0 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  eof(sqlite3_int6
22cf0 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78 66 66  4) || nMap<=0xff
22d00 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20 53 51  ffffff );.#if SQ
22d10 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
22d20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69    pNew = osMapVi
22d30 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28  ewOfFileFromApp(
22d40 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73  pFd->hMap, flags
22d50 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d 61  , 0, (SIZE_T)nMa
22d60 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e  p);.#else.    pN
22d70 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
22d80 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70 2c 20  File(pFd->hMap, 
22d90 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28 53 49  flags, 0, 0, (SI
22da0 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6e 64  ZE_T)nMap);.#end
22db0 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d  if.    if( pNew=
22dc0 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 6f  =NULL ){.      o
22dd0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 64  sCloseHandle(pFd
22de0 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20 20 70  ->hMap);.      p
22df0 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  Fd->hMap = NULL;
22e00 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73 74  .      pFd->last
22e10 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
22e20 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
22e30 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
22e40 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
22e50 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72 72  AP, pFd->lastErr
22e60 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
22e70 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 4d             "winM
22e80 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d 3e 7a  apfile2", pFd->z
22e90 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a 20  Path);.      /* 
22ea0 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20 62  Log the error, b
22eb0 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d  ut continue norm
22ec0 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73 69  al operation usi
22ed0 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
22ee0 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  */.      OSTRACE
22ef0 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41 50 20  (("MAP-FILE-MAP 
22f00 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
22f10 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
22f20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
22f30 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
22f40 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65  d(), pFd, sqlite
22f50 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
22f60 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
22f70 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
22f80 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
22f90 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 46  n = pNew;.    pF
22fa0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 4d  d->mmapSize = nM
22fb0 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61  ap;.    pFd->mma
22fc0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4d  pSizeActual = nM
22fd0 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  ap;.  }..  OSTRA
22fe0 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69  CE(("MAP-FILE pi
22ff0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
23000 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
23020 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
23030 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 72  Id(), pFd));.  r
23040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23050 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
23060 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
23070 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
23080 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
23090 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
230a0 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
230b0 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
230c0 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
230d0 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
230e0 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
230f0 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
23100 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
23110 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
23120 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
23130 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
23140 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
23150 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
23160 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
23170 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
23180 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
23190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
231a0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
231b0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
231c0 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
231d0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
231e0 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
231f0 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
23200 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
23210 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
23220 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
23230 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
23240 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
23250 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a  st eventually.**
23260 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
23270 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
23280 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29 2e 0a  g winUnfetch()..
23290 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
232a0 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66  nFetch(sqlite3_f
232b0 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66  ile *fd, i64 iOf
232c0 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69  f, int nAmt, voi
232d0 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c  d **pp){.#if SQL
232e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
232f0 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  E>0.  winFile *p
23300 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66  Fd = (winFile*)f
23310 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
23320 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
23330 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  file */.#endif. 
23340 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f 53 54   *pp = 0;..  OST
23350 52 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64  RACE(("FETCH pid
23360 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
23370 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f  offset=%lld, amo
23380 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c 6e 22  unt=%d, pp=%p\n"
23390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
233a0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
233b0 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66 2c 20  Id(), fd, iOff, 
233c0 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23 69 66  nAmt, pp));..#if
233d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
233e0 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
233f0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  d->mmapSizeMax>0
23400 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d   ){.    if( pFd-
23410 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29  >pMapRegion==0 )
23420 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  {.      int rc =
23430 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 64 2c   winMapfile(pFd,
23440 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
23450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
23460 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
23470 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
23480 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
23490 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
234a0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
234b0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
234c0 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
234d0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
234e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
234f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23500 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
23510 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
23520 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
23530 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
23540 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
23550 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
23560 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
23570 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
23580 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c  E(("FETCH pid=%l
23590 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 70 3d  u, pFile=%p, pp=
235a0 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63 3d 53  %p, *pp=%p, rc=S
235b0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
235c0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
235d0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
235e0 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29 3b 0a   fd, pp, *pp));.
235f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23600 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
23610 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
23620 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
23630 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
23640 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a 2a 2a  on releases a.**
23650 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
23660 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
23670 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46 65 74  r call to winFet
23680 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64  ch(). The second
23690 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73  .** argument pas
236a0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
236b0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65  tion must be the
236c0 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72   same as the cor
236d0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72  responding.** ar
236e0 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20  gument that was 
236f0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 77 69  passed to the wi
23700 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74  nFetch() invocat
23710 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  ion..**.** Or, i
23720 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
23730 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
23740 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
23750 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
23760 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68  .** to inform th
23770 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61 74  e VFS layer that
23780 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50  , according to P
23790 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69  OSIX, any existi
237a0 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 6d 61  ng mapping.** ma
237b0 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64  y now be invalid
237c0 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75   and should be u
237d0 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74  nmapped..*/.stat
237e0 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65 74 63  ic int winUnfetc
237f0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
23800 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
23810 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
23820 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
23830 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  >0.  winFile *pF
23840 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64  d = (winFile*)fd
23850 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
23860 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  lying database f
23870 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20  ile */..  /* If 
23880 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
23890 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
238a0 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
238b0 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 20  no outstanding. 
238c0 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65 72   ** xFetch refer
238d0 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21  ences. Or, if p!
238e0 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69  =0 (meaning it i
238f0 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66 65  s an xFetch refe
23900 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65  rence),.  ** the
23910 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
23920 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74  at least one out
23930 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20  standing.  */.  
23940 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d  assert( (p==0)==
23950 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  (pFd->nFetchOut=
23960 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  =0) );..  /* If 
23970 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61  p!=0, it must ma
23980 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c  tch the iOff val
23990 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ue. */.  assert(
239a0 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75   p==0 || p==&((u
239b0 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67  8 *)pFd->pMapReg
239c0 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20  ion)[iOff] );.. 
239d0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46 45 54   OSTRACE(("UNFET
239e0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
239f0 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c  e=%p, offset=%ll
23a00 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20  d, p=%p\n",.    
23a10 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
23a20 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
23a30 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29 3b 0a  pFd, iOff, p));.
23a40 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
23a50 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d  pFd->nFetchOut--
23a60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23a70 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57 69 6e  * FIXME:  If Win
23a80 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77 61 79  dows truly alway
23a90 73 20 70 72 65 76 65 6e 74 73 20 74 72 75 6e 63  s prevents trunc
23aa0 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74 69 6e  ating or deletin
23ab0 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  g a.    ** file 
23ac0 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e 67 20  while a mapping 
23ad0 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20 74 68  is held, then th
23ae0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6e 55  e following winU
23af0 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c 6c 0a  nmapfile() call.
23b00 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65 63 65      ** is unnece
23b10 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f 6d 69  ssary can be omi
23b20 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69 61 6c  tted - potential
23b30 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20 20 20  ly improving.   
23b40 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e   ** performance.
23b50 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e 6d 61    */.    winUnma
23b60 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a  pfile(pFd);.  }.
23b70 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
23b80 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a  nFetchOut>=0 );.
23b90 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
23ba0 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
23bb0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
23bc0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
23bd0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
23be0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
23bf0 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65 74 75  (), fd));.  retu
23c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23c10 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73  ./*.** Here ends
23c20 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
23c30 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74  ion of all sqlit
23c40 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e  e3_file methods.
23c50 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
23c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73  ********** End s
23c70 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68  qlite3_file Meth
23c80 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
23c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ca0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
23cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23cf0 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  **/../*.** This 
23d00 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73 20 61  vector defines a
23d10 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73 20 74  ll the methods t
23d20 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74 65 20  hat can operate 
23d30 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  on an.** sqlite3
23d40 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33 32 2e  _file for win32.
23d50 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
23d60 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
23d70 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f 64 20  ods winIoMethod 
23d80 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20  = {.  3,        
23d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23da0 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
23db0 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c  n */.  winClose,
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
23de0 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20   */.  winRead,  
23df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e00 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
23e10 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20  /.  winWrite,   
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e30 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
23e40 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20  .  winTruncate, 
23e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e60 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
23e70 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20  */.  winSync,   
23e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e90 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
23ea0 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20  .  winFileSize, 
23eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ec0 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
23ed0 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20 20 20  */.  winLock,   
23ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ef0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
23f00 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20  .  winUnlock,   
23f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
23f30 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  .  winCheckReser
23f40 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  vedLock,        
23f50 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
23f60 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69  rvedLock */.  wi
23f70 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20  nFileControl,   
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f90 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
23fa0 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65  .  winSectorSize
23fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23fc0 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a     /* xSectorSiz
23fd0 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65  e */.  winDevice
23fe0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c  Characteristics,
23ff0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63         /* xDevic
24000 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
24010 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c   */.  winShmMap,
24020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24030 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
24040 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b   */.  winShmLock
24050 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24060 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
24070 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72  k */.  winShmBar
24080 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
24090 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61         /* xShmBa
240a0 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68  rrier */.  winSh
240b0 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20  mUnmap,         
240c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
240d0 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e  hmUnmap */.  win
240e0 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  Fetch,          
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24100 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55  xFetch */.  winU
24110 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20  nfetch          
24120 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24130 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f  Unfetch */.};../
24140 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72  *.** This vector
24150 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65   defines all the
24160 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61   methods that ca
24170 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a  n operate on an.
24180 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ** sqlite3_file 
24190 66 6f 72 20 77 69 6e 33 32 20 77 69 74 68 6f 75  for win32 withou
241a0 74 20 70 65 72 66 6f 72 6d 69 6e 67 20 61 6e 79  t performing any
241b0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61   locking..*/.sta
241c0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
241d0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e  3_io_methods win
241e0 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64 20 3d  IoNolockMethod =
241f0 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20   {.  3,         
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
24220 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20   */.  winClose, 
24230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24240 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
24250 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20 20 20  */.  winRead,   
24260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24270 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
24280 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20 20 20  .  winWrite,    
24290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242a0 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a     /* xWrite */.
242b0 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c 20 20    winTruncate,  
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
242e0 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20 20 20  /.  winSync,    
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a      /* xSync */.
24310 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20    winFileSize,  
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24330 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
24340 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 4c 6f 63  /.  winNolockLoc
24350 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24360 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
24370 20 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c 6f 63    winNolockUnloc
24380 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24390 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a    /* xUnlock */.
243a0 20 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b    winNolockCheck
243b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
243c0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
243d0 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e  vedLock */.  win
243e0 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20  FileControl,    
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24400 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a  xFileControl */.
24410 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c    winSectorSize,
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65    /* xSectorSize
24440 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63 65 43   */.  winDeviceC
24450 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20  haracteristics, 
24460 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63 65        /* xDevice
24470 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24480 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20  */.  winShmMap, 
24490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244a0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
244b0 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c  */.  winShmLock,
244c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
244e0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61 72 72   */.  winShmBarr
244f0 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
24500 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72        /* xShmBar
24510 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
24520 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20  Unmap,          
24530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
24540 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46  mUnmap */.  winF
24550 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
24560 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
24570 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e  Fetch */.  winUn
24580 66 65 74 63 68 20 20 20 20 20 20 20 20 20 20 20  fetch           
24590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
245a0 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 73 74  nfetch */.};..st
245b0 61 74 69 63 20 77 69 6e 56 66 73 41 70 70 44 61  atic winVfsAppDa
245c0 74 61 20 77 69 6e 41 70 70 44 61 74 61 20 3d 20  ta winAppData = 
245d0 7b 0a 20 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64  {.  &winIoMethod
245e0 2c 20 20 20 20 20 20 20 2f 2a 20 70 4d 65 74 68  ,       /* pMeth
245f0 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20  od */.  0,      
24600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
24610 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 30 20 20  AppData */.  0  
24620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24630 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d   /* bNoLock */.}
24640 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56 66 73  ;..static winVfs
24650 41 70 70 44 61 74 61 20 77 69 6e 4e 6f 6c 6f 63  AppData winNoloc
24660 6b 41 70 70 44 61 74 61 20 3d 20 7b 0a 20 20 26  kAppData = {.  &
24670 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f  winIoNolockMetho
24680 64 2c 20 2f 2a 20 70 4d 65 74 68 6f 64 20 2a 2f  d, /* pMethod */
24690 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
246a0 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
246b0 74 61 20 2a 2f 0a 20 20 31 20 20 20 20 20 20 20  ta */.  1       
246c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 62              /* b
246d0 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  NoLock */.};../*
246e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
246f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
24730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24740 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
24750 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
24760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24770 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
24780 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
24790 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
247a0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
247b0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
247c0 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
247d0 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  t..*/..#if defin
247e0 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f  ed(__CYGWIN__)./
247f0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 66  *.** Convert a f
24800 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61  ilename from wha
24810 74 65 76 65 72 20 74 68 65 20 75 6e 64 65 72 6c  tever the underl
24820 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
24830 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74  ystem.** support
24840 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20  s for filenames 
24850 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  into UTF-8.  Spa
24860 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
24870 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61  esult is.** obta
24880 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
24890 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
248a0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
248b0 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  g function..*/.s
248c0 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e 43  tatic char *winC
248d0 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65  onvertToUtf8File
248e0 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  name(const void 
248f0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63  *zFilename){.  c
24900 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  har *zConverted 
24910 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
24920 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
24930 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f  erted = winUnico
24940 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61  deToUtf8(zFilena
24950 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
24960 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
24970 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
24980 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
24990 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 46 69  inMbcsToUtf8(zFi
249a0 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c  lename, osAreFil
249b0 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
249c0 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
249d0 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
249e0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
249f0 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
24a00 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a  erted;.}.#endif.
24a10 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
24a20 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20   UTF-8 filename 
24a30 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20 66 6f  into whatever fo
24a40 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  rm the underlyin
24a50 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  g.** operating s
24a60 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69 6c 65  ystem wants file
24a70 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61 63 65  names in.  Space
24a80 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73   to hold the res
24a90 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e  ult.** is obtain
24aa0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61  ed from malloc a
24ab0 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64  nd must be freed
24ac0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a   by the calling.
24ad0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ** function..*/.
24ae0 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e  static void *win
24af0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
24b00 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68  ilename(const ch
24b10 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
24b20 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
24b30 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73  ed = 0;.  if( os
24b40 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43  IsNT() ){.    zC
24b50 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 74  onverted = winUt
24b60 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c  f8ToUnicode(zFil
24b70 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64  ename);.  }.#ifd
24b80 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
24b90 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
24ba0 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
24bb0 3d 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  = winUtf8ToMbcs(
24bc0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65  zFilename, osAre
24bd0 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
24be0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  .  }.#endif.  /*
24bf0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e   caller will han
24c00 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  dle out of memor
24c10 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43  y */.  return zC
24c20 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a  onverted;.}../*.
24c30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
24c40 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
24c50 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
24c60 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20  ed UTF-8 string 
24c70 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77  buffer.** ends w
24c80 69 74 68 20 61 20 64 69 72 65 63 74 6f 72 79 20  ith a directory 
24c90 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
24ca0 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73 20 73  ter or one was s
24cb0 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61  uccessfully.** a
24cc0 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73  dded to it..*/.s
24cd0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b  tatic int winMak
24ce0 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69 6e 74  eEndInDirSep(int
24cf0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
24d00 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66 20 29  f){.  if( zBuf )
24d10 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d  {.    int nLen =
24d20 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
24d30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66 28 20  (zBuf);.    if( 
24d40 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  nLen>0 ){.      
24d50 69 66 28 20 77 69 6e 49 73 44 69 72 53 65 70 28  if( winIsDirSep(
24d60 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b  zBuf[nLen-1]) ){
24d70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24d80 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
24d90 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29  f( nLen+1<nBuf )
24da0 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e  {.        zBuf[n
24db0 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44 69 72  Len] = winGetDir
24dc0 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20 20 7a  Sep();.        z
24dd0 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c  Buf[nLen+1] = '\
24de0 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0';.        retu
24df0 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
24e00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
24e10 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
24e20 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
24e30 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20 73 74  file name and st
24e40 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e  ore the resultin
24e50 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70  g pointer into p
24e60 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69  zBuf..** The poi
24e70 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69 6e  nter returned in
24e80 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 66   pzBuf must be f
24e90 72 65 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  reed via sqlite3
24ea0 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
24eb0 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
24ec0 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
24ed0 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20 2a 2a  s *pVfs, char **
24ee0 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63  pzBuf){.  static
24ef0 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
24f00 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
24f10 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
24f20 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
24f30 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
24f40 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
24f50 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c  89";.  size_t i,
24f60 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d   j;.  int nPre =
24f70 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
24f80 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
24f90 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69 6e 74  E_PREFIX);.  int
24fa0 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69   nMax, nBuf, nDi
24fb0 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20  r, nLen;.  char 
24fc0 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zBuf;..  /* It'
24fd0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
24fe0 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
24ff0 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
25000 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
25010 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
25020 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
25030 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
25040 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
25050 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
25060 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a  n failing..  */.
25070 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
25080 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
25090 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20  _IOERR );..  /* 
250a0 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d 70 6f  Allocate a tempo
250b0 72 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 73  rary buffer to s
250c0 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79 20 71  tore the fully q
250d0 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a 20 20  ualified file.  
250e0 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ** name for the 
250f0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
25100 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
25110 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e  we cannot contin
25120 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20  ue..  */.  nMax 
25130 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  = pVfs->mxPathna
25140 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20  me; nBuf = nMax 
25150 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71  + 2;.  zBuf = sq
25160 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
25170 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28 20 21   nBuf );.  if( !
25180 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53 54 52  zBuf ){.    OSTR
25190 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
251a0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
251b0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
251c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
251d0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
251e0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  PT;.  }..  /* Fi
251f0 67 75 72 65 20 6f 75 74 20 74 68 65 20 65 66 66  gure out the eff
25200 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61 72 79  ective temporary
25210 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46 69 72   directory.  Fir
25220 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f 6e 65  st, check if one
25230 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 65  .  ** has been e
25240 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20 62 79  xplicitly set by
25250 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e   the application
25260 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75 73 65  ; otherwise, use
25270 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f   the one.  ** co
25280 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 65 20  nfigured by the 
25290 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
252a0 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20  ..  */.  nDir = 
252b0 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b 20 31  nMax - (nPre + 1
252c0 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 44  5);.  assert( nD
252d0 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 73 71  ir>0 );.  if( sq
252e0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
252f0 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  tory ){.    int 
25300 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65  nDirLen = sqlite
25310 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
25320 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
25330 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 72 4c  );.    if( nDirL
25340 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  en>0 ){.      if
25350 28 20 21 77 69 6e 49 73 44 69 72 53 65 70 28 73  ( !winIsDirSep(s
25360 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
25370 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d  ctory[nDirLen-1]
25380 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 44 69  ) ){.        nDi
25390 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rLen++;.      }.
253a0 20 20 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65        if( nDirLe
253b0 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20 20 20  n>nDir ){.      
253c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
253d0 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Buf);.        OS
253e0 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
253f0 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
25400 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20  ERROR\n"));.    
25410 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
25420 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
25430 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
25440 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20  empname1", 0);. 
25450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
25460 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
25470 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
25480 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
25490 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20  ectory);.    }. 
254a0 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
254b0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73  _CYGWIN__).  els
254c0 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  e{.    static co
254d0 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
254e0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c  [] = {.       0,
254f0 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51 4c 49   /* getenv("SQLI
25500 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20  TE_TMPDIR") */. 
25510 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
25520 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a  nv("TMPDIR") */.
25530 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
25540 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20  env("TMP") */.  
25550 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e       0, /* geten
25560 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20  v("TEMP") */.   
25570 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
25580 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 20  ("USERPROFILE") 
25590 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61 72 2f  */.       "/var/
255a0 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 75  tmp",.       "/u
255b0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20  sr/tmp",.       
255c0 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  "/tmp",.       "
255d0 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20 20 20  .",.       0    
255e0 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
255f0 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b  inator */.    };
25600 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
25610 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  t i;.    const c
25620 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
25630 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
25640 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
25650 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
25660 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
25670 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
25680 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
25690 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 20  v("TMPDIR");.   
256a0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20   if( !azDirs[2] 
256b0 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65  ) azDirs[2] = ge
256c0 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20 20 20  tenv("TMP");.   
256d0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33 5d 20   if( !azDirs[3] 
256e0 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65  ) azDirs[3] = ge
256f0 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a 20 20  tenv("TEMP");.  
25700 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 34 5d    if( !azDirs[4]
25710 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67   ) azDirs[4] = g
25720 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f 46 49  etenv("USERPROFI
25730 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  LE");.    for(i=
25740 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
25750 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
25760 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69  s[0]); zDir=azDi
25770 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20  rs[i++]){.      
25780 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
25790 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 69 72  ;.      if( zDir
257a0 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
257b0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
257c0 70 61 74 68 20 73 74 61 72 74 73 20 77 69 74 68  path starts with
257d0 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72 20   a drive letter 
257e0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68 65 20  followed by the 
257f0 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63  colon.      ** c
25800 68 61 72 61 63 74 65 72 2c 20 61 73 73 75 6d 65  haracter, assume
25810 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
25820 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70 61   native Win32 pa
25830 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c 0a 20  th; otherwise,. 
25840 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73 74 20       ** it must 
25850 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20  be converted to 
25860 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20 70  a native Win32 p
25870 61 74 68 20 76 69 61 20 74 68 65 20 43 79 67 77  ath via the Cygw
25880 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a 2a 20  in API.      ** 
25890 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67 20 69  prior to using i
258a0 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
258b0 20 20 69 66 28 20 77 69 6e 49 73 44 72 69 76 65    if( winIsDrive
258c0 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a  LetterAndColon(z
258d0 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Dir) ){.        
258e0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
258f0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
25900 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20  ilename(zDir);. 
25910 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
25920 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
25930 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25940 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
25950 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
25960 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
25970 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
25980 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
25990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
259a0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
259b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
259c0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28 7a    if( winIsDir(z
259d0 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
259e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
259f0 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a  snprintf(nMax, z
25a00 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69 72 29  Buf, "%s", zDir)
25a10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
25a20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
25a30 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ted);.          
25a40 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
25a50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
25a60 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25a70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25a80 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
25a90 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ed = sqlite3Mall
25aa0 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29  ocZero( nMax+1 )
25ab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a  ;.        if( !z
25ac0 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
25ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
25ae0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
25af0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
25b00 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
25b10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
25b20 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
25b30 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
25b40 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25b50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  T;.        }.   
25b60 20 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f       if( cygwin_
25b70 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
25b80 20 20 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e             osIsN
25b90 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f  T() ? CCP_POSIX_
25ba0 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50  TO_WIN_W : CCP_P
25bb0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a  OSIX_TO_WIN_A, z
25bc0 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Dir,.           
25bd0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c       zConverted,
25be0 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20   nMax+1)<0 ){.  
25bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25c00 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
25c10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
25c20 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
25c30 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
25c40 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
25c50 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
25c60 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b  R_CONVPATH\n"));
25c70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
25c80 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
25c90 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
25ca0 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
25cb0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32  "winGetTempname2
25ce0 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20  ", zDir);.      
25cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
25d00 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
25d10 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
25d20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
25d30 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20  nt, we know the 
25d40 63 61 6e 64 69 64 61 74 65 20 64 69 72 65 63 74  candidate direct
25d50 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64 20 73  ory exists and s
25d60 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20  hould.          
25d70 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77  ** be used.  How
25d80 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65  ever, we may nee
25d90 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65  d to convert the
25da0 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69   string containi
25db0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
25dc0 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54  its name into UT
25dd0 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20  F-8 (i.e. if it 
25de0 69 73 20 55 54 46 2d 31 36 20 72 69 67 68 74 20  is UTF-16 right 
25df0 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20  now)..          
25e00 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  */.          cha
25e10 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
25e20 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
25e30 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ame(zConverted);
25e40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
25e50 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
25e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25e70 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25e80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
25e90 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
25ea0 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
25eb0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
25ec0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
25ed0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
25ee0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25ef0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
25f00 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
25f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25f20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
25f30 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
25f40 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
25f50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25f60 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
25f70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25f80 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
25f90 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
25fa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
25fc0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
25fd0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
25fe0 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  lif !SQLITE_OS_W
25ff0 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
26000 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
26010 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54 28 29  lse if( osIsNT()
26020 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   ){.    char *zM
26030 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53 54 52  ulti;.    LPWSTR
26040 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73 71 6c   zWidePath = sql
26050 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
26060 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43 48 41  nMax*sizeof(WCHA
26070 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  R) );.    if( !z
26080 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20 20 20  WidePath ){.    
26090 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
260a0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
260b0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
260c0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
260d0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
260e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
260f0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
26100 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
26110 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
26120 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61  hW(nMax, zWidePa
26130 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
26140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
26150 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20 20 73  dePath);.      s
26160 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
26170 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
26180 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
26190 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
261a0 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22 29  _GETTEMPPATH\n")
261b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
261c0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
261d0 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50  TE_IOERR_GETTEMP
261e0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
261f0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
26200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26210 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65   "winGetTempname
26220 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  2", 0);.    }.  
26230 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e    zMulti = winUn
26240 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69 64  icodeToUtf8(zWid
26250 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  ePath);.    if( 
26260 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20 20 20  zMulti ){.      
26270 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
26280 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73  (nMax, zBuf, "%s
26290 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ", zMulti);.    
262a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
262b0 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71  Multi);.      sq
262c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65  lite3_free(zWide
262d0 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Path);.    }else
262e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
262f0 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
26300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
26310 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
26320 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
26330 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
26340 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
26350 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
26360 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
26370 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
26380 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
26390 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
263a0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68  I.  else{.    ch
263b0 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63  ar *zUtf8;.    c
263c0 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d  har *zMbcsPath =
263d0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
263e0 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20  ro( nMax );.    
263f0 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29  if( !zMbcsPath )
26400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26410 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
26420 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
26430 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
26440 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
26450 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
26460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
26470 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
26480 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 54  }.    if( osGetT
26490 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a  empPathA(nMax, z
264a0 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a  MbcsPath)==0 ){.
264b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
264c0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
264d0 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
264e0 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
264f0 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
26500 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  ATH\n"));.      
26510 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
26520 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
26530 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f 73 47  GETTEMPPATH, osG
26540 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
26550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26560 20 20 20 20 20 20 20 20 22 77 69 6e 47 65 74 54          "winGetT
26570 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20  empname3", 0);. 
26580 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d     }.    zUtf8 =
26590 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a   winMbcsToUtf8(z
265a0 4d 62 63 73 50 61 74 68 2c 20 6f 73 41 72 65 46  MbcsPath, osAreF
265b0 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
265c0 20 20 20 20 69 66 28 20 7a 55 74 66 38 20 29 7b      if( zUtf8 ){
265d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
265e0 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
265f0 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  uf, "%s", zUtf8)
26600 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
26610 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
26620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
26630 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
26640 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
26650 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
26660 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
26670 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
26680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
26690 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
266a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
266b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
266c0 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23  32_HAS_ANSI */.#
266d0 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
266e0 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20  _OS_WINRT */..  
266f0 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f  /*.  ** Check to
26700 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 74   make sure the t
26710 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
26720 72 79 20 65 6e 64 73 20 77 69 74 68 20 61 6e 20  ry ends with an 
26730 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a  appropriate.  **
26740 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49 66 20   separator.  If 
26750 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20  it does not and 
26760 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f  there is not eno
26770 75 67 68 20 73 70 61 63 65 20 6c 65 66 74 20 74  ugh space left t
26780 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20  o add.  ** one, 
26790 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  fail..  */.  if(
267a0 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69   !winMakeEndInDi
267b0 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75  rSep(nDir+1, zBu
267c0 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  f) ){.    sqlite
267d0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
267e0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
267f0 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
26800 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
26810 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
26820 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
26830 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
26840 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20  empname4", 0);. 
26850 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68   }..  /*.  ** Ch
26860 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74  eck that the out
26870 70 75 74 20 62 75 66 66 65 72 20 69 73 20 6c 61  put buffer is la
26880 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74  rge enough for t
26890 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  he temporary fil
268a0 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74  e.  ** name in t
268b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72  he following for
268c0 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mat:.  **.  **  
268d0 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64 69 72   "<temporary_dir
268e0 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58  ectory>/etilqs_X
268f0 58 58 58 58 58 58 58 58 58 58 58 58 58 58 5c 30  XXXXXXXXXXXXXX\0
26900 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  \0".  **.  ** If
26910 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c   not, return SQL
26920 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68 65 20  ITE_ERROR.  The 
26930 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75 73 65  number 17 is use
26940 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65 72 20  d here in order 
26950 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20  to.  ** account 
26960 66 6f 72 20 74 68 65 20 73 70 61 63 65 20 75 73  for the space us
26970 65 64 20 62 79 20 74 68 65 20 31 35 20 63 68 61  ed by the 15 cha
26980 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20 73 75  racter random su
26990 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20 20 2a  ffix and the.  *
269a0 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e  * two trailing N
269b0 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e 20 20  UL characters.  
269c0 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65 63 74  The final direct
269d0 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20 63 68  ory separator ch
269e0 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68 61 73  aracter.  ** has
269f0 20 61 6c 72 65 61 64 79 20 61 64 64 65 64 20 69   already added i
26a00 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c 72  f it was not alr
26a10 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a 20 20  eady present..  
26a20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69  */.  nLen = sqli
26a30 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66  te3Strlen30(zBuf
26a40 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b  );.  if( (nLen +
26a50 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20 6e 42   nPre + 17) > nB
26a60 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  uf ){.    sqlite
26a70 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
26a80 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
26a90 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
26aa0 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a  ITE_ERROR\n"));.
26ab0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
26ac0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 45 52  gError(SQLITE_ER
26ad0 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65 74 54  ROR, 0, "winGetT
26ae0 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20  empname5", 0);. 
26af0 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e   }..  sqlite3_sn
26b00 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e  printf(nBuf-16-n
26b10 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20  Len, zBuf+nLen, 
26b20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
26b30 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d  _PREFIX);..  j =
26b40 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
26b50 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69 74 65  (zBuf);.  sqlite
26b60 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c  3_randomness(15,
26b70 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f   &zBuf[j]);.  fo
26b80 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b  r(i=0; i<15; i++
26b90 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66  , j++){.    zBuf
26ba0 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
26bb0 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
26bc0 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
26bd0 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
26be0 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d  ];.  }.  zBuf[j]
26bf0 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31   = 0;.  zBuf[j+1
26c00 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20  ] = 0;.  *pzBuf 
26c10 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41  = zBuf;..  OSTRA
26c20 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
26c30 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  ME name=%s, rc=S
26c40 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75  QLITE_OK\n", zBu
26c50 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  f));.  return SQ
26c60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26c70 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
26c80 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 20   the named file 
26c90 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69 72 65  is really a dire
26ca0 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e 20 66  ctory.  Return f
26cb0 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20 69 73  alse if.** it is
26cc0 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
26cd0 20 74 68 61 6e 20 61 20 64 69 72 65 63 74 6f 72   than a director
26ce0 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65 20 69  y, or if there i
26cf0 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65  s any kind of me
26d00 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
26d10 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
26d20 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
26d30 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  ir(const void *z
26d40 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20 44 57  Converted){.  DW
26d50 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
26d60 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
26d70 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66  lastErrno;..  if
26d80 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
26d90 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
26da0 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
26db0 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
26dc0 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
26dd0 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
26de0 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
26df0 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
26e00 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
26e10 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
26e20 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
26e30 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
26e60 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
26e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e80 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
26e90 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
26ea0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
26eb0 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
26ec0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65   !rc ){.      re
26ed0 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c  turn 0; /* Inval
26ee0 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20  id name? */.    
26ef0 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73 41 74  }.    attr = sAt
26f00 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
26f10 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53 51 4c  ributes;.#if SQL
26f20 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a  ITE_OS_WINCE==0.
26f30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 74 74    }else{.    att
26f40 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
26f50 72 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29  ributesA((char*)
26f60 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e  zConverted);.#en
26f70 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
26f80 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f   (attr!=INVALID_
26f90 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 29  FILE_ATTRIBUTES)
26fa0 20 26 26 20 28 61 74 74 72 26 46 49 4c 45 5f 41   && (attr&FILE_A
26fb0 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
26fc0 52 59 29 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72 77 61  RY);.}../* forwa
26fd0 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
26fe0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63  static int winAc
26ff0 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
27000 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27010 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
27020 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e  n win32 */.  con
27030 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
27040 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me,     /* Name 
27050 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b  of file to check
27060 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27080 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74   /* Type of test
27090 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73   to make on this
270a0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   file */.  int *
270b0 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20 20  pResOut         
270c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65        /* OUT: Re
270d0 73 75 6c 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a 0a 2a  sult */.);../*.*
270e0 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a  * Open a file..*
270f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
27100 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
27110 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27120 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74    /* Used to get
27130 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20 6c 65   maximum path le
27140 6e 67 74 68 20 61 6e 64 20 41 70 70 44 61 74 61  ngth and AppData
27150 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
27160 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
27170 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
27180 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20  ile (UTF-8) */. 
27190 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
271a0 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  d,         /* Wr
271b0 69 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66  ite the SQLite f
271c0 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
271d0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
271e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
271f0 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67  * Open mode flag
27200 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74  s */.  int *pOut
27210 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  Flags           
27220 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72   /* Status retur
27230 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20  n flags */.){.  
27240 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52  HANDLE h;.  DWOR
27250 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
27260 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72  .  DWORD dwDesir
27270 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52  edAccess;.  DWOR
27280 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20  D dwShareMode;. 
27290 20 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f   DWORD dwCreatio
272a0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20  nDisposition;.  
272b0 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64  DWORD dwFlagsAnd
272c0 41 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a  Attributes = 0;.
272d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
272e0 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70  NCE.  int isTemp
272f0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77   = 0;.#endif.  w
27300 69 6e 56 66 73 41 70 70 44 61 74 61 20 2a 70 41  inVfsAppData *pA
27310 70 70 44 61 74 61 3b 0a 20 20 77 69 6e 46 69 6c  ppData;.  winFil
27320 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
27330 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69 64 20  ile*)id;.  void 
27340 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20 20 20  *zConverted;    
27350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
27360 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e 63 6f  ename in OS enco
27370 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ding */.  const 
27380 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d 65 20  char *zUtf8Name 
27390 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69 6c 65  = zName; /* File
273a0 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20 65 6e  name in UTF-8 en
273b0 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  coding */.  int 
273c0 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
273d0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
273e0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
273f0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
27400 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
27410 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
27420 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
27430 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
27440 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
27450 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
27460 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20  har *zTmpname = 
27470 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70 6f 72  0; /* For tempor
27480 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20 69 66  ary filename, if
27490 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f 0a 0a   necessary. */..
274a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
274b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
274c0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
274d0 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69 66 20  urn Code */.#if 
274e0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
274f0 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49   || SQLITE_OS_WI
27500 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70 65 20  NCE.  int eType 
27510 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
27520 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
27530 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
27540 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20 69 73  #endif..  int is
27550 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
27560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
27570 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
27580 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
27590 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
275a0 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
275b0 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
275c0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
275d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
275e0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
275f0 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
27600 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
27610 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
27620 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
27630 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
27640 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
27650 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e  ITE);..#ifndef N
27660 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73 4f 70  DEBUG.  int isOp
27670 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69 73 43  enJournal = (isC
27680 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20  reate && (.     
27690 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45     eType==SQLITE
276a0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
276b0 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79  RNAL.     || eTy
276c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
276d0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  MAIN_JOURNAL.   
276e0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
276f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
27700 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
27710 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d  ACE(("OPEN name=
27720 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 6c  %s, pFile=%p, fl
27730 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c 61 67  ags=%x, pOutFlag
27740 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s=%p\n",.       
27750 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c 20 69      zUtf8Name, i
27760 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c  d, flags, pOutFl
27770 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ags));..  /* Che
27780 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
27790 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
277a0 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  true:.  **.  ** 
277b0 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e    (a) Exactly on
277c0 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49  e of the READWRI
277d0 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20  TE and READONLY 
277e0 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65  flags must be se
277f0 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 62  t, and.  **   (b
27800 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
27810 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
27820 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
27830 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
27840 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
27850 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
27860 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
27870 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
27880 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
27890 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
278a0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
278b0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
278c0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
278d0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
278e0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
278f0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
27900 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
27910 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
27920 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
27930 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
27940 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
27950 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
27960 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
27970 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
27980 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
27990 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
279a0 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
279b0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 0a  urnal are never.
279c0 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
279d0 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
279e0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
279f0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
27a00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
27a10 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
27a20 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
27a30 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
27a40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
27a50 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
27a60 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
27a70 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
27a80 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
27a90 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
27aa0 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
27ab0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
27ac0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
27ad0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
27ae0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
27af0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
27b00 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
27b10 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
27b20 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
27b30 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
27b40 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
27b50 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
27b60 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
27b70 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
27b80 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
27b90 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a 20 20  _OPEN_TEMP_DB.  
27ba0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
27bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
27bc0 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65  JOURNAL || eType
27bd0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
27be0 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20  MP_JOURNAL.     
27bf0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27c00 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
27c10 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53  AL   || eType==S
27c20 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
27c30 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20  R_JOURNAL.      
27c40 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
27c50 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
27c60 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
27c70 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
27c80 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
27c90 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ile!=0 );.  mems
27ca0 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
27cb0 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b 0a 20  eof(winFile));. 
27cc0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e 56 41   pFile->h = INVA
27cd0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
27ce0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ;..#if SQLITE_OS
27cf0 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21 7a 55  _WINRT.  if( !zU
27d00 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71 6c 69  tf8Name && !sqli
27d10 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
27d20 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ry ){.    sqlite
27d30 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45 52 52  3_log(SQLITE_ERR
27d40 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73 71 6c  OR,.        "sql
27d50 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
27d60 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73 68 6f  ory variable sho
27d70 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72 20 57  uld be set for W
27d80 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65 6e 64  inRT");.  }.#end
27d90 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  if..  /* If the 
27da0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
27db0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
27dc0 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65 72 61   is NULL, genera
27dd0 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70 6f 72  te a.  ** tempor
27de0 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 74 6f  ary file name to
27df0 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20   use.  */.  if( 
27e00 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a 20 20  !zUtf8Name ){.  
27e10 20 20 61 73 73 65 72 74 28 20 69 73 44 65 6c 65    assert( isDele
27e20 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a 6f 75  te && !isOpenJou
27e30 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d  rnal );.    rc =
27e40 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
27e50 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d 65 29  pVfs, &zTmpname)
27e60 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27e70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27e80 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
27e90 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 22 2c  name=%s, rc=%s",
27ea0 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71 6c 69   zUtf8Name, sqli
27eb0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
27ec0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
27ed0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74  c;.    }.    zUt
27ee0 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d  f8Name = zTmpnam
27ef0 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 61 74  e;.  }..  /* Dat
27f00 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20  abase filenames 
27f10 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20  are double-zero 
27f20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68  terminated if th
27f30 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a 2a 20  ey are not.  ** 
27f40 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d 65  URIs with parame
27f50 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74 68  ters.  Hence, th
27f60 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62 65  ey can always be
27f70 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a   passed into.  *
27f80 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  * sqlite3_uri_pa
27f90 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a 2f 0a  rameter()..  */.
27fa0 20 20 61 73 73 65 72 74 28 20 28 65 54 79 70 65    assert( (eType
27fb0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
27fc0 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61 67 73  IN_DB) || (flags
27fd0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
27fe0 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20 7a 55  RI) ||.       zU
27ff0 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65 33 53  tf8Name[sqlite3S
28000 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e 61 6d  trlen30(zUtf8Nam
28010 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  e)+1]==0 );..  /
28020 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 66 69  * Convert the fi
28030 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20 73 79  lename to the sy
28040 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e 20 2a  stem encoding. *
28050 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  /.  zConverted =
28060 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
28070 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55 74 66  tf8Filename(zUtf
28080 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43  8Name);.  if( zC
28090 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
280a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
280b0 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f  zTmpname);.    O
280c0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61  STRACE(("OPEN na
280d0 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45  me=%s, rc=SQLITE
280e0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a  _IOERR_NOMEM", z
280f0 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20 20  Utf8Name));.    
28100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
28110 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
28120 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e 49 73    }..  if( winIs
28130 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20  Dir(zConverted) 
28140 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
28150 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
28160 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28170 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
28180 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
28190 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
281a0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
281b0 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b  R", zUtf8Name));
281c0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
281d0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
281e0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69 73  R;.  }..  if( is
281f0 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
28200 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
28210 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20   = GENERIC_READ 
28220 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 3b  | GENERIC_WRITE;
28230 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77  .  }else{.    dw
28240 44 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20  DesiredAccess = 
28250 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a 20 20  GENERIC_READ;.  
28260 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  }..  /* SQLITE_O
28270 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 69 73  PEN_EXCLUSIVE is
28280 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   used to make su
28290 72 65 20 74 68 61 74 20 61 20 6e 65 77 20 66 69  re that a new fi
282a0 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65 61 74  le is.  ** creat
282b0 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65 73 6e  ed. SQLite doesn
282c0 27 74 20 75 73 65 20 69 74 20 74 6f 20 69 6e 64  't use it to ind
282d0 69 63 61 74 65 20 22 65 78 63 6c 75 73 69 76 65  icate "exclusive
282e0 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20 61 73   access".  ** as
282f0 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79 20 75   it is usually u
28300 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a  nderstood..  */.
28310 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
28320 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72 65 61  e ){.    /* Crea
28330 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65 2c 20  tes a new file, 
28340 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65 73 20  only if it does 
28350 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
28360 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 66 20  t. */.    /* If 
28370 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
28380 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20   it fails. */.  
28390 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
283a0 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41 54 45  osition = CREATE
283b0 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _NEW;.  }else if
283c0 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a 20 20  ( isCreate ){.  
283d0 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73 74 69    /* Open existi
283e0 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72 65 61  ng file, or crea
283f0 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  te if it doesn't
28400 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20 64 77   exist */.    dw
28410 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
28420 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57 41 59  ion = OPEN_ALWAY
28430 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  S;.  }else{.    
28440 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c 65 2c  /* Opens a file,
28450 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78 69 73   only if it exis
28460 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65  ts. */.    dwCre
28470 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
28480 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47   = OPEN_EXISTING
28490 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61 72 65  ;.  }..  dwShare
284a0 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48 41 52  Mode = FILE_SHAR
284b0 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48  E_READ | FILE_SH
284c0 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20 69 66  ARE_WRITE;..  if
284d0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
284e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
284f0 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64  E.    dwFlagsAnd
28500 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c  Attributes = FIL
28510 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49 44 44  E_ATTRIBUTE_HIDD
28520 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70 20 3d  EN;.    isTemp =
28530 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64 77   1;.#else.    dw
28540 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
28550 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  es = FILE_ATTRIB
28560 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a 20 20  UTE_TEMPORARY.  
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
28590 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
285a0 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20 20 20  DDEN.           
285b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285c0 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f      | FILE_FLAG_
285d0 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b  DELETE_ON_CLOSE;
285e0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
285f0 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
28600 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
28610 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
28620 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 70 6f  L;.  }.  /* Repo
28630 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  rts from the int
28640 65 72 6e 65 74 20 61 72 65 20 74 68 61 74 20 70  ernet are that p
28650 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20 61 6c  erformance is al
28660 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74 65 72  ways.  ** better
28670 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41   if FILE_FLAG_RA
28680 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73 20 75  NDOM_ACCESS is u
28690 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23 32 36  sed.  Ticket #26
286a0 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  99. */.#if SQLIT
286b0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64 77 46  E_OS_WINCE.  dwF
286c0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
286d0 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52  s |= FILE_FLAG_R
286e0 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23 65  ANDOM_ACCESS;.#e
286f0 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73 49 73  ndif..  if( osIs
28700 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
28710 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
28720 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45  CREATEFILE2_EXTE
28730 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 20  NDED_PARAMETERS 
28740 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65  extendedParamete
28750 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  rs;.    extended
28760 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53 69 7a  Parameters.dwSiz
28770 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45 41 54  e = sizeof(CREAT
28780 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44 5f  EFILE2_EXTENDED_
28790 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20 20 20  PARAMETERS);.   
287a0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
287b0 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ers.dwFileAttrib
287c0 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20 20 20  utes =.         
287d0 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74     dwFlagsAndAtt
287e0 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f 41  ributes & FILE_A
287f0 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b 0a 20  TTRIBUTE_MASK;. 
28800 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
28810 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c 61 67  eters.dwFileFlag
28820 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64 41 74  s = dwFlagsAndAt
28830 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45 5f  tributes & FILE_
28840 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  FLAG_MASK;.    e
28850 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
28860 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f 73 46  s.dwSecurityQosF
28870 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54 59 5f  lags = SECURITY_
28880 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20 20 65  ANONYMOUS;.    e
28890 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
288a0 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74 74 72  s.lpSecurityAttr
288b0 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20  ibutes = NULL;. 
288c0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
288d0 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74 65 46  eters.hTemplateF
288e0 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile = NULL;.    
288f0 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73  do{.      h = os
28900 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
28910 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
28920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28930 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
28940 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20    dwShareMode,. 
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
28990 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 20 26 65 78 74 65 6e 64 65 64 50        &extendedP
289c0 61 72 61 6d 65 74 65 72 73 29 3b 0a 20 20 20 20  arameters);.    
289d0 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49 44    if( h!=INVALID
289e0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 20  _HANDLE_VALUE ) 
289f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28  break;.      if(
28a00 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
28a10 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32 2c          int rc2,
28a20 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20 20   isRO = 0;.     
28a30 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
28a40 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
28a50 20 20 20 20 20 20 20 72 63 32 20 3d 20 77 69 6e         rc2 = win
28a60 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e 61  Access(pVfs, zNa
28a70 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  me, SQLITE_ACCES
28a80 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b 0a  S_READ, &isRO);.
28a90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
28aa0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
28ab0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
28ac0 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  2==SQLITE_OK && 
28ad0 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20 20  isRO ) break;.  
28ae0 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
28af0 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
28b00 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
28b10 29 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 64  ) );.#else.    d
28b20 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43  o{.      h = osC
28b30 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43 57  reateFileW((LPCW
28b40 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65          dwDesire
28b70 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20  dAccess,.       
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55   dwShareMode, NU
28ba0 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72              dwCr
28bc0 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f  eationDispositio
28bd0 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
28be0 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61             dwFla
28bf0 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c  gsAndAttributes,
28c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c10 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a           NULL);.
28c20 20 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56        if( h!=INV
28c30 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
28c40 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
28c50 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
28c60 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
28c70 72 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20  rc2, isRO = 0;. 
28c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65         sqlite3Be
28c90 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
28ca0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d  );.        rc2 =
28cb0 20 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c   winAccess(pVfs,
28cc0 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41   zName, SQLITE_A
28cd0 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52  CCESS_READ, &isR
28ce0 4f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  O);.        sqli
28cf0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
28d00 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  oc();.        if
28d10 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
28d20 20 26 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b   && isRO ) break
28d30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  ;.      }.    }w
28d40 68 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f  hile( winRetryIo
28d50 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
28d60 72 72 6e 6f 29 20 29 3b 0a 23 65 6e 64 69 66 0a  rrno) );.#endif.
28d70 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
28d80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
28d90 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 7b  .  else{.    do{
28da0 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43 72 65  .      h = osCre
28db0 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52  ateFileA((LPCSTR
28dc0 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28de0 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
28df0 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28e10 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
28e20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28e30 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
28e40 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
28e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e60 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41          dwFlagsA
28e70 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20  ndAttributes,.  
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20 20        NULL);.   
28ea0 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c 49     if( h!=INVALI
28eb0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
28ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
28ed0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
28ee0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 32  .        int rc2
28ef0 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20 20  , isRO = 0;.    
28f00 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
28f10 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
28f20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 77 69          rc2 = wi
28f30 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4e  nAccess(pVfs, zN
28f40 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  ame, SQLITE_ACCE
28f50 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29 3b  SS_READ, &isRO);
28f60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28f70 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
28f80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28f90 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  c2==SQLITE_OK &&
28fa0 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a 20   isRO ) break;. 
28fb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
28fc0 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  e( winRetryIoerr
28fd0 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e  (&cnt, &lastErrn
28fe0 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  o) );.  }.#endif
28ff0 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63  .  winLogIoerr(c
29000 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a  nt, __LINE__);..
29010 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e    OSTRACE(("OPEN
29020 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25   file=%p, name=%
29030 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20 72  s, access=%lx, r
29040 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66  c=%s\n", h, zUtf
29050 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  8Name,.         
29060 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
29070 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  s, (h==INVALID_H
29080 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22  ANDLE_VALUE) ? "
29090 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29  failed" : "ok"))
290a0 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41  ;..  if( h==INVA
290b0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
290c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
290d0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
290e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
290f0 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  ee(zTmpname);.  
29100 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
29110 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76  e && !isExclusiv
29120 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
29130 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20  n winOpen(pVfs, 
29140 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20  zName, id,.     
29150 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49      ((flags|SQLI
29160 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
29170 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) &.            
29180 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54           ~(SQLIT
29190 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51  E_OPEN_CREATE|SQ
291a0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
291b0 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20  ITE)),.         
291c0 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20  pOutFlags);.    
291d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
291e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
291f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
29200 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
29210 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46  ITE_CANTOPEN, pF
29220 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20  ile->lastErrno, 
29230 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38  "winOpen", zUtf8
29240 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Name);.      ret
29250 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
29260 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  PEN_BKPT;.    }.
29270 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46    }..  if( pOutF
29280 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20  lags ){.    if( 
29290 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
292a0 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20       *pOutFlags 
292b0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
292c0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  ADWRITE;.    }el
292d0 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46  se{.      *pOutF
292e0 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50  lags = SQLITE_OP
292f0 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  EN_READONLY;.   
29300 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43   }.  }..  OSTRAC
29310 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
29320 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
29330 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73  s=%lx, pOutFlags
29340 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d  =%p, *pOutFlags=
29350 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
29360 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a   "rc=%s\n", h, z
29370 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69  Utf8Name, dwDesi
29380 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46  redAccess, pOutF
29390 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20  lags, pOutFlags 
293a0 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f  ?.           *pO
293b0 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d  utFlags : 0, (h=
293c0 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
293d0 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64  VALUE) ? "failed
293e0 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 70  " : "ok"));..  p
293f0 41 70 70 44 61 74 61 20 3d 20 28 77 69 6e 56 66  AppData = (winVf
29400 73 41 70 70 44 61 74 61 2a 29 70 56 66 73 2d 3e  sAppData*)pVfs->
29410 70 41 70 70 44 61 74 61 3b 0a 0a 23 69 66 20 53  pAppData;..#if S
29420 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
29430 20 7b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61   {.    if( isRea
29440 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
29450 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
29460 4e 5f 44 42 0a 20 20 20 20 20 20 20 20 20 26 26  N_DB.         &&
29470 20 28 28 70 41 70 70 44 61 74 61 3d 3d 4e 55 4c   ((pAppData==NUL
29480 4c 29 20 7c 7c 20 21 70 41 70 70 44 61 74 61 2d  L) || !pAppData-
29490 3e 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20 20 20  >bNoLock).      
294a0 20 20 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63     && (rc = winc
294b0 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d  eCreateLock(zNam
294c0 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49  e, pFile))!=SQLI
294d0 54 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20 20 20  TE_OK.    ){.   
294e0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
294f0 28 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (h);.      sqlit
29500 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
29510 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
29520 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
29530 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
29540 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20  (("OPEN-CE-LOCK 
29550 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e  name=%s, rc=%s\n
29560 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65  ", zName, sqlite
29570 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
29580 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
29590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
295a0 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20 20 70   isTemp ){.    p
295b0 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
295c0 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72 74 65  lose = zConverte
295d0 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  d;.  }else.#endi
295e0 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65  f.  {.    sqlite
295f0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29600 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  d);.  }..  sqlit
29610 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65  e3_free(zTmpname
29620 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74  );.  pFile->pMet
29630 68 6f 64 20 3d 20 70 41 70 70 44 61 74 61 20 3f  hod = pAppData ?
29640 20 70 41 70 70 44 61 74 61 2d 3e 70 4d 65 74 68   pAppData->pMeth
29650 6f 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74 68 6f  od : &winIoMetho
29660 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56 66 73  d;.  pFile->pVfs
29670 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69 6c 65   = pVfs;.  pFile
29680 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28 20 69  ->h = h;.  if( i
29690 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20  sReadonly ){.   
296a0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
296b0 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f  s |= WINFILE_RDO
296c0 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  NLY;.  }.  if( s
296d0 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
296e0 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22  an(zName, "psow"
296f0 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
29700 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
29710 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
29720 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45  Flags |= WINFILE
29730 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69  _PSOW;.  }.  pFi
29740 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
29750 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c  NO_ERROR;.  pFil
29760 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65  e->zPath = zName
29770 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ;.#if SQLITE_MAX
29780 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70  _MMAP_SIZE>0.  p
29790 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c  File->hMap = NUL
297a0 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70  L;.  pFile->pMap
297b0 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46  Region = 0;.  pF
297c0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
297d0 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
297e0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a  SizeActual = 0;.
297f0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
29800 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
29810 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
29820 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65  p;.#endif..  Ope
29830 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
29840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29850 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6e  .** Delete the n
29860 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  amed file..**.**
29870 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e 64 6f   Note that Windo
29880 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  ws does not allo
29890 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65 20 64  w a file to be d
298a0 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  eleted if some o
298b0 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20  ther.** process 
298c0 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f  has it open.  So
298d0 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75 73 20  metimes a virus 
298e0 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78  scanner or index
298f0 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77  ing program.** w
29900 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e  ill open a journ
29910 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c 79 20  al file shortly 
29920 61 66 74 65 72 20 69 74 20 69 73 20 63 72 65 61  after it is crea
29930 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ted in order to 
29940 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72 20 69  do.** whatever i
29950 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65 20 74  t does.  While t
29960 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73  his other proces
29970 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
29980 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77  .** file open, w
29990 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65  e will be unable
299a0 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e 20 20   to delete it.  
299b0 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
299c0 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20  his.** problem, 
299d0 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d 69 6c  we delay 100 mil
299e0 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72  liseconds and tr
299f0 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67 61 69  y to delete agai
29a00 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f  n.  Up.** to MX_
29a10 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54  DELETION_ATTEMPT
29a20 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d  s deletion attem
29a30 70 74 73 20 61 72 65 20 72 75 6e 20 62 65 66 6f  pts are run befo
29a40 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20  re giving.** up 
29a50 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
29a60 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
29a70 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28  c int winDelete(
29a80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
29a90 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 2f  pVfs,          /
29aa0 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
29ab0 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
29ac0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
29ad0 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
29ae0 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 2a  file to delete *
29af0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b10 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77  /* Not used on w
29b20 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  in32 */.){.  int
29b30 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
29b40 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  rc;.  DWORD attr
29b50 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
29b60 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20  rno = 0;.  void 
29b70 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55  *zConverted;.  U
29b80 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29b90 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  pVfs);.  UNUSED_
29ba0 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63 44 69  PARAMETER(syncDi
29bb0 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  r);..  SimulateI
29bc0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
29bd0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
29be0 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  E);.  OSTRACE(("
29bf0 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
29c00 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a  syncDir=%d\n", z
29c10 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69  Filename, syncDi
29c20 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  r));..  zConvert
29c30 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
29c40 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
29c50 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
29c60 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
29c70 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
29c80 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c  "DELETE name=%s,
29c90 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
29ca0 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
29cb0 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
29cc0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29cd0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
29ce0 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
29cf0 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53  {.    do {.#if S
29d00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
29d10 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f       WIN32_FILE_
29d20 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
29d30 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20  AttrData;.      
29d40 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
29d50 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
29d60 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20  trData));.      
29d70 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74  if ( osGetFileAt
29d80 74 72 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e  tributesExW(zCon
29d90 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45  verted, GetFileE
29da0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29dd0 20 26 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a   &sAttrData) ){.
29de0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
29df0 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
29e00 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
29e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
29e20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
29e30 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
29e40 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
29e50 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
29e60 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
29e70 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
29e80 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
29e90 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
29ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
29eb0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
29ec0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
29ed0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
29ee0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29ef0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
29f00 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
29f10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
29f20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
29f30 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65  attr = osGetFile
29f40 41 74 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e  AttributesW(zCon
29f50 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a  verted);.#endif.
29f60 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d        if ( attr=
29f70 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
29f80 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20  TRIBUTES ){.    
29f90 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20      lastErrno = 
29fa0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
29fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61  ;.        if( la
29fc0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46  stErrno==ERROR_F
29fd0 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20  ILE_NOT_FOUND.  
29fe0 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72         || lastEr
29ff0 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f  rno==ERROR_PATH_
2a000 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20  NOT_FOUND ){.   
2a010 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2a020 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
2a030 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64  NOENT; /* Alread
2a040 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20  y gone? */.     
2a050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a060 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a070 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
2a080 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a0a0 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54   ( attr&FILE_ATT
2a0b0 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59  RIBUTE_DIRECTORY
2a0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a0d0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
2a0e0 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f  * Files only. */
2a0f0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2a100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2a110 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57   ( osDeleteFileW
2a120 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
2a130 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a140 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74  ITE_OK; /* Delet
2a150 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20  ed OK. */.      
2a160 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
2a170 0a 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e  .      if ( !win
2a180 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
2a190 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
2a1a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a1b0 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f  ITE_ERROR; /* No
2a1c0 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a   more retries. *
2a1d0 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
2a1e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
2a1f0 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66  hile(1);.  }.#if
2a200 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
2a210 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
2a220 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
2a230 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
2a240 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f  eAttributesA(zCo
2a250 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2a260 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c  if ( attr==INVAL
2a270 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
2a280 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61  ES ){.        la
2a290 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
2a2a0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
2a2b0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
2a2c0 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
2a2d0 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
2a2e0 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
2a2f0 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
2a300 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
2a310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2a320 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
2a330 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
2a340 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
2a350 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2a360 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a370 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2a380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a390 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  }.      if ( att
2a3a0 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  r&FILE_ATTRIBUTE
2a3b0 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20  _DIRECTORY ){.  
2a3c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a3d0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65  E_ERROR; /* File
2a3e0 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20  s only. */.     
2a3f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a400 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 44  }.      if ( osD
2a410 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76  eleteFileA(zConv
2a420 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
2a430 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2a440 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e  ; /* Deleted OK.
2a450 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
2a460 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2a470 20 69 66 20 28 20 21 77 69 6e 52 65 74 72 79 49   if ( !winRetryI
2a480 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
2a490 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  Errno) ){.      
2a4a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2a4b0 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20  ROR; /* No more 
2a4c0 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20  retries. */.    
2a4d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a4e0 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31   }.    } while(1
2a4f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2a500 69 66 28 20 72 63 20 26 26 20 72 63 21 3d 53 51  if( rc && rc!=SQ
2a510 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a520 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72  E_NOENT ){.    r
2a530 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
2a540 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a550 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ETE, lastErrno, 
2a560 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69  "winDelete", zFi
2a570 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65  lename);.  }else
2a580 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72  {.    winLogIoer
2a590 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  r(cnt, __LINE__)
2a5a0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2a5b0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2a5c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45  ;.  OSTRACE(("DE
2a5d0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
2a5e0 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%s\n", zFilenam
2a5f0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
2a600 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
2a610 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
2a620 68 65 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e  heck the existen
2a630 63 65 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66  ce and status of
2a640 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
2a650 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73  ic int winAccess
2a660 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
2a670 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f  *pVfs,         /
2a680 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69  * Not used on wi
2a690 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  n32 */.  const c
2a6a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2a6b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66      /* Name of f
2a6c0 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a  ile to check */.
2a6d0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2a6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a6f0 54 79 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20  Type of test to 
2a700 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c  make on this fil
2a710 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73  e */.  int *pRes
2a720 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
2a730 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74    /* OUT: Result
2a740 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61   */.){.  DWORD a
2a750 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ttr;.  int rc = 
2a760 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  0;.  DWORD lastE
2a770 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64  rrno = 0;.  void
2a780 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
2a790 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2a7a0 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c  (pVfs);..  Simul
2a7b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2a7c0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2a7d0 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54  ACCESS; );.  OST
2a7e0 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61  RACE(("ACCESS na
2a7f0 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c  me=%s, flags=%x,
2a800 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a   pResOut=%p\n",.
2a810 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
2a820 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65  name, flags, pRe
2a830 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  sOut));..  zConv
2a840 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
2a850 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
2a860 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
2a870 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
2a880 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2a890 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
2a8a0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
2a8b0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
2a8c0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
2a8d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2a8e0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2a8f0 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28   }.  if( osIsNT(
2a900 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74  ) ){.    int cnt
2a910 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f   = 0;.    WIN32_
2a920 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
2a930 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
2a940 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72     memset(&sAttr
2a950 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Data, 0, sizeof(
2a960 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20  sAttrData));.   
2a970 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d 20 6f   while( !(rc = o
2a980 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
2a990 65 73 45 78 57 28 28 4c 50 43 57 53 54 52 29 7a  esExW((LPCWSTR)z
2a9a0 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9c0 20 20 20 20 20 20 20 20 47 65 74 46 69 6c 65 45          GetFileE
2a9d0 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20  xInfoStandard,. 
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 20 20 20 20 20 20 20 20 20 20 20 26 73 41 74              &sAt
2aa00 74 72 44 61 74 61 29 29 20 26 26 20 77 69 6e 52  trData)) && winR
2aa10 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
2aa20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a  &lastErrno) ){}.
2aa30 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2aa40 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51      /* For an SQ
2aa50 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
2aa60 54 53 20 71 75 65 72 79 2c 20 74 72 65 61 74 20  TS query, treat 
2aa70 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69  a zero-length fi
2aa80 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20 69  le.      ** as i
2aa90 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 65 78  f it does not ex
2aaa0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ist..      */.  
2aab0 20 20 20 20 69 66 28 20 20 20 20 66 6c 61 67 73      if(    flags
2aac0 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  ==SQLITE_ACCESS_
2aad0 45 58 49 53 54 53 0a 20 20 20 20 20 20 20 20 20  EXISTS.         
2aae0 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
2aaf0 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20  ileSizeHigh==0. 
2ab00 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
2ab10 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c  rData.nFileSizeL
2ab20 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ow==0 ){.       
2ab30 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
2ab40 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
2ab50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ab60 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
2ab70 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
2ab80 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
2ab90 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2aba0 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e    winLogIoerr(cn
2abb0 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  t, __LINE__);.  
2abc0 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
2abd0 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o!=ERROR_FILE_NO
2abe0 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73 74 45  T_FOUND && lastE
2abf0 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48  rrno!=ERROR_PATH
2ac00 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
2ac10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2ac20 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2ac30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
2ac40 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2ac50 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 2c 20  E_IOERR_ACCESS, 
2ac60 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41  lastErrno, "winA
2ac70 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20 20 20  ccess",.        
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20     zFilename);. 
2aca0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2acb0 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c      attr = INVAL
2acc0 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
2acd0 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ES;.      }.    
2ace0 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  }.  }.#ifdef SQL
2acf0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2ad00 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 61  SI.  else{.    a
2ad10 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
2ad20 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
2ad30 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2ad40 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
2ad50 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2ad60 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68 28 20  ted);.  switch( 
2ad70 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73  flags ){.    cas
2ad80 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
2ad90 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65 20 53  READ:.    case S
2ada0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
2adb0 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20 3d 20  STS:.      rc = 
2adc0 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49  attr!=INVALID_FI
2add0 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20  LE_ATTRIBUTES;. 
2ade0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2adf0 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45  case SQLITE_ACCE
2ae00 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20  SS_READWRITE:.  
2ae10 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
2ae20 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
2ae30 49 42 55 54 45 53 20 26 26 0a 20 20 20 20 20 20  IBUTES &&.      
2ae40 20 20 20 20 20 20 20 28 61 74 74 72 20 26 20 46         (attr & F
2ae50 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 52 45  ILE_ATTRIBUTE_RE
2ae60 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20  ADONLY)==0;.    
2ae70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
2ae80 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
2ae90 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66 6c 61  rt(!"Invalid fla
2aea0 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20  gs argument");. 
2aeb0 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20   }.  *pResOut = 
2aec0 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  rc;.  OSTRACE(("
2aed0 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20  ACCESS name=%s, 
2aee0 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
2aef0 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
2af00 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
2af10 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20       zFilename, 
2af20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75  pResOut, *pResOu
2af30 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  t));.  return SQ
2af40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2af50 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
2af60 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
2af70 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 74  ied path name st
2af80 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76  arts with a driv
2af90 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c  e letter.** foll
2afa0 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20  owed by a colon 
2afb0 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
2afc0 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44  atic BOOL winIsD
2afd0 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
2afe0 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  on(.  const char
2aff0 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20   *zPathname.){. 
2b000 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69 74 65   return ( sqlite
2b010 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68 6e 61  3Isalpha(zPathna
2b020 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74 68 6e  me[0]) && zPathn
2b030 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d  ame[1]==':' );.}
2b040 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20  ../*.** Returns 
2b050 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20  non-zero if the 
2b060 73 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e  specified path n
2b070 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  ame should be us
2b080 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20 49 66  ed verbatim.  If
2b090 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  .** non-zero is 
2b0a0 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 74 68  returned from th
2b0b0 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  is function, the
2b0c0 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2b0d0 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a  n must simply.**
2b0e0 20 75 73 65 20 74 68 65 20 70 72 6f 76 69 64 65   use the provide
2b0f0 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65 72 62  d path name verb
2b100 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76  atim -OR- resolv
2b110 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c  e it into a full
2b120 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73   path name.** us
2b130 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c 6c 50  ing the GetFullP
2b140 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20 41 50  athName Win32 AP
2b150 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66 20 61  I function (if a
2b160 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74  vailable)..*/.st
2b170 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56  atic BOOL winIsV
2b180 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
2b190 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b1a0 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a  Pathname.){.  /*
2b1b0 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74  .  ** If the pat
2b1c0 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
2b1d0 74 68 20 61 20 66 6f 72 77 61 72 64 20 73 6c 61  th a forward sla
2b1e0 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c 61 73  sh or a backslas
2b1f0 68 2c 20 69 74 20 69 73 20 65 69 74 68 65 72 0a  h, it is either.
2b200 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43    ** a legal UNC
2b210 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20   name, a volume 
2b220 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c 20 6f  relative path, o
2b230 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
2b240 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20  th name in the. 
2b250 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72 6d 61   ** "Unix" forma
2b260 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54  t on Windows.  T
2b270 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73 79 20  here is no easy 
2b280 77 61 79 20 74 6f 20 64 69 66 66 65 72 65 6e 74  way to different
2b290 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20 20 2a  iate between.  *
2b2a0 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77 6f 20  * the final two 
2b2b0 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f 72 65  cases; therefore
2b2c0 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68 65 20  , we return the 
2b2d0 73 61 66 65 72 20 72 65 74 75 72 6e 20 76 61 6c  safer return val
2b2e0 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20  ue of TRUE.  ** 
2b2f0 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72 73 20  so that callers 
2b300 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2b310 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65   will simply use
2b320 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a 20 20   it verbatim..  
2b330 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44  */.  if ( winIsD
2b340 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b  irSep(zPathname[
2b350 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0]) ){.    retur
2b360 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
2b370 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70 61  *.  ** If the pa
2b380 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77  th name starts w
2b390 69 74 68 20 61 20 6c 65 74 74 65 72 20 61 6e 64  ith a letter and
2b3a0 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65   a colon it is e
2b3b0 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20  ither a volume. 
2b3c0 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70 61 74   ** relative pat
2b3d0 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65  h or an absolute
2b3e0 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72 73 20   path.  Callers 
2b3f0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
2b400 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61   must not.  ** a
2b410 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61 74 20  ttempt to treat 
2b420 69 74 20 61 73 20 61 20 72 65 6c 61 74 69 76 65  it as a relative
2b430 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e   path name (i.e.
2b440 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73 69 6d   they should sim
2b450 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69 74 20  ply use.  ** it 
2b460 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a  verbatim)..  */.
2b470 20 20 69 66 20 28 20 77 69 6e 49 73 44 72 69 76    if ( winIsDriv
2b480 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
2b490 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20  zPathname) ){.  
2b4a0 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
2b4b0 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66   }..  /*.  ** If
2b4c0 20 77 65 20 67 65 74 20 74 6f 20 74 68 69 73 20   we get to this 
2b4d0 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74 68 20  point, the path 
2b4e0 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f  name should almo
2b4f0 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62 65 20  st certainly be 
2b500 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65  a purely.  ** re
2b510 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e  lative one (i.e.
2b520 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c   not a UNC name,
2b530 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c 20 61   not absolute, a
2b540 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65  nd not volume re
2b550 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20  lative)..  */.  
2b560 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a  return FALSE;.}.
2b570 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
2b580 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
2b590 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
2b5a0 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74 68 65  name.  Write the
2b5b0 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d   full.** pathnam
2b5c0 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20  e into zOut[].  
2b5d0 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61  zOut[] will be a
2b5e0 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e 6d 78  t least pVfs->mx
2b5f0 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65  Pathname.** byte
2b600 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74  s in size..*/.st
2b610 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c  atic int winFull
2b620 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
2b630 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2b640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2b650 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2b660 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2b670 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20  ar *zRelative,  
2b680 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2b690 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70 75 74  y relative input
2b6a0 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e   path */.  int n
2b6b0 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Full,           
2b6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b6d0 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66 66 65   of output buffe
2b6e0 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  r in bytes */.  
2b6f0 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20  char *zFull     
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b710 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
2b720 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  /.){.#if !SQLITE
2b730 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
2b740 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
2b750 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
2b760 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42  IN__).  DWORD nB
2b770 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  yte;.  void *zCo
2b780 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20  nverted;.  char 
2b790 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a 0a 20  *zOut;.#endif.. 
2b7a0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68   /* If this path
2b7b0 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74   name begins wit
2b7c0 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22  h "/X:", where "
2b7d0 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62  X" is any alphab
2b7e0 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63  etic.  ** charac
2b7f0 74 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65  ter, discard the
2b800 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f   initial "/" fro
2b810 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a  m the pathname..
2b820 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61    */.  if( zRela
2b830 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  tive[0]=='/' && 
2b840 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
2b850 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69  AndColon(zRelati
2b860 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65  ve+1) ){.    zRe
2b870 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 23  lative++;.  }..#
2b880 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
2b890 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
2b8a0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
2b8b0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
2b8c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2b8d0 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
2b8e0 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
2b8f0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
2b900 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
2b910 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
2b920 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
2b930 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
2b940 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
2b950 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
2b960 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
2b970 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2b980 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
2b990 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
2b9a0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2b9b0 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
2b9c0 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
2b9d0 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
2b9e0 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
2b9f0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
2ba00 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
2ba10 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
2ba20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
2ba30 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
2ba40 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
2ba50 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
2ba60 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
2ba70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2ba80 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
2ba90 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
2baa0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
2bab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2bac0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2bad0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67     }.    if( cyg
2bae0 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
2baf0 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73             (osIs
2bb00 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
2bb10 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
2bb20 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20  POSIX_TO_WIN_A) 
2bb30 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 43  |.            CC
2bb40 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c  P_RELATIVE, zRel
2bb50 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66  ative, zOut, pVf
2bb60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
2bb70 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  <0 ){.      sqli
2bb80 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
2bb90 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2bba0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2bbb0 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
2bbc0 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c  H, (DWORD)errno,
2bbd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2bbe0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
2bbf0 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52  llPathname1", zR
2bc00 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65  elative);.    }e
2bc10 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
2bc20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76  *zUtf8 = winConv
2bc30 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
2bc40 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69  e(zOut);.      i
2bc50 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20  f( !zUtf8 ){.   
2bc60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2bc70 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20  e(zOut);.       
2bc80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2bc90 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2bca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2bcb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2bcc0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2bcd0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2bce0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2bd10 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2bd20 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55  nGetDirSep(), zU
2bd30 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
2bd40 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b  te3_free(zUtf8);
2bd50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2bd60 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d  ree(zOut);.    }
2bd70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
2bd80 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74  ar *zOut = sqlit
2bd90 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56  e3MallocZero( pV
2bda0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2bdb0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75   );.    if( !zOu
2bdc0 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
2bdd0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
2bde0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2bdf0 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f  .    if( cygwin_
2be00 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20  conv_path(.     
2be10 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29         (osIsNT()
2be20 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
2be30 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
2be40 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20  X_TO_WIN_A),.   
2be50 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69           zRelati
2be60 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e  ve, zOut, pVfs->
2be70 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20  mxPathname+1)<0 
2be80 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2be90 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
2bea0 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2beb0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2bec0 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20  TOPEN_CONVPATH, 
2bed0 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20  (DWORD)errno,.  
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2bf00 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61  athname2", zRela
2bf10 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  tive);.    }else
2bf20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55  {.      char *zU
2bf30 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  tf8 = winConvert
2bf40 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  ToUtf8Filename(z
2bf50 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Out);.      if( 
2bf60 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20  !zUtf8 ){.      
2bf70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2bf80 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Out);.        re
2bf90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2bfa0 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
2bfb0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
2bfc0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e  te3_snprintf(MIN
2bfd0 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78  (nFull, pVfs->mx
2bfe0 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c  Pathname), zFull
2bff0 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a  , "%s", zUtf8);.
2c000 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c010 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ee(zUtf8);.     
2c020 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
2c030 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
2c040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c050 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28  K;.#endif..#if (
2c060 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
2c070 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  || SQLITE_OS_WIN
2c080 52 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  RT) && !defined(
2c090 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
2c0a0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2c0b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2c0c0 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45  OR );.  /* WinCE
2c0d0 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20   has no concept 
2c0e0 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  of a relative pa
2c0f0 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20  thname, or so I 
2c100 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a  am told. */.  /*
2c110 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61   WinRT has no wa
2c120 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72  y to convert a r
2c130 65 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20  elative path to 
2c140 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e  an absolute one.
2c150 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74   */.  if ( sqlit
2c160 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
2c170 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61  y && !winIsVerba
2c180 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c  timPathname(zRel
2c190 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a  ative) ){.    /*
2c1a0 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65  .    ** NOTE: We
2c1b0 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2c1c0 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  h a relative pat
2c1d0 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64  h name and the d
2c1e0 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ata.    **      
2c1f0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
2c200 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66  een set.  Theref
2c210 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74  ore, use it as t
2c220 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20  he basis.    ** 
2c230 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72        for conver
2c240 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76  ting the relativ
2c250 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61  e path name to a
2c260 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a  n absolute.    *
2c270 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70  *       one by p
2c280 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61  repending the da
2c290 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  ta directory and
2c2a0 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20   a backslash..  
2c2b0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2c2c0 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46  _snprintf(MIN(nF
2c2d0 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74  ull, pVfs->mxPat
2c2e0 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22  hname), zFull, "
2c2f0 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20  %s%c%s",.       
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2c310 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
2c320 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53  tory, winGetDirS
2c330 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29  ep(), zRelative)
2c340 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
2c350 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c360 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2c370 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2c380 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61  ull, "%s", zRela
2c390 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tive);.  }.  ret
2c3a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
2c3b0 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49  endif..#if !SQLI
2c3c0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2c3d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2c3e0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2c3f0 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49 74 27  GWIN__).  /* It'
2c400 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
2c410 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
2c420 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
2c430 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
2c440 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
2c450 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
2c460 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
2c470 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
2c480 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
2c490 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
2c4a0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
2c4b0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
2c4c0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
2c4d0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
2c4e0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
2c4f0 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
2c500 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
2c510 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
2c520 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28  _ERROR );.  if (
2c530 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69   sqlite3_data_di
2c540 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49  rectory && !winI
2c550 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2c560 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a  e(zRelative) ){.
2c570 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f      /*.    ** NO
2c580 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69  TE: We are deali
2c590 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69  ng with a relati
2c5a0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64  ve path name and
2c5b0 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a   the data.    **
2c5c0 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79         directory
2c5d0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20   has been set.  
2c5e0 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69  Therefore, use i
2c5f0 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20  t as the basis. 
2c600 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20     **       for 
2c610 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72  converting the r
2c620 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2c630 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  e to an absolute
2c640 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e  .    **       on
2c650 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20  e by prepending 
2c660 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
2c670 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61  ry and a backsla
2c680 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  sh..    */.    s
2c690 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c6a0 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d  MIN(nFull, pVfs-
2c6b0 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46  >mxPathname), zF
2c6c0 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20  ull, "%s%c%s",. 
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6e0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61      sqlite3_data
2c6f0 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47  _directory, winG
2c700 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c  etDirSep(), zRel
2c710 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75  ative);.    retu
2c720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2c730 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d  }.  zConverted =
2c740 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55   winConvertFromU
2c750 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c  tf8Filename(zRel
2c760 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43  ative);.  if( zC
2c770 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2c780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2c790 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2c7a0 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  T;.  }.  if( osI
2c7b0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50 57  sNT() ){.    LPW
2c7c0 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20 6e  STR zTemp;.    n
2c7d0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2c7e0 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
2c7f0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
2c800 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
2c810 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
2c820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c830 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2c840 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2c850 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2c860 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2c870 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2c880 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c890 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2c8a0 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a  ullPathname1", z
2c8b0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2c8c0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
2c8d0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
2c8e0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2c8f0 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
2c900 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
2c910 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
2c920 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c930 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2c940 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c950 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2c960 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  PT;.    }.    nB
2c970 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2c980 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53 54  athNameW((LPCWST
2c990 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42  R)zConverted, nB
2c9a0 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a  yte, zTemp, 0);.
2c9b0 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30      if( nByte==0
2c9c0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2c9d0 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2c9e0 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
2c9f0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2ca00 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2ca10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2ca20 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
2ca30 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
2ca40 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2ca60 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c  nFullPathname2",
2ca70 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2ca80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2ca90 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
2caa0 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55  .    zOut = winU
2cab0 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65  nicodeToUtf8(zTe
2cac0 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mp);.    sqlite3
2cad0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2cae0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2caf0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
2cb00 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
2cb10 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79 74  *zTemp;.    nByt
2cb20 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74  e = osGetFullPat
2cb30 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43  hNameA((char*)zC
2cb40 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20  onverted, 0, 0, 
2cb50 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2cb60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2cb70 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2cb80 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65  erted);.      re
2cb90 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2cba0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2cbb0 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2cbc0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2cbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cbe0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2cbf0 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61 74  thname3", zRelat
2cc00 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2cc10 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20  nByte += 3;.    
2cc20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d  zTemp = sqlite3M
2cc30 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
2cc40 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d  *sizeof(zTemp[0]
2cc50 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65  ) );.    if( zTe
2cc60 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  mp==0 ){.      s
2cc70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2cc80 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2cc90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2cca0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
2ccb0 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d     }.    nByte =
2ccc0 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61   osGetFullPathNa
2ccd0 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  meA((char*)zConv
2cce0 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54  erted, nByte, zT
2ccf0 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  emp, 0);.    if(
2cd00 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
2cd10 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cd20 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2cd30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2cd40 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65  zTemp);.      re
2cd50 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
2cd60 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
2cd70 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74  _FULLPATH, osGet
2cd80 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
2cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cda0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
2cdb0 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74  thname4", zRelat
2cdc0 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ive);.    }.    
2cdd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2cde0 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f  nverted);.    zO
2cdf0 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74  ut = winMbcsToUt
2ce00 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46  f8(zTemp, osAreF
2ce10 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
2ce20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ce30 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e  (zTemp);.  }.#en
2ce40 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29  dif.  if( zOut )
2ce50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2ce60 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c  printf(MIN(nFull
2ce70 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
2ce80 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22  me), zFull, "%s"
2ce90 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c  , zOut);.    sql
2cea0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
2ceb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2cec0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2ced0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2cee0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2cef0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  PT;.  }.#endif.}
2cf00 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2cf10 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
2cf20 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72  SION./*.** Inter
2cf30 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e  faces for openin
2cf40 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61  g a shared libra
2cf50 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72  ry, finding entr
2cf60 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68  y points.** with
2cf70 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  in the shared li
2cf80 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69  brary, and closi
2cf90 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69  ng the shared li
2cfa0 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  brary..*/.static
2cfb0 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e   void *winDlOpen
2cfc0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2cfd0 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  fs, const char *
2cfe0 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41  zFilename){.  HA
2cff0 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69  NDLE h;.#if defi
2d000 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
2d010 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56    int nFull = pV
2d020 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
2d030 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  ;.  char *zFull 
2d040 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
2d050 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20  ero( nFull );.  
2d060 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
2d070 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c   = 0;.  if( zFul
2d080 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  l==0 ){.    OSTR
2d090 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2d0a0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2d0b0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2d0c0 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72  void*)0));.    r
2d0d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
2d0e0 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61  f( winFullPathna
2d0f0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
2d100 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c  me, nFull, zFull
2d110 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
2d120 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d130 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54  (zFull);.    OST
2d140 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2d150 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2d160 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2d170 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2d180 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2d190 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
2d1a0 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
2d1b0 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a  ilename(zFull);.
2d1c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d1d0 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76  Full);.#else.  v
2d1e0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
2d1f0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2d200 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
2d210 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45  lename);.  UNUSE
2d220 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2d230 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
2d240 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2d250 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
2d260 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68  LOPEN name=%s, h
2d270 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69  andle=%p\n", zFi
2d280 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30  lename, (void*)0
2d290 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  ));.    return 0
2d2a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73  ;.  }.  if( osIs
2d2b0 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49  NT() ){.#if SQLI
2d2c0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
2d2d0 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67  h = osLoadPackag
2d2e0 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53  edLibrary((LPCWS
2d2f0 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  TR)zConverted, 0
2d300 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d  );.#else.    h =
2d310 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28   osLoadLibraryW(
2d320 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
2d330 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  ted);.#endif.  }
2d340 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
2d350 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
2d360 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73  else{.    h = os
2d370 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63 68  LoadLibraryA((ch
2d380 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
2d390 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
2d3a0 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2d3b0 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2d3c0 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2d3d0 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73   (void*)h));.  s
2d3e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2d3f0 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72  verted);.  retur
2d400 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74  n (void*)h;.}.st
2d410 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45  atic void winDlE
2d420 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2d430 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2d440 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
2d450 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2d460 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69  ETER(pVfs);.  wi
2d470 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67  nGetLastErrorMsg
2d480 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28  (osGetLastError(
2d490 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  ), nBuf, zBufOut
2d4a0 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2d4b0 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69   (*winDlSym(sqli
2d4c0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f  te3_vfs *pVfs,vo
2d4d0 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61  id *pH,const cha
2d4e0 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
2d4f0 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b  .  FARPROC proc;
2d500 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2d510 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f  TER(pVfs);.  pro
2d520 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64  c = osGetProcAdd
2d530 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48  ressA((HANDLE)pH
2d540 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41  , zSym);.  OSTRA
2d550 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c  CE(("DLSYM handl
2d560 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c  e=%p, symbol=%s,
2d570 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a   address=%p\n",.
2d580 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
2d590 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69  *)pH, zSym, (voi
2d5a0 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74  d*)proc));.  ret
2d5b0 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69  urn (void(*)(voi
2d5c0 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69  d))proc;.}.stati
2d5d0 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73  c void winDlClos
2d5e0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
2d5f0 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  Vfs, void *pHand
2d600 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
2d610 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2d620 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28 28   osFreeLibrary((
2d630 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b  HANDLE)pHandle);
2d640 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43  .  OSTRACE(("DLC
2d650 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  LOSE handle=%p\n
2d660 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c  ", (void*)pHandl
2d670 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20  e));.}.#else /* 
2d680 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  if SQLITE_OMIT_L
2d690 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73  OAD_EXTENSION is
2d6a0 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23   defined: */.  #
2d6b0 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e  define winDlOpen
2d6c0 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
2d6d0 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65  nDlError 0.  #de
2d6e0 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20  fine winDlSym   
2d6f0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2d700 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a  lClose 0.#endif.
2d710 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d  ./* State inform
2d720 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61  ation for the ra
2d730 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65  ndomness gathere
2d740 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  r. */.typedef st
2d750 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68  ruct EntropyGath
2d760 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68  erer EntropyGath
2d770 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74  erer;.struct Ent
2d780 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20  ropyGatherer {. 
2d790 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d7a0 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65  a;   /* Gather e
2d7b0 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73  ntropy into this
2d7c0 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
2d7d0 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20 20   na;            
2d7e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20   /* Size of a[] 
2d7f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
2d800 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
2d810 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e    /* XOR next in
2d820 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f  put into a[i] */
2d830 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20  .  int nXor;    
2d840 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d850 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f   of XOR operatio
2d860 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23  ns done */.};..#
2d870 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2d880 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
2d890 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2d8a0 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20  _RANDOMNESS)./* 
2d8b0 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20  Mix sz bytes of 
2d8c0 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20  entropy into p. 
2d8d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  */.static void x
2d8e0 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79  orMemory(Entropy
2d8f0 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73  Gatherer *p, uns
2d900 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69  igned char *x, i
2d910 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c  nt sz){.  int j,
2d920 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b   k;.  for(j=0, k
2d930 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b  =p->i; j<sz; j++
2d940 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d  ){.    p->a[k++]
2d950 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66   ^= x[j];.    if
2d960 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d  ( k>=p->na ) k =
2d970 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d   0;.  }.  p->i =
2d980 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d   k;.  p->nXor +=
2d990 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   sz;.}.#endif /*
2d9a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2d9b0 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2d9c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2d9d0 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a 2f  ANDOMNESS) */../
2d9e0 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f  *.** Write up to
2d9f0 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 72   nBuf bytes of r
2da00 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a  andomness into z
2da10 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Buf..*/.static i
2da20 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73  nt winRandomness
2da30 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2da40 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  fs, int nBuf, ch
2da50 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64  ar *zBuf){.#if d
2da60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
2da70 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  ST) || defined(S
2da80 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f  QLITE_OMIT_RANDO
2da90 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f  MNESS).  UNUSED_
2daa0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2dab0 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
2dac0 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75  0, nBuf);.  retu
2dad0 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20  rn nBuf;.#else. 
2dae0 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72   EntropyGatherer
2daf0 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   e;.  UNUSED_PAR
2db00 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2db10 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
2db20 6e 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d 20 28  nBuf);.  e.a = (
2db30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a  unsigned char*)z
2db40 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42  Buf;.  e.na = nB
2db50 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30  uf;.  e.nXor = 0
2db60 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b  ;.  e.i = 0;.  {
2db70 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20  .    SYSTEMTIME 
2db80 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74  x;.    osGetSyst
2db90 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20  emTime(&x);.    
2dba0 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2dbb0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 78  nsigned char*)&x
2dbc0 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 54  , sizeof(SYSTEMT
2dbd0 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20  IME));.  }.  {. 
2dbe0 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d 20 6f     DWORD pid = o
2dbf0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
2dc00 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f 72 4d  ssId();.    xorM
2dc10 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2dc20 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64 2c 20  ned char*)&pid, 
2dc30 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a  sizeof(DWORD));.
2dc40 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f    }.#if SQLITE_O
2dc50 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20  S_WINRT.  {.    
2dc60 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
2dc70 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
2dc80 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  ();.    xorMemor
2dc90 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2dca0 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65  char*)&cnt, size
2dcb0 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a  of(ULONGLONG));.
2dcc0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
2dcd0 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73    DWORD cnt = os
2dce0 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a  GetTickCount();.
2dcf0 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2dd00 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2dd10 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 44  *)&cnt, sizeof(D
2dd20 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  WORD));.  }.#end
2dd30 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2dd40 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20 20 20  WINRT */.  {.   
2dd50 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 20 69   LARGE_INTEGER i
2dd60 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50 65 72  ;.    osQueryPer
2dd70 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 28  formanceCounter(
2dd80 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  &i);.    xorMemo
2dd90 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2dda0 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a 65 6f   char*)&i, sizeo
2ddb0 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 29  f(LARGE_INTEGER)
2ddc0 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51 4c 49  );.  }.#if !SQLI
2ddd0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2dde0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2ddf0 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
2de00 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20 20 20  USE_UUID.  {.   
2de10 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65   UUID id;.    me
2de20 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a  mset(&id, 0, siz
2de30 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20  eof(UUID));.    
2de40 6f 73 55 75 69 64 43 72 65 61 74 65 28 26 69 64  osUuidCreate(&id
2de50 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79  );.    xorMemory
2de60 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  (&e, (unsigned c
2de70 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f 66  har*)&id, sizeof
2de80 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d 65 6d  (UUID));.    mem
2de90 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65  set(&id, 0, size
2dea0 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f  of(UUID));.    o
2deb0 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  sUuidCreateSeque
2dec0 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20 20  ntial(&id);.    
2ded0 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2dee0 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69  nsigned char*)&i
2def0 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29  d, sizeof(UUID))
2df00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
2df10 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2df20 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2df30 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
2df40 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20 2a 2f  IN32_USE_UUID */
2df50 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58 6f 72  .  return e.nXor
2df60 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a 20 65  >nBuf ? nBuf : e
2df70 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20 2f 2a  .nXor;.#endif /*
2df80 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2df90 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2dfa0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2dfb0 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a  DOMNESS) */.}...
2dfc0 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
2dfd0 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
2dfe0 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
2dff0 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
2e000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e010 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74 65 33  winSleep(sqlite3
2e020 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2e030 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73 71 6c  microsec){.  sql
2e040 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
2e050 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f  ((microsec+999)/
2e060 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45 44 5f  1000);.  UNUSED_
2e070 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2e080 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69 63 72  .  return ((micr
2e090 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29 2a  osec+999)/1000)*
2e0a0 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  1000;.}../*.** T
2e0b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
2e0c0 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
2e0d0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
2e0e0 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  e, is interprete
2e0f0 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  d as.** the numb
2e100 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69  er of seconds si
2e110 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20  nce 1970 and is 
2e120 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20  used to set the 
2e130 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c  result of.** sql
2e140 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
2e150 65 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69  e() during testi
2e160 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ng..*/.#ifdef SQ
2e170 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71  LITE_TEST.int sq
2e180 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2e190 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65  me = 0;  /* Fake
2e1a0 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20   system time in 
2e1b0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
2e1c0 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f  70. */.#endif../
2e1d0 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
2e1e0 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
2e1f0 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
2e200 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
2e210 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a  te into *piNow.*
2e220 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  * the current ti
2e230 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2e240 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2e250 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f  er times 86_400_
2e260 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65  000.  In.** othe
2e270 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69  r words, write i
2e280 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e  nto *piNow the n
2e290 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
2e2a0 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20  conds since the 
2e2b0 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20  Julian.** epoch 
2e2c0 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e  of noon in Green
2e2d0 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72  wich on November
2e2e0 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63   24, 4714 B.C ac
2e2f0 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a  cording to the.*
2e300 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67  * proleptic Greg
2e310 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a  orian calendar..
2e320 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73  **.** On success
2e330 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2e340 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  OK.  Return SQLI
2e350 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20  TE_ERROR if the 
2e360 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a 2a 2a  time and date.**
2e370 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
2e380 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e390 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2e3a0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
2e3b0 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
2e3c0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
2e3d0 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
2e3e0 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
2e3f0 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
2e400 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
2e410 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  of.     100-nano
2e420 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
2e430 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
2e440 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
2e450 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20  5813.5)..  */.  
2e460 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 73  FILETIME ft;.  s
2e470 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2e480 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46 69 6c  te3_int64 winFil
2e490 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32 33 30  etimeEpoch = 230
2e4a0 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33 5f 69  58135*(sqlite3_i
2e4b0 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 69  nt64)8640000;.#i
2e4c0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2e4d0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
2e4e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
2e4f0 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
2e500 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
2e510 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e 64 69  4)8640000;.#endi
2e520 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20 74 6f  f.  /* 2^32 - to
2e530 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20 4c 4c   avoid use of LL
2e540 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 69 6e   and warnings in
2e550 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74 69 63   gcc */.  static
2e560 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2e570 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56 61 6c  nt64 max32BitVal
2e580 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71 6c 69  ue =.      (sqli
2e590 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30  te3_int64)200000
2e5a0 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65 33 5f  0000 + (sqlite3_
2e5b0 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
2e5c0 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65   +.      (sqlite
2e5d0 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37 32 39  3_int64)29496729
2e5e0 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  6;..#if SQLITE_O
2e5f0 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54 45 4d  S_WINCE.  SYSTEM
2e600 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f 73 47  TIME time;.  osG
2e610 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
2e620 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53 79 73  me);.  /* if Sys
2e630 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2e640 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20 72 65  e() fails, it re
2e650 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20  turns zero. */. 
2e660 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d 54 69   if (!osSystemTi
2e670 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69  meToFileTime(&ti
2e680 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20 72 65  me,&ft)){.    re
2e690 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2e6a0 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 6f  R;.  }.#else.  o
2e6b0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73  sGetSystemTimeAs
2e6c0 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b  FileTime( &ft );
2e6d0 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69 4e 6f  .#endif..  *piNo
2e6e0 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d 65 45  w = winFiletimeE
2e6f0 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20 20 20  poch +.         
2e700 20 20 20 28 28 28 28 73 71 6c 69 74 65 33 5f 69     ((((sqlite3_i
2e710 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68 44 61  nt64)ft.dwHighDa
2e720 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42 69 74  teTime)*max32Bit
2e730 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20 20 20  Value) +.       
2e740 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
2e750 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f 77 44  _int64)ft.dwLowD
2e760 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69 74 65  ateTime)/(sqlite
2e770 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b 0a 0a  3_int64)10000;..
2e780 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e790 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ST.  if( sqlite3
2e7a0 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b  _current_time ){
2e7b0 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30  .    *piNow = 10
2e7c0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
2e7d0 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  4)sqlite3_curren
2e7e0 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f  t_time + unixEpo
2e7f0 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ch;.  }.#endif. 
2e800 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2e810 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2e820 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e830 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
2e840 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
2e850 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
2e860 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
2e870 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
2e880 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2e890 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2e8a0 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
2e8b0 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
2e8c0 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
2e8d0 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
2e8e0 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
2e8f0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
2e900 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d  nt winCurrentTim
2e910 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
2e920 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e  Vfs, double *prN
2e930 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ow){.  int rc;. 
2e940 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
2e950 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75 72 72  ;.  rc = winCurr
2e960 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
2e970 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20 21 72  s, &i);.  if( !r
2e980 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  c ){.    *prNow 
2e990 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a  = i/86400000.0;.
2e9a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2e9b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 64  .}../*.** The id
2e9c0 65 61 20 69 73 20 74 68 61 74 20 74 68 69 73 20  ea is that this 
2e9d0 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 6c  function works l
2e9e0 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f  ike a combinatio
2e9f0 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73 74 45  n of.** GetLastE
2ea00 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72 6d 61  rror() and Forma
2ea10 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20 57 69  tMessage() on Wi
2ea20 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e 6f 20  ndows (or errno 
2ea30 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f  and.** strerror_
2ea40 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20 41 66  r() on Unix). Af
2ea50 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69 73 20  ter an error is 
2ea60 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 4f  returned by an O
2ea70 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 53  S.** function, S
2ea80 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68 69 73  QLite calls this
2ea90 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 7a   function with z
2eaa0 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a  Buf pointing to.
2eab0 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66 20 6e  ** a buffer of n
2eac0 42 75 66 20 62 79 74 65 73 2e 20 54 68 65 20 4f  Buf bytes. The O
2ead0 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64 20 70  S layer should p
2eae0 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a 20 62  opulate the.** b
2eaf0 75 66 66 65 72 20 77 69 74 68 20 61 20 6e 75 6c  uffer with a nul
2eb00 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54 46 2d  -terminated UTF-
2eb10 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f 72 20  8 encoded error 
2eb20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73 63 72  message.** descr
2eb30 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74 20 49  ibing the last I
2eb40 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  O error to have 
2eb50 6f 63 63 75 72 72 65 64 20 77 69 74 68 69 6e 20  occurred within 
2eb60 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74  the calling.** t
2eb70 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  hread..**.** If 
2eb80 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
2eb90 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65 20 66  e is too large f
2eba0 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  or the supplied 
2ebb0 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20 73 68  buffer,.** it sh
2ebc0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
2ebd0 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  d. The return va
2ebe0 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73 74 45  lue of xGetLastE
2ebf0 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rror.** is zero 
2ec00 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
2ec10 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
2ec20 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
2ec30 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
2ec40 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
2ec50 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
2ec60 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73  . If non-zero is
2ec70 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 74 68   returned,.** th
2ec80 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  en it is not nec
2ec90 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c 75 64  essary to includ
2eca0 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  e the nul-termin
2ecb0 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 0a 2a  ator character.*
2ecc0 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 20  * in the output 
2ecd0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  buffer..**.** No
2ece0 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e 20 65  t supplying an e
2ecf0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69 6c  rror message wil
2ed00 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65 72 73  l have no advers
2ed10 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e 20 53  e effect.** on S
2ed20 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66 69 6e  QLite. It is fin
2ed30 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69 6d 70  e to have an imp
2ed40 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
2ed50 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75 72 6e   never.** return
2ed60 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
2ed70 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20  ge:.**.**   int 
2ed80 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  xGetLastError(sq
2ed90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2eda0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2edb0 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20 20 61  *zBuf){.**     a
2edc0 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d 3d 27  ssert(zBuf[0]=='
2edd0 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72 65 74  \0');.**     ret
2ede0 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a  urn 0;.**   }.**
2edf0 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66 20 61  .** However if a
2ee00 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2ee10 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69 74 20  is supplied, it 
2ee20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70 6f 72  will be incorpor
2ee30 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  ated.** by sqlit
2ee40 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f 72  e into the error
2ee50 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c 61 62   message availab
2ee60 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72 20 75  le to the user u
2ee70 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
2ee80 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73 69 62  errmsg(), possib
2ee90 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65 72 72  ly making IO err
2eea0 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20 64 65  ors easier to de
2eeb0 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  bug..*/.static i
2eec0 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
2eed0 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2eee0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2eef0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 44  char *zBuf){.  D
2ef00 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61  WORD e = osGetLa
2ef10 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55 4e 55  stError();.  UNU
2ef20 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2ef30 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75 66 3e  fs);.  if( nBuf>
2ef40 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74 45 72  0 ) winGetLastEr
2ef50 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66 2c 20  rorMsg(e, nBuf, 
2ef60 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  zBuf);.  return 
2ef70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  e;.}../*.** Init
2ef80 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69 6e 69  ialize and deini
2ef90 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70 65 72  tialize the oper
2efa0 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6e 74  ating system int
2efb0 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73  erface..*/.int s
2efc0 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76  qlite3_os_init(v
2efd0 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 73  oid){.  static s
2efe0 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 56 66  qlite3_vfs winVf
2eff0 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20  s = {.    3,    
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a   /* iVersion */.
2f020 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69      sizeof(winFi
2f030 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a  le),       /* sz
2f040 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2f050 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
2f060 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2f070 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f080 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2f090 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20         /* pNext 
2f0a0 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20  */.    "win32", 
2f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f0c0 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77   zName */.    &w
2f0d0 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20 20  inAppData,      
2f0e0 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2f0f0 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2f100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f110 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2f120 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2f130 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65        /* xDelete
2f140 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73   */.    winAcces
2f150 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2f160 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20  * xAccess */.   
2f170 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2f180 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c  ,       /* xFull
2f190 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2f1a0 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20  winDlOpen,      
2f1b0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2f1c0 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2f1d0 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
2f1e0 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20  /* xDlError */. 
2f1f0 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20     winDlSym,    
2f200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f210 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2f220 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2f230 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2f240 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2f250 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ss,         /* x
2f260 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2f270 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2f280 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65           /* xSle
2f290 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  ep */.    winCur
2f2a0 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 20  rentTime,       
2f2b0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2f2c0 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61   */.    winGetLa
2f2d0 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 2f  stError,       /
2f2e0 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  * xGetLastError 
2f2f0 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2f300 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a  tTimeInt64,   /*
2f310 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2f320 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2f330 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f340 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61   /* xSetSystemCa
2f350 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  ll */.    winGet
2f360 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20  SystemCall,     
2f370 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2f380 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2f390 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f3a0 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2f3b0 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
2f3c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2f3d0 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2f3e0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2f3f0 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
2f400 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2f410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f420 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2f430 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2f440 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20 73  ile),       /* s
2f450 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53  zOsFile */.    S
2f460 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f  QLITE_WINNT_MAX_
2f470 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d  PATH_BYTES, /* m
2f480 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  xPathname */.   
2f490 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2f4a0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
2f4b0 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 2d 6c   */.    "win32-l
2f4c0 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20 20 2f  ongpath",      /
2f4d0 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 26  * zName */.    &
2f4e0 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20 20  winAppData,     
2f4f0 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2f500 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2f510 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f520 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20  /* xOpen */.    
2f530 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20  winDelete,      
2f540 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2f550 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2f560 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ss,             
2f570 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2f580 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2f590 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c  e,       /* xFul
2f5a0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2f5b0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2f5c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70          /* xDlOp
2f5d0 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45  en */.    winDlE
2f5e0 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
2f5f0 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
2f600 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20      winDlSym,   
2f610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f620 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44  lSym */.    winD
2f630 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  lClose,         
2f640 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2f650 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2f660 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
2f670 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20  xRandomness */. 
2f680 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20     winSleep,    
2f690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2f6a0 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2f6b0 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2f6c0 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2f6d0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2f6e0 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20  astError,       
2f6f0 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2f700 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2f710 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 2f  ntTimeInt64,   /
2f720 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  * xCurrentTimeIn
2f730 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65  t64 */.    winSe
2f740 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f750 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d 43    /* xSetSystemC
2f760 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  all */.    winGe
2f770 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20  tSystemCall,    
2f780 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43    /* xGetSystemC
2f790 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65  all */.    winNe
2f7a0 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  xtSystemCall,   
2f7b0 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
2f7c0 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e  Call */.  };.#en
2f7d0 64 69 66 0a 20 20 73 74 61 74 69 63 20 73 71 6c  dif.  static sql
2f7e0 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f 6c 6f  ite3_vfs winNolo
2f7f0 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  ckVfs = {.    3,
2f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f810 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e       /* iVersion
2f820 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77   */.    sizeof(w
2f830 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f  inFile),       /
2f840 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2f850 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
2f860 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2f870 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2f880 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2f890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2f8a0 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2f8b0 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20 20  2-none",        
2f8c0 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2f8d0 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70 70 44    &winNolockAppD
2f8e0 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41 70 70  ata,     /* pApp
2f8f0 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f  Data */.    winO
2f900 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
2f910 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
2f920 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20     winDelete,   
2f930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
2f940 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41  lete */.    winA
2f950 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20  ccess,          
2f960 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2f970 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
2f980 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78  name,       /* x
2f990 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  FullPathname */.
2f9a0 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20      winDlOpen,  
2f9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2f9c0 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2f9d0 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2f9e0 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2f9f0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fa10 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2fa20 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2fa30 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73        /* xDlClos
2fa40 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64  e */.    winRand
2fa50 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20  omness,         
2fa60 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
2fa70 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20  /.    winSleep, 
2fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa90 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69  xSleep */.    wi
2faa0 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20  nCurrentTime,   
2fab0 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
2fac0 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
2fad0 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
2fae0 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72     /* xGetLastEr
2faf0 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  ror */.    winCu
2fb00 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
2fb10 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2fb20 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2fb30 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2fb40 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74       /* xSetSyst
2fb50 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2fb60 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2fb70 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74       /* xGetSyst
2fb80 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2fb90 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2fba0 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73       /* xNextSys
2fbb0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a  temCall */.  };.
2fbc0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2fbd0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2fbe0 45 29 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69  E).  static sqli
2fbf0 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50  te3_vfs winLongP
2fc00 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d 20 7b  athNolockVfs = {
2fc10 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
2fc20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
2fc30 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73  Version */.    s
2fc40 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20  izeof(winFile), 
2fc50 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c        /* szOsFil
2fc60 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2fc70 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
2fc80 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2fc90 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fcb0 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2fcc0 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2fcd0 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e 61 6d  h-none", /* zNam
2fce0 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e 6f 6c  e */.    &winNol
2fcf0 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20 20 20  ockAppData,     
2fd00 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20  /* pAppData */. 
2fd10 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20     winOpen,     
2fd20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
2fd30 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c  en */.    winDel
2fd40 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ete,            
2fd50 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20   /* xDelete */. 
2fd60 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20     winAccess,   
2fd70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
2fd80 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
2fd90 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
2fda0 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e     /* xFullPathn
2fdb0 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  ame */.    winDl
2fdc0 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2fdd0 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2fde0 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2fdf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2fe00 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2fe10 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2fe20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2fe30 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2fe40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2fe50 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20  xDlClose */.    
2fe60 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20  winRandomness,  
2fe70 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
2fe80 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  mness */.    win
2fe90 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20  Sleep,          
2fea0 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f      /* xSleep */
2feb0 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54  .    winCurrentT
2fec0 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ime,        /* x
2fed0 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
2fee0 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
2fef0 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78 47 65  or,       /* xGe
2ff00 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20  tLastError */.  
2ff10 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65    winCurrentTime
2ff20 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43 75 72  Int64,   /* xCur
2ff30 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
2ff40 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
2ff50 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78  mCall,      /* x
2ff60 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2ff70 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2ff80 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 78  mCall,      /* x
2ff90 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2ffa0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2ffb0 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a 20 78  emCall,     /* x
2ffc0 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  NextSystemCall *
2ffd0 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20  /.  };.#endif.. 
2ffe0 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b   /* Double-check
2fff0 20 74 68 61 74 20 74 68 65 20 61 53 79 73 63 61   that the aSysca
30000 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62  ll[] array has b
30010 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  een constructed.
30020 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
30030 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33   See ticket [bb3
30040 61 38 36 65 38 39 30 63 38 65 39 36 61 62 5d 20  a86e890c8e96ab] 
30050 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  */.  assert( Arr
30060 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
30070 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65  ==80 );..  /* ge
30080 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c  t memory map all
30090 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72  ocation granular
300a0 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ity */.  memset(
300b0 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20  &winSysInfo, 0, 
300c0 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e  sizeof(SYSTEM_IN
300d0 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  FO));.#if SQLITE
300e0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65  _OS_WINRT.  osGe
300f0 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
30100 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
30110 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73  #else.  osGetSys
30120 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
30130 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61  nfo);.#endif.  a
30140 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
30150 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72  o.dwAllocationGr
30160 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20  anularity>0 );. 
30170 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
30180 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30  nfo.dwPageSize>0
30190 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76   );..  sqlite3_v
301a0 66 73 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e  fs_register(&win
301b0 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65  Vfs, 1);..#if de
301c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
301d0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
301e0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
301f0 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68  ter(&winLongPath
30200 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  Vfs, 0);.#endif.
30210 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
30220 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f 6c 6f  egister(&winNolo
30230 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69 66 20  ckVfs, 0);..#if 
30240 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
30250 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
30260 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
30270 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
30280 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30 29 3b  thNolockVfs, 0);
30290 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
302a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
302b0 0a 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20 3d 20  .  winBigLock = 
302c0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
302d0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
302e0 54 41 54 49 43 5f 56 46 53 31 29 3b 0a 23 65 6e  TATIC_VFS1);.#en
302f0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
30300 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e 74 20  LITE_OK;.}..int 
30310 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 76  sqlite3_os_end(v
30320 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  oid){.#if SQLITE
30330 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20  _OS_WINRT.  if( 
30340 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29  sleepObj!=NULL )
30350 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  {.    osCloseHan
30360 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b 0a 20  dle(sleepObj);. 
30370 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55     sleepObj = NU
30380 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  LL;.  }.#endif..
30390 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
303a0 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42 69 67  MIT_WAL.  winBig
303b0 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Lock = 0;.#endif
303c0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
303d0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
303e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  /* SQLITE_OS_WIN
303f0 20 2a 2f 0a                                       */.