/ Hex Artifact Content
Login

Artifact 070cdbb400097c6cda54aa005356095afdc2f3ee691d17192c54724ef146a971:


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 49 66 20 63 6f 6d 70 69 6c 65 64 20  . * If compiled 
2730: 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49 4e 33  with SQLITE_WIN3
2740: 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69 6e 64  2_MALLOC on Wind
2750: 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75 73 65  ows, we will use
2760: 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75 73 20   the. * various 
2770: 57 69 6e 33 32 20 41 50 49 20 68 65 61 70 20 66  Win32 API heap f
2780: 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65 61 64  unctions instead
2790: 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20 2a 2f   of our own.. */
27a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
27b0: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f 2a 0a  IN32_MALLOC../*.
27c0: 20 2a 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f   * If this is no
27d0: 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f 6c 61  n-zero, an isola
27e0: 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ted heap will be
27f0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
2800: 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20 2a 20  native Win32. * 
2810: 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73 79 73  allocator subsys
2820: 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65 2c 20  tem; otherwise, 
2830: 74 68 65 20 64 65 66 61 75 6c 74 20 70 72 6f 63  the default proc
2840: 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20 62 65  ess heap will be
2850: 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20 2a 20   used.  This. * 
2860: 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f 20 65  setting has no e
2870: 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d 70 69  ffect when compi
2880: 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54 2e 20  ling for WinRT. 
2890: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74 68 69   By default, thi
28a0: 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20 2a 20  s is enabled. * 
28b0: 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65 64 20  and an isolated 
28c0: 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63 72 65  heap will be cre
28d0: 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20 61 6c  ated to store al
28e0: 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61 74 61  l allocated data
28f0: 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .. *. **********
2900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2940: 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e 47 3a  ****. * WARNING:
2950: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
2960: 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20 77 68   to note that wh
2970: 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e 67 20  en this setting 
2980: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
2990: 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20 20 20  the. *          
29a0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 20 66  winMemShutdown f
29b0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
29c0: 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65 20 73  d (e.g. by the s
29d0: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 0a  qlite3_shutdown.
29e0: 20 2a 20 20 20 20 20 20 20 20 20 20 66 75 6e 63   *          func
29f0: 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74 61 20  tion), all data 
2a00: 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74  that was allocat
2a10: 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 73 6f  ed using the iso
2a20: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 0a  lated heap will.
2a30: 20 2a 20 20 20 20 20 20 20 20 20 20 62 65 20 66   *          be f
2a40: 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79  reed immediately
2a50: 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d 70 74   and any attempt
2a60: 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79 20 6f   to access any o
2a70: 66 20 74 68 61 74 20 66 72 65 65 64 0a 20 2a 20  f that freed. * 
2a80: 20 20 20 20 20 20 20 20 20 64 61 74 61 20 77 69           data wi
2a90: 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69  ll almost certai
2aa0: 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 6e  nly result in an
2ab0: 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63 65 73   immediate acces
2ac0: 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20 2a 2a  s violation.. **
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20 2a 2f  ************. */
2b20: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2b30: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
2b40: 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  E.#  define SQLI
2b50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52  TE_WIN32_HEAP_CR
2b60: 45 41 54 45 20 20 20 20 20 20 20 20 28 54 52 55  EATE        (TRU
2b70: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  E).#endif../*. *
2b80: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 78   This is the max
2b90: 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 69 6e  imum possible in
2ba0: 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74 68  itial size of th
2bb0: 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69 63  e Win32-specific
2bc0: 20 68 65 61 70 2c 20 69 6e 0a 20 2a 20 62 79 74   heap, in. * byt
2bd0: 65 73 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  es.. */.#ifndef 
2be0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2bf0: 50 5f 4d 41 58 5f 49 4e 49 54 5f 53 49 5a 45 0a  P_MAX_INIT_SIZE.
2c00: 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  #  define SQLITE
2c10: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2c20: 49 4e 49 54 5f 53 49 5a 45 20 28 34 32 39 34 39  INIT_SIZE (42949
2c30: 36 37 32 39 35 55 29 0a 23 65 6e 64 69 66 0a 0a  67295U).#endif..
2c40: 2f 2a 0a 20 2a 20 54 68 69 73 20 69 73 20 74 68  /*. * This is th
2c50: 65 20 65 78 74 72 61 20 73 70 61 63 65 20 66 6f  e extra space fo
2c60: 72 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 69  r the initial si
2c70: 7a 65 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d  ze of the Win32-
2c80: 73 70 65 63 69 66 69 63 20 68 65 61 70 2c 0a 20  specific heap,. 
2c90: 2a 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69  * in bytes.  Thi
2ca0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2cb0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2cc0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2cd0: 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 0a 23 20  AP_INIT_EXTRA.# 
2ce0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2cf0: 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 45  IN32_HEAP_INIT_E
2d00: 58 54 52 41 20 20 28 34 31 39 34 33 30 34 29 0a  XTRA  (4194304).
2d10: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 43 61  #endif../*. * Ca
2d20: 6c 63 75 6c 61 74 65 20 74 68 65 20 6d 61 78 69  lculate the maxi
2d30: 6d 75 6d 20 6c 65 67 61 6c 20 63 61 63 68 65 20  mum legal cache 
2d40: 73 69 7a 65 2c 20 69 6e 20 70 61 67 65 73 2c 20  size, in pages, 
2d50: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6d 61 78  based on the max
2d60: 69 6d 75 6d 0a 20 2a 20 70 6f 73 73 69 62 6c 65  imum. * possible
2d70: 20 69 6e 69 74 69 61 6c 20 68 65 61 70 20 73 69   initial heap si
2d80: 7a 65 20 61 6e 64 20 74 68 65 20 64 65 66 61 75  ze and the defau
2d90: 6c 74 20 70 61 67 65 20 73 69 7a 65 2c 20 73 65  lt page size, se
2da0: 74 74 69 6e 67 20 61 73 69 64 65 20 74 68 65 0a  tting aside the.
2db0: 20 2a 20 6e 65 65 64 65 64 20 65 78 74 72 61 20   * needed extra 
2dc0: 73 70 61 63 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64  space.. */.#ifnd
2dd0: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
2de0: 4d 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23  MAX_CACHE_SIZE.#
2df0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2e00: 57 49 4e 33 32 5f 4d 41 58 5f 43 41 43 48 45 5f  WIN32_MAX_CACHE_
2e10: 53 49 5a 45 20 20 20 28 28 28 53 51 4c 49 54 45  SIZE   (((SQLITE
2e20: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f  _WIN32_HEAP_MAX_
2e30: 49 4e 49 54 5f 53 49 5a 45 29 20 2d 20 5c 0a 20  INIT_SIZE) - \. 
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45           (SQLITE
2e70: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54  _WIN32_HEAP_INIT
2e80: 5f 45 58 54 52 41 29 29 20 2f 20 5c 0a 20 20 20  _EXTRA)) / \.   
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45        (SQLITE_DE
2ec0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
2ed0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
2ee0: 54 68 69 73 20 69 73 20 63 61 63 68 65 20 73 69  This is cache si
2ef0: 7a 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63  ze used in the c
2f00: 61 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68  alculation of th
2f10: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2f20: 66 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73  f the. * Win32-s
2f30: 70 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49  pecific heap.  I
2f40: 74 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61  t cannot be nega
2f50: 74 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  tive.. */.#ifnde
2f60: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  f SQLITE_WIN32_C
2f70: 41 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20  ACHE_SIZE.#  if 
2f80: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43  SQLITE_DEFAULT_C
2f90: 41 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20  ACHE_SIZE>=0.#  
2fa0: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2fb0: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
2fc0: 20 20 20 20 20 28 53 51 4c 49 54 45 5f 44 45 46       (SQLITE_DEF
2fd0: 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
2fe0: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
2ff0: 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33  fine SQLITE_WIN3
3000: 32 5f 43 41 43 48 45 5f 53 49 5a 45 20 20 20 20  2_CACHE_SIZE    
3010: 20 28 2d 28 53 51 4c 49 54 45 5f 44 45 46 41 55   (-(SQLITE_DEFAU
3020: 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 29 0a  LT_CACHE_SIZE)).
3030: 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  #  endif.#endif.
3040: 0a 2f 2a 0a 20 2a 20 4d 61 6b 65 20 73 75 72 65  ./*. * Make sure
3050: 20 74 68 61 74 20 74 68 65 20 63 61 6c 63 75 6c   that the calcul
3060: 61 74 65 64 20 63 61 63 68 65 20 73 69 7a 65 2c  ated cache size,
3070: 20 69 6e 20 70 61 67 65 73 2c 20 63 61 6e 6e 6f   in pages, canno
3080: 74 20 63 61 75 73 65 20 74 68 65 0a 20 2a 20 69  t cause the. * i
3090: 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20 74  nitial size of t
30a0: 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66 69  he Win32-specifi
30b0: 63 20 68 65 61 70 20 74 6f 20 65 78 63 65 65 64  c heap to exceed
30c0: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f   the maximum amo
30d0: 75 6e 74 0a 20 2a 20 6f 66 20 6d 65 6d 6f 72 79  unt. * of memory
30e0: 20 74 68 61 74 20 63 61 6e 20 62 65 20 73 70 65   that can be spe
30f0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 63 61  cified in the ca
3100: 6c 6c 20 74 6f 20 48 65 61 70 43 72 65 61 74 65  ll to HeapCreate
3110: 2e 0a 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  .. */.#if SQLITE
3120: 5f 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a  _WIN32_CACHE_SIZ
3130: 45 3e 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  E>SQLITE_WIN32_M
3140: 41 58 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23 20  AX_CACHE_SIZE.# 
3150: 20 75 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49   undef SQLITE_WI
3160: 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 0a 23  N32_CACHE_SIZE.#
3170: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
3180: 57 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45  WIN32_CACHE_SIZE
3190: 20 20 20 20 20 20 20 28 32 30 30 30 29 0a 23 65         (2000).#e
31a0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
31b0: 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66 20  initial size of 
31c0: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
31d0: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
31e0: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
31f0: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
3200: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
3210: 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64 65 66  INIT_SIZE.#  def
3220: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
3230: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 20  _HEAP_INIT_SIZE 
3240: 20 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32    ((SQLITE_WIN32
3250: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
3260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3280: 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49 54            (SQLIT
3290: 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
32a0: 49 5a 45 29 20 2b 20 5c 0a 20 20 20 20 20 20 20  IZE) + \.       
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d0: 20 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f    (SQLITE_WIN32_
32e0: 48 45 41 50 5f 49 4e 49 54 5f 45 58 54 52 41 29  HEAP_INIT_EXTRA)
32f0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  ).#endif../*. * 
3300: 54 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65  The maximum size
3310: 20 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70   of the Win32-sp
3320: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68  ecific heap.  Th
3330: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  is value may be 
3340: 7a 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  zero.. */.#ifnde
3350: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
3360: 45 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20  EAP_MAX_SIZE.#  
3370: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
3380: 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a  N32_HEAP_MAX_SIZ
3390: 45 20 20 20 20 28 30 29 0a 23 65 6e 64 69 66 0a  E    (0).#endif.
33a0: 0a 2f 2a 0a 20 2a 20 54 68 65 20 65 78 74 72 61  ./*. * The extra
33b0: 20 66 6c 61 67 73 20 74 6f 20 75 73 65 20 69 6e   flags to use in
33c0: 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 57 69   calls to the Wi
33d0: 6e 33 32 20 68 65 61 70 20 41 50 49 73 2e 20 20  n32 heap APIs.  
33e0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
33f0: 65 0a 20 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68  e. * zero for th
3400: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69  e default behavi
3410: 6f 72 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  or.. */.#ifndef 
3420: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
3430: 50 5f 46 4c 41 47 53 0a 23 20 20 64 65 66 69 6e  P_FLAGS.#  defin
3440: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e SQLITE_WIN32_H
3450: 45 41 50 5f 46 4c 41 47 53 20 20 20 20 20 20 20  EAP_FLAGS       
3460: 28 30 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (0).#endif.../*.
3470: 2a 2a 20 54 68 65 20 77 69 6e 4d 65 6d 44 61 74  ** The winMemDat
3480: 61 20 73 74 72 75 63 74 75 72 65 20 73 74 6f 72  a structure stor
3490: 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 72  es information r
34a0: 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 57  equired by the W
34b0: 69 6e 33 32 2d 73 70 65 63 69 66 69 63 0a 2a 2a  in32-specific.**
34c0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
34d0: 68 6f 64 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  hods implementat
34e0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
34f0: 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74  struct winMemDat
3500: 61 20 77 69 6e 4d 65 6d 44 61 74 61 3b 0a 73 74  a winMemData;.st
3510: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
3520: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
3530: 0a 20 20 75 33 32 20 6d 61 67 69 63 31 3b 20 20  .  u32 magic1;  
3540: 20 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72   /* Magic number
3550: 20 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63   to detect struc
3560: 74 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  ture corruption.
3570: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 48 41 4e   */.#endif.  HAN
3580: 44 4c 45 20 68 48 65 61 70 3b 20 2f 2a 20 54 68  DLE hHeap; /* Th
3590: 65 20 68 61 6e 64 6c 65 20 74 6f 20 6f 75 72 20  e handle to our 
35a0: 68 65 61 70 2e 20 2a 2f 0a 20 20 42 4f 4f 4c 20  heap. */.  BOOL 
35b0: 62 4f 77 6e 65 64 3b 20 20 2f 2a 20 44 6f 20 77  bOwned;  /* Do w
35c0: 65 20 6f 77 6e 20 74 68 65 20 68 65 61 70 20 28  e own the heap (
35d0: 69 2e 65 2e 20 64 65 73 74 72 6f 79 20 69 74 20  i.e. destroy it 
35e0: 6f 6e 20 73 68 75 74 64 6f 77 6e 29 3f 20 2a 2f  on shutdown)? */
35f0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3600: 20 20 75 33 32 20 6d 61 67 69 63 32 3b 20 20 20    u32 magic2;   
3610: 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 20  /* Magic number 
3620: 74 6f 20 64 65 74 65 63 74 20 73 74 72 75 63 74  to detect struct
3630: 75 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ure corruption. 
3640: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 23 69  */.#endif.};..#i
3650: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 64 65  fndef NDEBUG.#de
3660: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
3670: 43 31 20 20 20 20 20 30 78 34 32 62 32 38 33 30  C1     0x42b2830
3680: 62 0a 23 64 65 66 69 6e 65 20 57 49 4e 4d 45 4d  b.#define WINMEM
3690: 5f 4d 41 47 49 43 32 20 20 20 20 20 30 78 62 64  _MAGIC2     0xbd
36a0: 34 64 37 63 66 34 0a 23 65 6e 64 69 66 0a 0a 73  4d7cf4.#endif..s
36b0: 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
36c0: 4d 65 6d 44 61 74 61 20 77 69 6e 5f 6d 65 6d 5f  MemData win_mem_
36d0: 64 61 74 61 20 3d 20 7b 0a 23 69 66 6e 64 65 66  data = {.#ifndef
36e0: 20 4e 44 45 42 55 47 0a 20 20 57 49 4e 4d 45 4d   NDEBUG.  WINMEM
36f0: 5f 4d 41 47 49 43 31 2c 0a 23 65 6e 64 69 66 0a  _MAGIC1,.#endif.
3700: 20 20 4e 55 4c 4c 2c 20 46 41 4c 53 45 0a 23 69    NULL, FALSE.#i
3710: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2c  fndef NDEBUG.  ,
3720: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 0a 23 65  WINMEM_MAGIC2.#e
3730: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
3740: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
3750: 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69  winMemAssertMagi
3760: 63 31 28 29 20 61 73 73 65 72 74 28 20 77 69 6e  c1() assert( win
3770: 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69 63 31  _mem_data.magic1
3780: 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20  ==WINMEM_MAGIC1 
3790: 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d  ).#define winMem
37a0: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 20 61  AssertMagic2() a
37b0: 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64  ssert( win_mem_d
37c0: 61 74 61 2e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d  ata.magic2==WINM
37d0: 45 4d 5f 4d 41 47 49 43 32 20 29 0a 23 64 65 66  EM_MAGIC2 ).#def
37e0: 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ine winMemAssert
37f0: 4d 61 67 69 63 28 29 20 20 77 69 6e 4d 65 6d 41  Magic()  winMemA
3800: 73 73 65 72 74 4d 61 67 69 63 31 28 29 3b 20 77  ssertMagic1(); w
3810: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
3820: 32 28 29 3b 0a 23 65 6c 73 65 0a 23 64 65 66 69  2();.#else.#defi
3830: 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d  ne winMemAssertM
3840: 61 67 69 63 28 29 0a 23 65 6e 64 69 66 0a 0a 23  agic().#endif..#
3850: 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65 74  define winMemGet
3860: 44 61 74 61 50 74 72 28 29 20 20 26 77 69 6e 5f  DataPtr()  &win_
3870: 6d 65 6d 5f 64 61 74 61 0a 23 64 65 66 69 6e 65  mem_data.#define
3880: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
3890: 20 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74       win_mem_dat
38a0: 61 2e 68 48 65 61 70 0a 23 64 65 66 69 6e 65 20  a.hHeap.#define 
38b0: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
38c0: 20 20 20 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61      win_mem_data
38d0: 2e 62 4f 77 6e 65 64 0a 0a 73 74 61 74 69 63 20  .bOwned..static 
38e0: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
38f0: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 3b 0a  oc(int nBytes);.
3900: 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d  static void winM
3910: 65 6d 46 72 65 65 28 76 6f 69 64 20 2a 70 50 72  emFree(void *pPr
3920: 69 6f 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  ior);.static voi
3930: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
3940: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
3950: 6e 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74  nt nBytes);.stat
3960: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
3970: 65 28 76 6f 69 64 20 2a 70 29 3b 0a 73 74 61 74  e(void *p);.stat
3980: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75  ic int winMemRou
3990: 6e 64 75 70 28 69 6e 74 20 6e 29 3b 0a 73 74 61  ndup(int n);.sta
39a0: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e  tic int winMemIn
39b0: 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61 74  it(void *pAppDat
39c0: 61 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  a);.static void 
39d0: 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76  winMemShutdown(v
39e0: 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a  oid *pAppData);.
39f0: 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d  .const sqlite3_m
3a00: 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69  em_methods *sqli
3a10: 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28 76  te3MemGetWin32(v
3a20: 6f 69 64 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  oid);.#endif /* 
3a30: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
3a40: 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  LOC */../*.** Th
3a50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
3a60: 61 62 6c 65 20 69 73 20 28 6e 6f 72 6d 61 6c 6c  able is (normall
3a70: 79 29 20 73 65 74 20 6f 6e 63 65 20 61 6e 64 20  y) set once and 
3a80: 6e 65 76 65 72 20 63 68 61 6e 67 65 73 0a 2a 2a  never changes.**
3a90: 20 74 68 65 72 65 61 66 74 65 72 2e 20 20 49 74   thereafter.  It
3aa0: 20 72 65 63 6f 72 64 73 20 77 68 65 74 68 65 72   records whether
3ab0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
3ac0: 79 73 74 65 6d 20 69 73 20 57 69 6e 39 78 0a 2a  ystem is Win9x.*
3ad0: 2a 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a  * or WinNT..**.*
3ae0: 2a 20 30 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 0:   Operating
3af0: 20 73 79 73 74 65 6d 20 75 6e 6b 6e 6f 77 6e 2e   system unknown.
3b00: 0a 2a 2a 20 31 3a 20 20 20 4f 70 65 72 61 74 69  .** 1:   Operati
3b10: 6e 67 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e  ng system is Win
3b20: 39 78 2e 0a 2a 2a 20 32 3a 20 20 20 4f 70 65 72  9x..** 2:   Oper
3b30: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73 20  ating system is 
3b40: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  WinNT..**.** In 
3b50: 6f 72 64 65 72 20 74 6f 20 66 61 63 69 6c 69 74  order to facilit
3b60: 61 74 65 20 74 65 73 74 69 6e 67 20 6f 6e 20 61  ate testing on a
3b70: 20 57 69 6e 4e 54 20 73 79 73 74 65 6d 2c 20 74   WinNT system, t
3b80: 68 65 20 74 65 73 74 20 66 69 78 74 75 72 65 0a  he test fixture.
3b90: 2a 2a 20 63 61 6e 20 6d 61 6e 75 61 6c 6c 79 20  ** can manually 
3ba0: 73 65 74 20 74 68 69 73 20 76 61 6c 75 65 20 74  set this value t
3bb0: 6f 20 31 20 74 6f 20 65 6d 75 6c 61 74 65 20 57  o 1 to emulate W
3bc0: 69 6e 39 38 20 62 65 68 61 76 69 6f 72 2e 0a 2a  in98 behavior..*
3bd0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3be0: 54 45 53 54 0a 4c 4f 4e 47 20 53 51 4c 49 54 45  TEST.LONG SQLITE
3bf0: 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20  _WIN32_VOLATILE 
3c00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
3c10: 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74 61 74 69  = 0;.#else.stati
3c20: 63 20 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49  c LONG SQLITE_WI
3c30: 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c  N32_VOLATILE sql
3c40: 69 74 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30  ite3_os_type = 0
3c50: 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  ;.#endif..#ifnde
3c60: 66 20 53 59 53 43 41 4c 4c 0a 23 20 20 64 65 66  f SYSCALL.#  def
3c70: 69 6e 65 20 53 59 53 43 41 4c 4c 20 73 71 6c 69  ine SYSCALL sqli
3c80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 0a  te3_syscall_ptr.
3c90: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3ca0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e  is function is n
3cb0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
3cc0: 57 69 6e 64 6f 77 73 20 43 45 20 6f 72 20 57 69  Windows CE or Wi
3cd0: 6e 52 54 2e 0a 20 2a 2f 0a 0a 23 69 66 20 53 51  nRT.. */..#if SQ
3ce0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
3cf0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
3d00: 0a 23 20 20 64 65 66 69 6e 65 20 6f 73 41 72 65  .#  define osAre
3d10: 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 20 20  FileApisANSI()  
3d20: 20 20 20 20 20 31 0a 23 65 6e 64 69 66 0a 0a 2f       1.#endif../
3d30: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
3d40: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
3d50: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
3d60: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
3d70: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
3d80: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
3d90: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
3da0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
3db0: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
3dc0: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
3dd0: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
3de0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
3df0: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
3e00: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
3e10: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
3e20: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
3e30: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
3e40: 74 72 75 63 74 20 77 69 6e 5f 73 79 73 63 61 6c  truct win_syscal
3e50: 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  l {.  const char
3e60: 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20   *zName;        
3e70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
3e80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
3e90: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
3ea0: 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e 74  all_ptr pCurrent
3eb0: 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61 6c  ; /* Current val
3ec0: 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65 6d  ue of the system
3ed0: 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74   call */.  sqlit
3ee0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 70  e3_syscall_ptr p
3ef0: 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66 61  Default; /* Defa
3f00: 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20 61  ult value */.} a
3f10: 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 23 69  Syscall[] = {.#i
3f20: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
3f30: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
3f40: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 41 72 65 46  _WINRT.  { "AreF
3f50: 69 6c 65 41 70 69 73 41 4e 53 49 22 2c 20 20 20  ileApisANSI",   
3f60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 41        (SYSCALL)A
3f70: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 2c 20  reFileApisANSI, 
3f80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3f90: 73 65 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41  se.  { "AreFileA
3fa0: 70 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20  pisANSI",       
3fb0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3fe0: 0a 23 69 66 6e 64 65 66 20 6f 73 41 72 65 46 69  .#ifndef osAreFi
3ff0: 6c 65 41 70 69 73 41 4e 53 49 0a 23 64 65 66 69  leApisANSI.#defi
4000: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
4010: 41 4e 53 49 20 28 28 42 4f 4f 4c 28 57 49 4e 41  ANSI ((BOOL(WINA
4020: 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63  PI*)(VOID))aSysc
4030: 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74 29  all[0].pCurrent)
4040: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
4050: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
4060: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4070: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4080: 20 7b 20 22 43 68 61 72 4c 6f 77 65 72 57 22 2c   { "CharLowerW",
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
40a0: 59 53 43 41 4c 4c 29 43 68 61 72 4c 6f 77 65 72  YSCALL)CharLower
40b0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  W,              
40c0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
40d0: 43 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20  CharLowerW",    
40e0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
40f0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4100: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4110: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4120: 20 6f 73 43 68 61 72 4c 6f 77 65 72 57 20 28 28   osCharLowerW ((
4130: 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28  LPWSTR(WINAPI*)(
4140: 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPWSTR))aSyscall
4150: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [1].pCurrent)..#
4160: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4170: 43 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  CE && defined(SQ
4180: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
4190: 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72 55 70  IDE).  { "CharUp
41a0: 70 65 72 57 22 2c 20 20 20 20 20 20 20 20 20 20  perW",          
41b0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 68 61      (SYSCALL)Cha
41c0: 72 55 70 70 65 72 57 2c 20 20 20 20 20 20 20 20  rUpperW,        
41d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41e0: 0a 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57  .  { "CharUpperW
41f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
4200: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
4210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4220: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
4230: 64 65 66 69 6e 65 20 6f 73 43 68 61 72 55 70 70  define osCharUpp
4240: 65 72 57 20 28 28 4c 50 57 53 54 52 28 57 49 4e  erW ((LPWSTR(WIN
4250: 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29 61 53  API*)(LPWSTR))aS
4260: 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72 72 65  yscall[2].pCurre
4270: 6e 74 29 0a 0a 20 20 7b 20 22 43 6c 6f 73 65 48  nt)..  { "CloseH
4280: 61 6e 64 6c 65 22 2c 20 20 20 20 20 20 20 20 20  andle",         
4290: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 6c 6f      (SYSCALL)Clo
42a0: 73 65 48 61 6e 64 6c 65 2c 20 20 20 20 20 20 20  seHandle,       
42b0: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
42c0: 69 6e 65 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c  ine osCloseHandl
42d0: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
42e0: 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61  )(HANDLE))aSysca
42f0: 6c 6c 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[3].pCurrent).
4300: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4310: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4320: 53 49 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  SI).  { "CreateF
4330: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
4340: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
4350: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
4360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4370: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41    { "CreateFileA
4380: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4390: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
43a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
43c0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
43d0: 6c 65 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leA ((HANDLE(WIN
43e0: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 44 57 4f  API*)(LPCSTR,DWO
43f0: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
4400: 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f 41      LPSECURITY_A
4410: 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44 2c  TTRIBUTES,DWORD,
4420: 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61 53  DWORD,HANDLE))aS
4430: 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65  yscall[4].pCurre
4440: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
4450: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4460: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4470: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4480: 22 43 72 65 61 74 65 46 69 6c 65 57 22 2c 20 20  "CreateFileW",  
4490: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
44a0: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 57 2c  ALL)CreateFileW,
44b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
44c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
44d0: 61 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20  ateFileW",      
44e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
44f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4510: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4520: 43 72 65 61 74 65 46 69 6c 65 57 20 28 28 48 41  CreateFileW ((HA
4530: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
4540: 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52  CWSTR,DWORD,DWOR
4550: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  D, \.        LPS
4560: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4570: 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48  ES,DWORD,DWORD,H
4580: 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b  ANDLE))aSyscall[
4590: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
45a0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
45b0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
45c0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
45d0: 4e 53 49 29 20 26 26 20 5c 0a 20 20 20 20 20 20  NSI) && \.      
45e0: 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
45f0: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4600: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4610: 53 49 5a 45 3e 30 29 20 26 26 20 5c 0a 20 20 20  SIZE>0) && \.   
4620: 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33       SQLITE_WIN3
4630: 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50 50  2_CREATEFILEMAPP
4640: 49 4e 47 41 0a 20 20 7b 20 22 43 72 65 61 74 65  INGA.  { "Create
4650: 46 69 6c 65 4d 61 70 70 69 6e 67 41 22 2c 20 20  FileMappingA",  
4660: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
4670: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 2c  ateFileMappingA,
4680: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
4690: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
46a0: 4d 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20  MappingA",      
46b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
46c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
46e0: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
46f0: 69 6c 65 4d 61 70 70 69 6e 67 41 20 28 28 48 41  ileMappingA ((HA
4700: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
4710: 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59 5f  NDLE,LPSECURITY_
4720: 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20 20  ATTRIBUTES, \.  
4730: 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f 52        DWORD,DWOR
4740: 44 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 29 29  D,DWORD,LPCSTR))
4750: 61 53 79 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72  aSyscall[6].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21  E_OS_WINCE || (!
4780: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
4790: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
47a0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
47b0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28  ) && \.        (
47c0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
47d0: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
47e0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
47f0: 45 3e 30 29 29 0a 20 20 7b 20 22 43 72 65 61 74  E>0)).  { "Creat
4800: 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 22 2c 20  eFileMappingW", 
4810: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72       (SYSCALL)Cr
4820: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
4830: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  ,      0 },.#els
4840: 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  e.  { "CreateFil
4850: 65 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20  eMappingW",     
4860: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4880: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4890: 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65  #define osCreate
48a0: 46 69 6c 65 4d 61 70 70 69 6e 67 57 20 28 28 48  FileMappingW ((H
48b0: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48  ANDLE(WINAPI*)(H
48c0: 41 4e 44 4c 45 2c 4c 50 53 45 43 55 52 49 54 59  ANDLE,LPSECURITY
48d0: 5f 41 54 54 52 49 42 55 54 45 53 2c 20 5c 0a 20  _ATTRIBUTES, \. 
48e0: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
48f0: 52 44 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52  RD,DWORD,LPCWSTR
4900: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
4910: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4920: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
4930: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4940: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
4950: 20 20 7b 20 22 43 72 65 61 74 65 4d 75 74 65 78    { "CreateMutex
4960: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
4970: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 4d 75  SYSCALL)CreateMu
4980: 74 65 78 57 2c 20 20 20 20 20 20 20 20 20 20 20  texW,           
4990: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
49a0: 22 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20  "CreateMutexW", 
49b0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
49c0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
49d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
49e0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
49f0: 65 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57  e osCreateMutexW
4a00: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
4a10: 2a 29 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54  *)(LPSECURITY_AT
4a20: 54 52 49 42 55 54 45 53 2c 42 4f 4f 4c 2c 20 5c  TRIBUTES,BOOL, \
4a30: 0a 20 20 20 20 20 20 20 20 4c 50 43 57 53 54 52  .        LPCWSTR
4a40: 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d 2e 70 43  ))aSyscall[8].pC
4a50: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
4a60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4a70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4a80: 22 44 65 6c 65 74 65 46 69 6c 65 41 22 2c 20 20  "DeleteFileA",  
4a90: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
4aa0: 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65 41 2c  ALL)DeleteFileA,
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4ac0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c  ,.#else.  { "Del
4ad0: 65 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  eteFileA",      
4ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4af0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4b10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
4b20: 44 65 6c 65 74 65 46 69 6c 65 41 20 28 28 42 4f  DeleteFileA ((BO
4b30: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  OL(WINAPI*)(LPCS
4b40: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e  TR))aSyscall[9].
4b50: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
4b60: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
4b70: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
4b80: 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 57 22 2c  { "DeleteFileW",
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
4ba0: 53 43 41 4c 4c 29 44 65 6c 65 74 65 46 69 6c 65  SCALL)DeleteFile
4bb0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  W,             0
4bc0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 44   },.#else.  { "D
4bd0: 65 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20  eleteFileW",    
4be0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
4bf0: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4c00: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4c10: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
4c20: 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 20 28 28  osDeleteFileW ((
4c30: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
4c40: 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  CWSTR))aSyscall[
4c50: 31 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  10].pCurrent)..#
4c60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4c70: 43 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65  CE.  { "FileTime
4c80: 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 22  ToLocalFileTime"
4c90: 2c 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54  , (SYSCALL)FileT
4ca0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
4cb0: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
4cc0: 20 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f   { "FileTimeToLo
4cd0: 63 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  calFileTime", (S
4ce0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d00: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4d10: 66 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54  fine osFileTimeT
4d20: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 20 28  oLocalFileTime (
4d30: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43  (BOOL(WINAPI*)(C
4d40: 4f 4e 53 54 20 46 49 4c 45 54 49 4d 45 2a 2c 20  ONST FILETIME*, 
4d50: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
4d60: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  TIME))aSyscall[1
4d70: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
4d80: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
4d90: 45 0a 20 20 7b 20 22 46 69 6c 65 54 69 6d 65 54  E.  { "FileTimeT
4da0: 6f 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  oSystemTime",   
4db0: 20 28 53 59 53 43 41 4c 4c 29 46 69 6c 65 54 69   (SYSCALL)FileTi
4dc0: 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 2c 20  meToSystemTime, 
4dd0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
4de0: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73  { "FileTimeToSys
4df0: 74 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59  temTime",    (SY
4e00: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4e20: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
4e30: 69 6e 65 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f  ine osFileTimeTo
4e40: 53 79 73 74 65 6d 54 69 6d 65 20 28 28 42 4f 4f  SystemTime ((BOO
4e50: 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54  L(WINAPI*)(CONST
4e60: 20 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20   FILETIME*, \.  
4e70: 20 20 20 20 20 20 4c 50 53 59 53 54 45 4d 54 49        LPSYSTEMTI
4e80: 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 32 5d  ME))aSyscall[12]
4e90: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
4ea0: 22 46 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72  "FlushFileBuffer
4eb0: 73 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  s",        (SYSC
4ec0: 41 4c 4c 29 46 6c 75 73 68 46 69 6c 65 42 75 66  ALL)FlushFileBuf
4ed0: 66 65 72 73 2c 20 20 20 20 20 20 20 20 30 20 7d  fers,        0 }
4ee0: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  ,..#define osFlu
4ef0: 73 68 46 69 6c 65 42 75 66 66 65 72 73 20 28 28  shFileBuffers ((
4f00: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
4f10: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31  NDLE))aSyscall[1
4f20: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
4f30: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4f40: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
4f50: 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73  .  { "FormatMess
4f60: 61 67 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ageA",          
4f70: 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61 74 4d  (SYSCALL)FormatM
4f80: 65 73 73 61 67 65 41 2c 20 20 20 20 20 20 20 20  essageA,        
4f90: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4fa0: 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41   "FormatMessageA
4fb0: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
4fc0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4fe0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4ff0: 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61  ne osFormatMessa
5000: 67 65 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41  geA ((DWORD(WINA
5010: 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43 56 4f  PI*)(DWORD,LPCVO
5020: 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 4c  ID,DWORD,DWORD,L
5030: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
5040: 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74 2a 29 29  DWORD,va_list*))
5050: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
5060: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5070: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5080: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5090: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 22 2c  FormatMessageW",
50a0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
50b0: 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  LL)FormatMessage
50c0: 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  W,          0 },
50d0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d  .#else.  { "Form
50e0: 61 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20  atMessageW",    
50f0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5100: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5110: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5120: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
5130: 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 20 28 28  ormatMessageW ((
5140: 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44  DWORD(WINAPI*)(D
5150: 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f  WORD,LPCVOID,DWO
5160: 52 44 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c  RD,DWORD,LPWSTR,
5170: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
5180: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
5190: 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e 74  all[15].pCurrent
51a0: 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  )..#if !defined(
51b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
51c0: 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20  _EXTENSION).  { 
51d0: 22 46 72 65 65 4c 69 62 72 61 72 79 22 2c 20 20  "FreeLibrary",  
51e0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
51f0: 41 4c 4c 29 46 72 65 65 4c 69 62 72 61 72 79 2c  ALL)FreeLibrary,
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
5210: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 72 65  ,.#else.  { "Fre
5220: 65 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20  eLibrary",      
5230: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5240: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5250: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5260: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5270: 46 72 65 65 4c 69 62 72 61 72 79 20 28 28 42 4f  FreeLibrary ((BO
5280: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 4d 4f 44  OL(WINAPI*)(HMOD
5290: 55 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 31 36  ULE))aSyscall[16
52a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
52b0: 20 22 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63   "GetCurrentProc
52c0: 65 73 73 49 64 22 2c 20 20 20 20 20 28 53 59 53  essId",     (SYS
52d0: 43 41 4c 4c 29 47 65 74 43 75 72 72 65 6e 74 50  CALL)GetCurrentP
52e0: 72 6f 63 65 73 73 49 64 2c 20 20 20 20 20 30 20  rocessId,     0 
52f0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
5300: 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
5310: 64 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  d ((DWORD(WINAPI
5320: 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c  *)(VOID))aSyscal
5330: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
5340: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5350: 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64  WINCE && defined
5360: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5370: 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74  S_ANSI).  { "Get
5380: 44 69 73 6b 46 72 65 65 53 70 61 63 65 41 22 2c  DiskFreeSpaceA",
5390: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
53a0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
53b0: 41 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  A,       0 },.#e
53c0: 6c 73 65 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  lse.  { "GetDisk
53d0: 46 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20  FreeSpaceA",    
53e0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5400: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5410: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 44  ..#define osGetD
5420: 69 73 6b 46 72 65 65 53 70 61 63 65 41 20 28 28  iskFreeSpaceA ((
5430: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50  BOOL(WINAPI*)(LP
5440: 43 53 54 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  CSTR,LPDWORD,LPD
5450: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
5460: 20 20 20 20 20 20 20 20 4c 50 44 57 4f 52 44 29          LPDWORD)
5470: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
5480: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5490: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
54a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
54b0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
54c0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
54d0: 44 45 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b  DE).  { "GetDisk
54e0: 46 72 65 65 53 70 61 63 65 57 22 2c 20 20 20 20  FreeSpaceW",    
54f0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44     (SYSCALL)GetD
5500: 69 73 6b 46 72 65 65 53 70 61 63 65 57 2c 20 20  iskFreeSpaceW,  
5510: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5520: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
5530: 53 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28  SpaceW",       (
5540: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5570: 65 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46  efine osGetDiskF
5580: 72 65 65 53 70 61 63 65 57 20 28 28 42 4f 4f 4c  reeSpaceW ((BOOL
5590: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
55a0: 52 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  R,LPDWORD,LPDWOR
55b0: 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20  D,LPDWORD, \.   
55c0: 20 20 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53       LPDWORD))aS
55d0: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
55e0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
55f0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5600: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5610: 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41  tFileAttributesA
5620: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
5630: 29 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  )GetFileAttribut
5640: 65 73 41 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23  esA,      0 },.#
5650: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
5660: 65 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20  eAttributesA",  
5670: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5690: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
56a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
56b0: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 20  FileAttributesA 
56c0: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
56d0: 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c  (LPCSTR))aSyscal
56e0: 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[20].pCurrent).
56f0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
5700: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
5710: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
5720: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74  S_WIDE).  { "Get
5730: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 22  FileAttributesW"
5740: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
5750: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5760: 73 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  sW,      0 },.#e
5770: 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  lse.  { "GetFile
5780: 41 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20  AttributesW",   
5790: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
57b0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
57c0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46  ..#define osGetF
57d0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 57 20 28  ileAttributesW (
57e0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
57f0: 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c  LPCWSTR))aSyscal
5800: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
5810: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
5820: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
5830: 44 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  DE).  { "GetFile
5840: 41 74 74 72 69 62 75 74 65 73 45 78 57 22 2c 20  AttributesExW", 
5850: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5860: 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
5870: 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  ,    0 },.#else.
5880: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5890: 69 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28  ibutesExW",    (
58a0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
58b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58c0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
58d0: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
58e0: 74 74 72 69 62 75 74 65 73 45 78 57 20 28 28 42  ttributesExW ((B
58f0: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  OOL(WINAPI*)(LPC
5900: 57 53 54 52 2c 47 45 54 5f 46 49 4c 45 45 58 5f  WSTR,GET_FILEEX_
5910: 49 4e 46 4f 5f 4c 45 56 45 4c 53 2c 20 5c 0a 20  INFO_LEVELS, \. 
5920: 20 20 20 20 20 20 20 4c 50 56 4f 49 44 29 29 61         LPVOID))a
5930: 53 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72  Syscall[22].pCur
5940: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
5950: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
5960: 22 47 65 74 46 69 6c 65 53 69 7a 65 22 2c 20 20  "GetFileSize",  
5970: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5980: 41 4c 4c 29 47 65 74 46 69 6c 65 53 69 7a 65 2c  ALL)GetFileSize,
5990: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
59a0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
59b0: 46 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20  FileSize",      
59c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
59d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
59e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
59f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5a00: 47 65 74 46 69 6c 65 53 69 7a 65 20 28 28 44 57  GetFileSize ((DW
5a10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
5a20: 44 4c 45 2c 4c 50 44 57 4f 52 44 29 29 61 53 79  DLE,LPDWORD))aSy
5a30: 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65  scall[23].pCurre
5a40: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
5a50: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66  _OS_WINCE && def
5a60: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5a70: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5a80: 22 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65  "GetFullPathName
5a90: 41 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43  A",        (SYSC
5aa0: 41 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e  ALL)GetFullPathN
5ab0: 61 6d 65 41 2c 20 20 20 20 20 20 20 20 30 20 7d  ameA,        0 }
5ac0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5ad0: 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20  FullPathNameA", 
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5b20: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41  GetFullPathNameA
5b30: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
5b40: 29 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 4c  )(LPCSTR,DWORD,L
5b50: 50 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20  PSTR, \.        
5b60: 4c 50 53 54 52 2a 29 29 61 53 79 73 63 61 6c 6c  LPSTR*))aSyscall
5b70: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
5b80: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5b90: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
5ba0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
5bb0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
5bc0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
5bd0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
5be0: 22 2c 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ",        (SYSCA
5bf0: 4c 4c 29 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  LL)GetFullPathNa
5c00: 6d 65 57 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  meW,        0 },
5c10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46  .#else.  { "GetF
5c20: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20  ullPathNameW",  
5c30: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
5c40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5c50: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5c60: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5c70: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 20  etFullPathNameW 
5c80: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5c90: 28 4c 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 4c  (LPCWSTR,DWORD,L
5ca0: 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  PWSTR, \.       
5cb0: 20 4c 50 57 53 54 52 2a 29 29 61 53 79 73 63 61   LPWSTR*))aSysca
5cc0: 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[25].pCurrent)
5cd0: 0a 0a 20 20 7b 20 22 47 65 74 4c 61 73 74 45 72  ..  { "GetLastEr
5ce0: 72 6f 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  ror",           
5cf0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 4c 61 73   (SYSCALL)GetLas
5d00: 74 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  tError,         
5d10: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
5d20: 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 20   osGetLastError 
5d30: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
5d40: 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  (VOID))aSyscall[
5d50: 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  26].pCurrent)..#
5d60: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
5d70: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
5d80: 45 4e 53 49 4f 4e 29 0a 23 69 66 20 53 51 4c 49  ENSION).#if SQLI
5d90: 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
5da0: 20 54 68 65 20 47 65 74 50 72 6f 63 41 64 64 72   The GetProcAddr
5db0: 65 73 73 41 28 29 20 72 6f 75 74 69 6e 65 20 69  essA() routine i
5dc0: 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
5dd0: 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 2e 20   on Windows CE. 
5de0: 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41  */.  { "GetProcA
5df0: 64 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20  ddressA",       
5e00: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72    (SYSCALL)GetPr
5e10: 6f 63 41 64 64 72 65 73 73 41 2c 20 20 20 20 20  ocAddressA,     
5e20: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5e30: 20 2f 2a 20 41 6c 6c 20 6f 74 68 65 72 20 57 69   /* All other Wi
5e40: 6e 64 6f 77 73 20 70 6c 61 74 66 6f 72 6d 73 20  ndows platforms 
5e50: 65 78 70 65 63 74 20 47 65 74 50 72 6f 63 41 64  expect GetProcAd
5e60: 64 72 65 73 73 28 29 20 74 6f 20 74 61 6b 65 0a  dress() to take.
5e70: 20 20 2a 2a 20 61 6e 20 41 4e 53 49 20 73 74 72    ** an ANSI str
5e80: 69 6e 67 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ing regardless o
5e90: 66 20 74 68 65 20 5f 55 4e 49 43 4f 44 45 20 73  f the _UNICODE s
5ea0: 65 74 74 69 6e 67 20 2a 2f 0a 20 20 7b 20 22 47  etting */.  { "G
5eb0: 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c  etProcAddressA",
5ec0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5ed0: 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  L)GetProcAddress
5ee0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
5ef0: 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a 20 20 7b  #endif.#else.  {
5f00: 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73 73   "GetProcAddress
5f10: 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53  A",         (SYS
5f20: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5f40: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
5f50: 6e 65 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72  ne osGetProcAddr
5f60: 65 73 73 41 20 28 28 46 41 52 50 52 4f 43 28 57  essA ((FARPROC(W
5f70: 49 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 2c  INAPI*)(HMODULE,
5f80: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 53 54   \.        LPCST
5f90: 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  R))aSyscall[27].
5fa0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5fb0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
5fc0: 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 49 6e    { "GetSystemIn
5fd0: 66 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  fo",           (
5fe0: 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65  SYSCALL)GetSyste
5ff0: 6d 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20  mInfo,          
6000: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6010: 22 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c  "GetSystemInfo",
6020: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6030: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6050: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6060: 65 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66  e osGetSystemInf
6070: 6f 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  o ((VOID(WINAPI*
6080: 29 28 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29  )(LPSYSTEM_INFO)
6090: 29 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43  )aSyscall[28].pC
60a0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65  urrent)..  { "Ge
60b0: 74 53 79 73 74 65 6d 54 69 6d 65 22 2c 20 20 20  tSystemTime",   
60c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
60d0: 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65 2c 20  )GetSystemTime, 
60e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
60f0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53 79 73  #define osGetSys
6100: 74 65 6d 54 69 6d 65 20 28 28 56 4f 49 44 28 57  temTime ((VOID(W
6110: 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54 45 4d  INAPI*)(LPSYSTEM
6120: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 32  TIME))aSyscall[2
6130: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
6140: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6150: 43 45 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65  CE.  { "GetSyste
6160: 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 22  mTimeAsFileTime"
6170: 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79  , (SYSCALL)GetSy
6180: 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69  stemTimeAsFileTi
6190: 6d 65 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  me, 0 },.#else. 
61a0: 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d   { "GetSystemTim
61b0: 65 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53  eAsFileTime", (S
61c0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
61f0: 66 69 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d  fine osGetSystem
6200: 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 20 28  TimeAsFileTime (
6210: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20  (VOID(WINAPI*)( 
6220: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
6230: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 33  TIME))aSyscall[3
6240: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
6250: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6260: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
6270: 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74  .  { "GetTempPat
6280: 68 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  hA",            
6290: 28 53 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70  (SYSCALL)GetTemp
62a0: 50 61 74 68 41 2c 20 20 20 20 20 20 20 20 20 20  PathA,          
62b0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
62c0: 20 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c   "GetTempPathA",
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
62e0: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6300: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
6310: 6e 65 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68  ne osGetTempPath
6320: 41 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  A ((DWORD(WINAPI
6330: 2a 29 28 44 57 4f 52 44 2c 4c 50 53 54 52 29 29  *)(DWORD,LPSTR))
6340: 61 53 79 73 63 61 6c 6c 5b 33 31 5d 2e 70 43 75  aSyscall[31].pCu
6350: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6360: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
6370: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6380: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
6390: 20 7b 20 22 47 65 74 54 65 6d 70 50 61 74 68 57   { "GetTempPathW
63a0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
63b0: 59 53 43 41 4c 4c 29 47 65 74 54 65 6d 70 50 61  YSCALL)GetTempPa
63c0: 74 68 57 2c 20 20 20 20 20 20 20 20 20 20 20 20  thW,            
63d0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
63e0: 47 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20  GetTempPathW",  
63f0: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6400: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6410: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6420: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6430: 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 20   osGetTempPathW 
6440: 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29  ((DWORD(WINAPI*)
6450: 28 44 57 4f 52 44 2c 4c 50 57 53 54 52 29 29 61  (DWORD,LPWSTR))a
6460: 53 79 73 63 61 6c 6c 5b 33 32 5d 2e 70 43 75 72  Syscall[32].pCur
6470: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6480: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
6490: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 22 2c 20  "GetTickCount", 
64a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
64b0: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
64c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
64d0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
64e0: 54 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20  TickCount",     
64f0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6500: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6510: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6520: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6530: 47 65 74 54 69 63 6b 43 6f 75 6e 74 20 28 28 44  GetTickCount ((D
6540: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
6550: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 33 33 5d  ID))aSyscall[33]
6560: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
6570: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
6580: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
6590: 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47  & SQLITE_WIN32_G
65a0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
65b0: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 41 22 2c  "GetVersionExA",
65c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
65d0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
65e0: 41 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  A,           0 }
65f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6600: 56 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20  VersionExA",    
6610: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6620: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6630: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6640: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6650: 47 65 74 56 65 72 73 69 6f 6e 45 78 41 20 28 28  GetVersionExA ((
6660: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
6670: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
6680: 53 49 4f 4e 49 4e 46 4f 41 29 29 61 53 79 73 63  SIONINFOA))aSysc
6690: 61 6c 6c 5b 33 34 5d 2e 70 43 75 72 72 65 6e 74  all[34].pCurrent
66a0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
66b0: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
66c0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
66d0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
66e0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57 49         SQLITE_WI
66f0: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
6700: 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e  .  { "GetVersion
6710: 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  ExW",           
6720: 28 53 59 53 43 41 4c 4c 29 47 65 74 56 65 72 73  (SYSCALL)GetVers
6730: 69 6f 6e 45 78 57 2c 20 20 20 20 20 20 20 20 20  ionExW,         
6740: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6750: 20 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22   "GetVersionExW"
6760: 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ,           (SYS
6770: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6790: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
67a0: 6e 65 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45  ne osGetVersionE
67b0: 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  xW ((BOOL(WINAPI
67c0: 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  *)( \.        LP
67d0: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57 29 29  OSVERSIONINFOW))
67e0: 61 53 79 73 63 61 6c 6c 5b 33 35 5d 2e 70 43 75  aSyscall[35].pCu
67f0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
6800: 70 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20 20  pAlloc",        
6810: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6820: 48 65 61 70 41 6c 6c 6f 63 2c 20 20 20 20 20 20  HeapAlloc,      
6830: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
6840: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 41 6c 6c  define osHeapAll
6850: 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41  oc ((LPVOID(WINA
6860: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
6870: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6880: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 36  E_T))aSyscall[36
6890: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
68a0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
68b0: 54 0a 20 20 7b 20 22 48 65 61 70 43 72 65 61 74  T.  { "HeapCreat
68c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
68d0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 72   (SYSCALL)HeapCr
68e0: 65 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  eate,           
68f0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6900: 7b 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20  { "HeapCreate", 
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6920: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6940: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6950: 69 6e 65 20 6f 73 48 65 61 70 43 72 65 61 74 65  ine osHeapCreate
6960: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
6970: 2a 29 28 44 57 4f 52 44 2c 53 49 5a 45 5f 54 2c  *)(DWORD,SIZE_T,
6980: 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f   \.        SIZE_
6990: 54 29 29 61 53 79 73 63 61 6c 6c 5b 33 37 5d 2e  T))aSyscall[37].
69a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
69b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
69c0: 20 20 7b 20 22 48 65 61 70 44 65 73 74 72 6f 79    { "HeapDestroy
69d0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
69e0: 53 59 53 43 41 4c 4c 29 48 65 61 70 44 65 73 74  SYSCALL)HeapDest
69f0: 72 6f 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  roy,            
6a00: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
6a10: 22 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20  "HeapDestroy",  
6a20: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
6a30: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
6a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a50: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
6a60: 65 20 6f 73 48 65 61 70 44 65 73 74 72 6f 79 20  e osHeapDestroy 
6a70: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6a80: 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c  HANDLE))aSyscall
6a90: 5b 33 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [38].pCurrent)..
6aa0: 20 20 7b 20 22 48 65 61 70 46 72 65 65 22 2c 20    { "HeapFree", 
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6ac0: 53 59 53 43 41 4c 4c 29 48 65 61 70 46 72 65 65  SYSCALL)HeapFree
6ad0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6ae0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6af0: 73 48 65 61 70 46 72 65 65 20 28 28 42 4f 4f 4c  sHeapFree ((BOOL
6b00: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6b10: 2c 44 57 4f 52 44 2c 4c 50 56 4f 49 44 29 29 61  ,DWORD,LPVOID))a
6b20: 53 79 73 63 61 6c 6c 5b 33 39 5d 2e 70 43 75 72  Syscall[39].pCur
6b30: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70  rent)..  { "Heap
6b40: 52 65 41 6c 6c 6f 63 22 2c 20 20 20 20 20 20 20  ReAlloc",       
6b50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
6b60: 65 61 70 52 65 41 6c 6c 6f 63 2c 20 20 20 20 20  eapReAlloc,     
6b70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
6b80: 65 66 69 6e 65 20 6f 73 48 65 61 70 52 65 41 6c  efine osHeapReAl
6b90: 6c 6f 63 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  loc ((LPVOID(WIN
6ba0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
6bb0: 52 44 2c 4c 50 56 4f 49 44 2c 20 5c 0a 20 20 20  RD,LPVOID, \.   
6bc0: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6bd0: 73 63 61 6c 6c 5b 34 30 5d 2e 70 43 75 72 72 65  scall[40].pCurre
6be0: 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61 70 53 69  nt)..  { "HeapSi
6bf0: 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
6c00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61      (SYSCALL)Hea
6c10: 70 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  pSize,          
6c20: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
6c30: 69 6e 65 20 6f 73 48 65 61 70 53 69 7a 65 20 28  ine osHeapSize (
6c40: 28 53 49 5a 45 5f 54 28 57 49 4e 41 50 49 2a 29  (SIZE_T(WINAPI*)
6c50: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c  (HANDLE,DWORD, \
6c60: 0a 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44  .        LPCVOID
6c70: 29 29 61 53 79 73 63 61 6c 6c 5b 34 31 5d 2e 70  ))aSyscall[41].p
6c80: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
6c90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
6ca0: 20 7b 20 22 48 65 61 70 56 61 6c 69 64 61 74 65   { "HeapValidate
6cb0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6cc0: 59 53 43 41 4c 4c 29 48 65 61 70 56 61 6c 69 64  YSCALL)HeapValid
6cd0: 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
6ce0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
6cf0: 48 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20  HeapValidate",  
6d00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d30: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
6d40: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 20   osHeapValidate 
6d50: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
6d60: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6d70: 20 20 20 20 20 20 20 20 4c 50 43 56 4f 49 44 29          LPCVOID)
6d80: 29 61 53 79 73 63 61 6c 6c 5b 34 32 5d 2e 70 43  )aSyscall[42].pC
6d90: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
6da0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
6db0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6dc0: 54 0a 20 20 7b 20 22 48 65 61 70 43 6f 6d 70 61  T.  { "HeapCompa
6dd0: 63 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ct",            
6de0: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 43 6f   (SYSCALL)HeapCo
6df0: 6d 70 61 63 74 2c 20 20 20 20 20 20 20 20 20 20  mpact,          
6e00: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6e10: 7b 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c  { "HeapCompact",
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6e30: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6e50: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6e60: 69 6e 65 20 6f 73 48 65 61 70 43 6f 6d 70 61 63  ine osHeapCompac
6e70: 74 20 28 28 55 49 4e 54 28 57 49 4e 41 50 49 2a  t ((UINT(WINAPI*
6e80: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 29 29  )(HANDLE,DWORD))
6e90: 61 53 79 73 63 61 6c 6c 5b 34 33 5d 2e 70 43 75  aSyscall[43].pCu
6ea0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6eb0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
6ec0: 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 21 64  _HAS_ANSI) && !d
6ed0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6ee0: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
6ef0: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72  N).  { "LoadLibr
6f00: 61 72 79 41 22 2c 20 20 20 20 20 20 20 20 20 20  aryA",          
6f10: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c    (SYSCALL)LoadL
6f20: 69 62 72 61 72 79 41 2c 20 20 20 20 20 20 20 20  ibraryA,        
6f30: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
6f40: 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41   { "LoadLibraryA
6f50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ",            (S
6f60: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
6f90: 66 69 6e 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61  fine osLoadLibra
6fa0: 72 79 41 20 28 28 48 4d 4f 44 55 4c 45 28 57 49  ryA ((HMODULE(WI
6fb0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
6fc0: 53 79 73 63 61 6c 6c 5b 34 34 5d 2e 70 43 75 72  Syscall[44].pCur
6fd0: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
6fe0: 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64  TE_OS_WINRT && d
6ff0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
7000: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26  N32_HAS_WIDE) &&
7010: 20 5c 0a 20 20 20 20 20 20 20 20 21 64 65 66 69   \.        !defi
7020: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
7030: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
7040: 20 20 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79    { "LoadLibrary
7050: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  W",            (
7060: 53 59 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72  SYSCALL)LoadLibr
7070: 61 72 79 57 2c 20 20 20 20 20 20 20 20 20 20 20  aryW,           
7080: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7090: 22 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20  "LoadLibraryW", 
70a0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
70b0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
70d0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
70e0: 65 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  e osLoadLibraryW
70f0: 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50   ((HMODULE(WINAP
7100: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
7110: 73 63 61 6c 6c 5b 34 35 5d 2e 70 43 75 72 72 65  scall[45].pCurre
7120: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
7130: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 4c  _OS_WINRT.  { "L
7140: 6f 63 61 6c 46 72 65 65 22 2c 20 20 20 20 20 20  ocalFree",      
7150: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7160: 4c 29 4c 6f 63 61 6c 46 72 65 65 2c 20 20 20 20  L)LocalFree,    
7170: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7180: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 61 6c  #else.  { "Local
7190: 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20  Free",          
71a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
71b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
71d0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f  if..#define osLo
71e0: 63 61 6c 46 72 65 65 20 28 28 48 4c 4f 43 41 4c  calFree ((HLOCAL
71f0: 28 57 49 4e 41 50 49 2a 29 28 48 4c 4f 43 41 4c  (WINAPI*)(HLOCAL
7200: 29 29 61 53 79 73 63 61 6c 6c 5b 34 36 5d 2e 70  ))aSyscall[46].p
7210: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53  Current)..#if !S
7220: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
7230: 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
7240: 52 54 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65  RT.  { "LockFile
7250: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7260: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46    (SYSCALL)LockF
7270: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
7280: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7290: 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20   { "LockFile",  
72a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72b0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0 },.#endif..#if
72e0: 6e 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 0a  ndef osLockFile.
72f0: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46 69  #define osLockFi
7300: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7310: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7320: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7330: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7340: 79 73 63 61 6c 6c 5b 34 37 5d 2e 70 43 75 72 72  yscall[47].pCurr
7350: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7360: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7370: 45 0a 20 20 7b 20 22 4c 6f 63 6b 46 69 6c 65 45  E.  { "LockFileE
7380: 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
7390: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 6b 46 69   (SYSCALL)LockFi
73a0: 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20 20 20  leEx,           
73b0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
73c0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20  { "LockFileEx", 
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
73e0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7400: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
7410: 64 65 66 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  def osLockFileEx
7420: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 63 6b 46  .#define osLockF
7430: 69 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e  ileEx ((BOOL(WIN
7440: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
7450: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44  RD,DWORD,DWORD,D
7460: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7470: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7480: 79 73 63 61 6c 6c 5b 34 38 5d 2e 70 43 75 72 72  yscall[48].pCurr
7490: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
74a0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
74b0: 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f 53 5f   || (!SQLITE_OS_
74c0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
74d0: 20 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c     (!defined(SQL
74e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
74f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7500: 5f 53 49 5a 45 3e 30 29 29 0a 20 20 7b 20 22 4d  _SIZE>0)).  { "M
7510: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7520: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7530: 4c 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  L)MapViewOfFile,
7540: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7550: 23 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69  #else.  { "MapVi
7560: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7570: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
75a0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61  if..#define osMa
75b0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 4c 50  pViewOfFile ((LP
75c0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
75d0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
75e0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
75f0: 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61    SIZE_T))aSysca
7600: 6c 6c 5b 34 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[49].pCurrent)
7610: 0a 0a 20 20 7b 20 22 4d 75 6c 74 69 42 79 74 65  ..  { "MultiByte
7620: 54 6f 57 69 64 65 43 68 61 72 22 2c 20 20 20 20  ToWideChar",    
7630: 20 28 53 59 53 43 41 4c 4c 29 4d 75 6c 74 69 42   (SYSCALL)MultiB
7640: 79 74 65 54 6f 57 69 64 65 43 68 61 72 2c 20 20  yteToWideChar,  
7650: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7660: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
7670: 64 65 43 68 61 72 20 28 28 69 6e 74 28 57 49 4e  deChar ((int(WIN
7680: 41 50 49 2a 29 28 55 49 4e 54 2c 44 57 4f 52 44  API*)(UINT,DWORD
7690: 2c 4c 50 43 53 54 52 2c 69 6e 74 2c 4c 50 57 53  ,LPCSTR,int,LPWS
76a0: 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 69 6e  TR, \.        in
76b0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 35 30 5d 2e  t))aSyscall[50].
76c0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
76d0: 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
76e0: 43 6f 75 6e 74 65 72 22 2c 20 28 53 59 53 43 41  Counter", (SYSCA
76f0: 4c 4c 29 51 75 65 72 79 50 65 72 66 6f 72 6d 61  LL)QueryPerforma
7700: 6e 63 65 43 6f 75 6e 74 65 72 2c 20 30 20 7d 2c  nceCounter, 0 },
7710: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 51 75 65 72  ..#define osQuer
7720: 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e  yPerformanceCoun
7730: 74 65 72 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ter ((BOOL(WINAP
7740: 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20 20 4c  I*)( \.        L
7750: 41 52 47 45 5f 49 4e 54 45 47 45 52 2a 29 29 61  ARGE_INTEGER*))a
7760: 53 79 73 63 61 6c 6c 5b 35 31 5d 2e 70 43 75 72  Syscall[51].pCur
7770: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 52 65 61 64  rent)..  { "Read
7780: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7790: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 52        (SYSCALL)R
77a0: 65 61 64 46 69 6c 65 2c 20 20 20 20 20 20 20 20  eadFile,        
77b0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
77c0: 65 66 69 6e 65 20 6f 73 52 65 61 64 46 69 6c 65  efine osReadFile
77d0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
77e0: 28 48 41 4e 44 4c 45 2c 4c 50 56 4f 49 44 2c 44  (HANDLE,LPVOID,D
77f0: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a  WORD,LPDWORD, \.
7800: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
7810: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  PPED))aSyscall[5
7820: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
7830: 7b 20 22 53 65 74 45 6e 64 4f 66 46 69 6c 65 22  { "SetEndOfFile"
7840: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7850: 53 43 41 4c 4c 29 53 65 74 45 6e 64 4f 66 46 69  SCALL)SetEndOfFi
7860: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  le,            0
7870: 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53   },..#define osS
7880: 65 74 45 6e 64 4f 66 46 69 6c 65 20 28 28 42 4f  etEndOfFile ((BO
7890: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
78a0: 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 35 33 5d  LE))aSyscall[53]
78b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
78c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
78d0: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
78e0: 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  nter",          
78f0: 28 53 59 53 43 41 4c 4c 29 53 65 74 46 69 6c 65  (SYSCALL)SetFile
7900: 50 6f 69 6e 74 65 72 2c 20 20 20 20 20 20 20 20  Pointer,        
7910: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7920: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
7930: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
7940: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7960: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7970: 6e 65 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e  ne osSetFilePoin
7980: 74 65 72 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ter ((DWORD(WINA
7990: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 4f 4e 47  PI*)(HANDLE,LONG
79a0: 2c 50 4c 4f 4e 47 2c 20 5c 0a 20 20 20 20 20 20  ,PLONG, \.      
79b0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
79c0: 6c 5b 35 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[54].pCurrent).
79d0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
79e0: 57 49 4e 52 54 0a 20 20 7b 20 22 53 6c 65 65 70  WINRT.  { "Sleep
79f0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
7a00: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 6c       (SYSCALL)Sl
7a10: 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eep,            
7a20: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
7a30: 65 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20  e.  { "Sleep",  
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a70: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
7a80: 23 64 65 66 69 6e 65 20 6f 73 53 6c 65 65 70 20  #define osSleep 
7a90: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
7aa0: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7ab0: 35 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  55].pCurrent).. 
7ac0: 20 7b 20 22 53 79 73 74 65 6d 54 69 6d 65 54 6f   { "SystemTimeTo
7ad0: 46 69 6c 65 54 69 6d 65 22 2c 20 20 20 20 28 53  FileTime",    (S
7ae0: 59 53 43 41 4c 4c 29 53 79 73 74 65 6d 54 69 6d  YSCALL)SystemTim
7af0: 65 54 6f 46 69 6c 65 54 69 6d 65 2c 20 20 20 20  eToFileTime,    
7b00: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
7b10: 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
7b20: 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Time ((BOOL(WINA
7b30: 50 49 2a 29 28 43 4f 4e 53 54 20 53 59 53 54 45  PI*)(CONST SYSTE
7b40: 4d 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  MTIME*, \.      
7b50: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
7b60: 79 73 63 61 6c 6c 5b 35 36 5d 2e 70 43 75 72 72  yscall[56].pCurr
7b70: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
7b80: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
7b90: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7ba0: 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c   { "UnlockFile",
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7bc0: 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c  YSCALL)UnlockFil
7bd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
7be0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
7bf0: 55 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20  UnlockFile",    
7c00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
7c10: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
7c30: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
7c40: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 0a 23 64   osUnlockFile.#d
7c50: 65 66 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69  efine osUnlockFi
7c60: 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  le ((BOOL(WINAPI
7c70: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7c80: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 29 29 61 53         DWORD))aS
7ca0: 79 73 63 61 6c 6c 5b 35 37 5d 2e 70 43 75 72 72  yscall[57].pCurr
7cb0: 65 6e 74 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ent).#endif..#if
7cc0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
7cd0: 45 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c  E.  { "UnlockFil
7ce0: 65 45 78 22 2c 20 20 20 20 20 20 20 20 20 20 20  eEx",           
7cf0: 20 28 53 59 53 43 41 4c 4c 29 55 6e 6c 6f 63 6b   (SYSCALL)Unlock
7d00: 46 69 6c 65 45 78 2c 20 20 20 20 20 20 20 20 20  FileEx,         
7d10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7d20: 7b 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22  { "UnlockFileEx"
7d30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
7d40: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7d60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
7d70: 69 6e 65 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  ine osUnlockFile
7d80: 45 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  Ex ((BOOL(WINAPI
7d90: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
7da0: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20  DWORD,DWORD, \. 
7db0: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
7dc0: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 38  PED))aSyscall[58
7dd0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
7de0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
7df0: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
7e00: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
7e10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
7e20: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 55 6e 6d  _SIZE>0.  { "Unm
7e30: 61 70 56 69 65 77 4f 66 46 69 6c 65 22 2c 20 20  apViewOfFile",  
7e40: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7e50: 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 2c  UnmapViewOfFile,
7e60: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7e70: 6c 73 65 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69  lse.  { "UnmapVi
7e80: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
7e90: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7eb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7ec0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e 6d 61  ..#define osUnma
7ed0: 70 56 69 65 77 4f 66 46 69 6c 65 20 28 28 42 4f  pViewOfFile ((BO
7ee0: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 56  OL(WINAPI*)(LPCV
7ef0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 39  OID))aSyscall[59
7f00: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
7f10: 20 22 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74   "WideCharToMult
7f20: 69 42 79 74 65 22 2c 20 20 20 20 20 28 53 59 53  iByte",     (SYS
7f30: 43 41 4c 4c 29 57 69 64 65 43 68 61 72 54 6f 4d  CALL)WideCharToM
7f40: 75 6c 74 69 42 79 74 65 2c 20 20 20 20 20 30 20  ultiByte,     0 
7f50: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 69  },..#define osWi
7f60: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
7f70: 65 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  e ((int(WINAPI*)
7f80: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 57  (UINT,DWORD,LPCW
7f90: 53 54 52 2c 69 6e 74 2c 4c 50 53 54 52 2c 69 6e  STR,int,LPSTR,in
7fa0: 74 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43  t, \.        LPC
7fb0: 53 54 52 2c 4c 50 42 4f 4f 4c 29 29 61 53 79 73  STR,LPBOOL))aSys
7fc0: 63 61 6c 6c 5b 36 30 5d 2e 70 43 75 72 72 65 6e  call[60].pCurren
7fd0: 74 29 0a 0a 20 20 7b 20 22 57 72 69 74 65 46 69  t)..  { "WriteFi
7fe0: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7ff0: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 72 69 74     (SYSCALL)Writ
8000: 65 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  eFile,          
8010: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
8020: 6e 65 20 6f 73 57 72 69 74 65 46 69 6c 65 20 28  ne osWriteFile (
8030: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
8040: 41 4e 44 4c 45 2c 4c 50 43 56 4f 49 44 2c 44 57  ANDLE,LPCVOID,DW
8050: 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 20 5c 0a 20  ORD,LPDWORD, \. 
8060: 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41 50         LPOVERLAP
8070: 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 31  PED))aSyscall[61
8080: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8090: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
80a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 45 76 65 6e  .  { "CreateEven
80b0: 74 45 78 57 22 2c 20 20 20 20 20 20 20 20 20 20  tExW",          
80c0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 45  (SYSCALL)CreateE
80d0: 76 65 6e 74 45 78 57 2c 20 20 20 20 20 20 20 20  ventExW,        
80e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
80f0: 20 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57   "CreateEventExW
8100: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8110: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8130: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8140: 6e 65 20 6f 73 43 72 65 61 74 65 45 76 65 6e 74  ne osCreateEvent
8150: 45 78 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ExW ((HANDLE(WIN
8160: 41 50 49 2a 29 28 4c 50 53 45 43 55 52 49 54 59  API*)(LPSECURITY
8170: 5f 41 54 54 52 49 42 55 54 45 53 2c 4c 50 43 57  _ATTRIBUTES,LPCW
8180: 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  STR, \.        D
8190: 57 4f 52 44 2c 44 57 4f 52 44 29 29 61 53 79 73  WORD,DWORD))aSys
81a0: 63 61 6c 6c 5b 36 32 5d 2e 70 43 75 72 72 65 6e  call[62].pCurren
81b0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
81c0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 57 61  OS_WINRT.  { "Wa
81d0: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
81e0: 74 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c  t",     (SYSCALL
81f0: 29 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  )WaitForSingleOb
8200: 6a 65 63 74 2c 20 20 20 20 20 30 20 7d 2c 0a 23  ject,     0 },.#
8210: 65 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f  else.  { "WaitFo
8220: 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20  rSingleObject", 
8230: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8260: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69  f..#define osWai
8270: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
8280: 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a   ((DWORD(WINAPI*
8290: 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20  )(HANDLE, \.    
82a0: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
82b0: 61 6c 6c 5b 36 33 5d 2e 70 43 75 72 72 65 6e 74  all[63].pCurrent
82c0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
82d0: 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 57 61 69  S_WINCE.  { "Wai
82e0: 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74  tForSingleObject
82f0: 45 78 22 2c 20 20 20 28 53 59 53 43 41 4c 4c 29  Ex",   (SYSCALL)
8300: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
8310: 65 63 74 45 78 2c 20 20 20 30 20 7d 2c 0a 23 65  ectEx,   0 },.#e
8320: 6c 73 65 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  lse.  { "WaitFor
8330: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c  SingleObjectEx",
8340: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8370: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 61 69 74  ..#define osWait
8380: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
8390: 78 20 28 28 44 57 4f 52 44 28 57 49 4e 41 50 49  x ((DWORD(WINAPI
83a0: 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c  *)(HANDLE,DWORD,
83b0: 20 5c 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 29   \.        BOOL)
83c0: 29 61 53 79 73 63 61 6c 6c 5b 36 34 5d 2e 70 43  )aSyscall[64].pC
83d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
83e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
83f0: 20 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72   "SetFilePointer
8400: 45 78 22 2c 20 20 20 20 20 20 20 20 28 53 59 53  Ex",        (SYS
8410: 43 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e  CALL)SetFilePoin
8420: 74 65 72 45 78 2c 20 20 20 20 20 20 20 20 30 20  terEx,        0 
8430: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65  },.#else.  { "Se
8440: 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c  tFilePointerEx",
8450: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8460: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8470: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8480: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8490: 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45  sSetFilePointerE
84a0: 78 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  x ((BOOL(WINAPI*
84b0: 29 28 48 41 4e 44 4c 45 2c 4c 41 52 47 45 5f 49  )(HANDLE,LARGE_I
84c0: 4e 54 45 47 45 52 2c 20 5c 0a 20 20 20 20 20 20  NTEGER, \.      
84d0: 20 20 50 4c 41 52 47 45 5f 49 4e 54 45 47 45 52    PLARGE_INTEGER
84e0: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
84f0: 5b 36 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [65].pCurrent)..
8500: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8510: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
8520: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8530: 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c  dleEx", (SYSCALL
8540: 29 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  )GetFileInformat
8550: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 2c 20 30  ionByHandleEx, 0
8560: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8570: 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f  etFileInformatio
8580: 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20 28 53  nByHandleEx", (S
8590: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
85a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
85b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
85c0: 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61  osGetFileInforma
85d0: 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 20 28  tionByHandleEx (
85e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48  (BOOL(WINAPI*)(H
85f0: 41 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20  ANDLE, \.       
8600: 20 46 49 4c 45 5f 49 4e 46 4f 5f 42 59 5f 48 41   FILE_INFO_BY_HA
8610: 4e 44 4c 45 5f 43 4c 41 53 53 2c 4c 50 56 4f 49  NDLE_CLASS,LPVOI
8620: 44 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  D,DWORD))aSyscal
8630: 6c 5b 36 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[66].pCurrent).
8640: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
8650: 49 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65  INRT && (!define
8660: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
8670: 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
8680: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20  _MMAP_SIZE>0).  
8690: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
86a0: 46 72 6f 6d 41 70 70 22 2c 20 20 20 20 28 53 59  FromApp",    (SY
86b0: 53 43 41 4c 4c 29 4d 61 70 56 69 65 77 4f 66 46  SCALL)MapViewOfF
86c0: 69 6c 65 46 72 6f 6d 41 70 70 2c 20 20 20 20 30  ileFromApp,    0
86d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4d   },.#else.  { "M
86e0: 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d  apViewOfFileFrom
86f0: 41 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c  App",    (SYSCAL
8700: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8710: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8720: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8730: 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46  osMapViewOfFileF
8740: 72 6f 6d 41 70 70 20 28 28 4c 50 56 4f 49 44 28  romApp ((LPVOID(
8750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
8760: 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34 2c 20 5c  ULONG,ULONG64, \
8770: 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29  .        SIZE_T)
8780: 29 61 53 79 73 63 61 6c 6c 5b 36 37 5d 2e 70 43  )aSyscall[67].pC
8790: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
87a0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
87b0: 20 22 43 72 65 61 74 65 46 69 6c 65 32 22 2c 20   "CreateFile2", 
87c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
87d0: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 32  CALL)CreateFile2
87e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
87f0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
8800: 65 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20  eateFile2",     
8810: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
8820: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8830: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8840: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8850: 73 43 72 65 61 74 65 46 69 6c 65 32 20 28 28 48  sCreateFile2 ((H
8860: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ANDLE(WINAPI*)(L
8870: 50 43 57 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f  PCWSTR,DWORD,DWO
8880: 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  RD,DWORD, \.    
8890: 20 20 20 20 4c 50 43 52 45 41 54 45 46 49 4c 45      LPCREATEFILE
88a0: 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d  2_EXTENDED_PARAM
88b0: 45 54 45 52 53 29 29 61 53 79 73 63 61 6c 6c 5b  ETERS))aSyscall[
88c0: 36 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  68].pCurrent)..#
88d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
88e0: 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  RT && !defined(S
88f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
8900: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
8910: 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72  LoadPackagedLibr
8920: 61 72 79 22 2c 20 20 20 20 20 28 53 59 53 43 41  ary",     (SYSCA
8930: 4c 4c 29 4c 6f 61 64 50 61 63 6b 61 67 65 64 4c  LL)LoadPackagedL
8940: 69 62 72 61 72 79 2c 20 20 20 20 20 30 20 7d 2c  ibrary,     0 },
8950: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
8960: 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22  PackagedLibrary"
8970: 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30  ,     (SYSCALL)0
8980: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
8990: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
89a0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
89b0: 6f 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61  oadPackagedLibra
89c0: 72 79 20 28 28 48 4d 4f 44 55 4c 45 28 57 49 4e  ry ((HMODULE(WIN
89d0: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 20 5c  API*)(LPCWSTR, \
89e0: 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29 29  .        DWORD))
89f0: 61 53 79 73 63 61 6c 6c 5b 36 39 5d 2e 70 43 75  aSyscall[69].pCu
8a00: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8a10: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8a20: 22 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 22  "GetTickCount64"
8a30: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
8a40: 41 4c 4c 29 47 65 74 54 69 63 6b 43 6f 75 6e 74  ALL)GetTickCount
8a50: 36 34 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  64,          0 }
8a60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
8a70: 54 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20  TickCount64",   
8a80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8a90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
8aa0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8ab0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ac0: 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 20 28  GetTickCount64 (
8ad0: 28 55 4c 4f 4e 47 4c 4f 4e 47 28 57 49 4e 41 50  (ULONGLONG(WINAP
8ae0: 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73 63 61  I*)(VOID))aSysca
8af0: 6c 6c 5b 37 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[70].pCurrent)
8b00: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
8b10: 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 4e 61  WINRT.  { "GetNa
8b20: 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 22 2c  tiveSystemInfo",
8b30: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
8b40: 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66  tNativeSystemInf
8b50: 6f 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  o,     0 },.#els
8b60: 65 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65  e.  { "GetNative
8b70: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
8b80: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8bb0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4e 61 74  #define osGetNat
8bc0: 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 20 28 28  iveSystemInfo ((
8bd0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 20 5c  VOID(WINAPI*)( \
8be0: 0a 20 20 20 20 20 20 20 20 4c 50 53 59 53 54 45  .        LPSYSTE
8bf0: 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c 6c  M_INFO))aSyscall
8c00: 5b 37 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [71].pCurrent)..
8c10: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
8c20: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
8c30: 49 29 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65  I).  { "OutputDe
8c40: 62 75 67 53 74 72 69 6e 67 41 22 2c 20 20 20 20  bugStringA",    
8c50: 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74 70 75    (SYSCALL)Outpu
8c60: 74 44 65 62 75 67 53 74 72 69 6e 67 41 2c 20 20  tDebugStringA,  
8c70: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8c80: 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53   { "OutputDebugS
8c90: 74 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53  tringA",      (S
8ca0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
8cd0: 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44 65 62  fine osOutputDeb
8ce0: 75 67 53 74 72 69 6e 67 41 20 28 28 56 4f 49 44  ugStringA ((VOID
8cf0: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
8d00: 29 29 61 53 79 73 63 61 6c 6c 5b 37 32 5d 2e 70  ))aSyscall[72].p
8d10: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
8d20: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
8d30: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
8d40: 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74 72   "OutputDebugStr
8d50: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
8d60: 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67  CALL)OutputDebug
8d70: 53 74 72 69 6e 67 57 2c 20 20 20 20 20 20 30 20  StringW,      0 
8d80: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75  },.#else.  { "Ou
8d90: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57  tputDebugStringW
8da0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
8db0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8dc0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8dd0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
8de0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
8df0: 6e 67 57 20 28 28 56 4f 49 44 28 57 49 4e 41 50  ngW ((VOID(WINAP
8e00: 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61 53 79  I*)(LPCWSTR))aSy
8e10: 73 63 61 6c 6c 5b 37 33 5d 2e 70 43 75 72 72 65  scall[73].pCurre
8e20: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 50 72 6f  nt)..  { "GetPro
8e30: 63 65 73 73 48 65 61 70 22 2c 20 20 20 20 20 20  cessHeap",      
8e40: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
8e50: 50 72 6f 63 65 73 73 48 65 61 70 2c 20 20 20 20  ProcessHeap,    
8e60: 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66        0 },..#def
8e70: 69 6e 65 20 6f 73 47 65 74 50 72 6f 63 65 73 73  ine osGetProcess
8e80: 48 65 61 70 20 28 28 48 41 4e 44 4c 45 28 57 49  Heap ((HANDLE(WI
8e90: 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79  NAPI*)(VOID))aSy
8ea0: 73 63 61 6c 6c 5b 37 34 5d 2e 70 43 75 72 72 65  scall[74].pCurre
8eb0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
8ec0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 28 21 64 65  OS_WINRT && (!de
8ed0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
8ee0: 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
8ef0: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
8f00: 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c  ).  { "CreateFil
8f10: 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22  eMappingFromApp"
8f20: 2c 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74  , (SYSCALL)Creat
8f30: 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
8f40: 41 70 70 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  App, 0 },.#else.
8f50: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
8f60: 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20  appingFromApp", 
8f70: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
8fa0: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
8fb0: 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70  leMappingFromApp
8fc0: 20 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49   ((HANDLE(WINAPI
8fd0: 2a 29 28 48 41 4e 44 4c 45 2c 20 5c 0a 20 20 20  *)(HANDLE, \.   
8fe0: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
8ff0: 41 54 54 52 49 42 55 54 45 53 2c 55 4c 4f 4e 47  ATTRIBUTES,ULONG
9000: 2c 55 4c 4f 4e 47 36 34 2c 4c 50 43 57 53 54 52  ,ULONG64,LPCWSTR
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 35 5d 2e 70  ))aSyscall[75].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20  Current)../*.** 
9030: 4e 4f 54 45 3a 20 4f 6e 20 73 6f 6d 65 20 73 75  NOTE: On some su
9040: 62 2d 70 6c 61 74 66 6f 72 6d 73 2c 20 74 68 65  b-platforms, the
9050: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70   InterlockedComp
9060: 61 72 65 45 78 63 68 61 6e 67 65 20 22 66 75 6e  areExchange "fun
9070: 63 74 69 6f 6e 22 0a 2a 2a 20 20 20 20 20 20 20  ction".**       
9080: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61  is really just a
9090: 20 6d 61 63 72 6f 20 74 68 61 74 20 75 73 65 73   macro that uses
90a0: 20 61 20 63 6f 6d 70 69 6c 65 72 20 69 6e 74 72   a compiler intr
90b0: 69 6e 73 69 63 20 28 65 2e 67 2e 20 78 36 34 29  insic (e.g. x64)
90c0: 2e 0a 2a 2a 20 20 20 20 20 20 20 53 6f 20 64 6f  ..**       So do
90d0: 20 6e 6f 74 20 74 72 79 20 74 6f 20 6d 61 6b 65   not try to make
90e0: 20 74 68 69 73 20 69 73 20 69 6e 74 6f 20 61 20   this is into a 
90f0: 72 65 64 65 66 69 6e 61 62 6c 65 20 69 6e 74 65  redefinable inte
9100: 72 66 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 64 65  rface..*/.#if de
9110: 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65  fined(Interlocke
9120: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9130: 29 0a 20 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b  ).  { "Interlock
9140: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
9150: 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30 2c 20  e", (SYSCALL)0, 
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9170: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
9180: 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f   osInterlockedCo
9190: 6d 70 61 72 65 45 78 63 68 61 6e 67 65 20 49 6e  mpareExchange In
91a0: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
91b0: 45 78 63 68 61 6e 67 65 0a 23 65 6c 73 65 0a 20  Exchange.#else. 
91c0: 20 7b 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43   { "InterlockedC
91d0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c  ompareExchange",
91e0: 20 28 53 59 53 43 41 4c 4c 29 49 6e 74 65 72 6c   (SYSCALL)Interl
91f0: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
9200: 61 6e 67 65 2c 20 30 20 7d 2c 0a 0a 23 64 65 66  ange, 0 },..#def
9210: 69 6e 65 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65  ine osInterlocke
9220: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
9230: 20 28 28 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29   ((LONG(WINAPI*)
9240: 28 4c 4f 4e 47 20 5c 0a 20 20 20 20 20 20 20 20  (LONG \.        
9250: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c  SQLITE_WIN32_VOL
9260: 41 54 49 4c 45 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e  ATILE*, LONG,LON
9270: 47 29 29 61 53 79 73 63 61 6c 6c 5b 37 36 5d 2e  G))aSyscall[76].
9280: 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66  pCurrent).#endif
9290: 20 2f 2a 20 64 65 66 69 6e 65 64 28 49 6e 74 65   /* defined(Inte
92a0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
92b0: 63 68 61 6e 67 65 29 20 2a 2f 0a 0a 23 69 66 20  change) */..#if 
92c0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
92d0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
92e0: 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f 57  INRT && SQLITE_W
92f0: 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20 20  IN32_USE_UUID.  
9300: 7b 20 22 55 75 69 64 43 72 65 61 74 65 22 2c 20  { "UuidCreate", 
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
9320: 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61 74  YSCALL)UuidCreat
9330: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30  e,             0
9340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55   },.#else.  { "U
9350: 75 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20  uidCreate",     
9360: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
9370: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
9380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
9390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
93a0: 6f 73 55 75 69 64 43 72 65 61 74 65 20 28 28 52  osUuidCreate ((R
93b0: 50 43 5f 53 54 41 54 55 53 28 52 50 43 5f 45 4e  PC_STATUS(RPC_EN
93c0: 54 52 59 2a 29 28 55 55 49 44 2a 29 29 61 53 79  TRY*)(UUID*))aSy
93d0: 73 63 61 6c 6c 5b 37 37 5d 2e 70 43 75 72 72 65  scall[77].pCurre
93e0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
93f0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
9400: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
9410: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53   SQLITE_WIN32_US
9420: 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64  E_UUID.  { "Uuid
9430: 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c  CreateSequential
9440: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
9450: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
9460: 74 69 61 6c 2c 20 20 20 30 20 7d 2c 0a 23 65 6c  tial,   0 },.#el
9470: 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61  se.  { "UuidCrea
9480: 74 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20  teSequential",  
9490: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
94c0: 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43  .#define osUuidC
94d0: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 20  reateSequential 
94e0: 5c 0a 20 20 20 20 20 20 20 20 28 28 52 50 43 5f  \.        ((RPC_
94f0: 53 54 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59  STATUS(RPC_ENTRY
9500: 2a 29 28 55 55 49 44 2a 29 29 61 53 79 73 63 61  *)(UUID*))aSysca
9510: 6c 6c 5b 37 38 5d 2e 70 43 75 72 72 65 6e 74 29  ll[78].pCurrent)
9520: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
9530: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 26  QLITE_NO_SYNC) &
9540: 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  & SQLITE_MAX_MMA
9550: 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 46 6c  P_SIZE>0.  { "Fl
9560: 75 73 68 56 69 65 77 4f 66 46 69 6c 65 22 2c 20  ushViewOfFile", 
9570: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
9580: 4c 29 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c  L)FlushViewOfFil
9590: 65 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23  e,        0 },.#
95a0: 65 6c 73 65 0a 20 20 7b 20 22 46 6c 75 73 68 56  else.  { "FlushV
95b0: 69 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20  iewOfFile",     
95c0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
95f0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6c 75  f..#define osFlu
9600: 73 68 56 69 65 77 4f 66 46 69 6c 65 20 5c 0a 20  shViewOfFile \. 
9610: 20 20 20 20 20 20 20 28 28 42 4f 4f 4c 28 57 49         ((BOOL(WI
9620: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 2c 53  NAPI*)(LPCVOID,S
9630: 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b  IZE_T))aSyscall[
9640: 37 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 7d  79].pCurrent)..}
9650: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
9660: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
9670: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
9680: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
9690: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
96a0: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
96b0: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
96c0: 66 20 74 68 65 0a 2a 2a 20 22 77 69 6e 33 32 22  f the.** "win32"
96d0: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
96e0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
96f0: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
9700: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
9710: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
9720: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
9730: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
9740: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
9750: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
9760: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
9770: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 74  tatic int winSet
9780: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
9790: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
97a0: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
97b0: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
97c0: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
97d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
97e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
97f0: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
9800: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
9810: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
9820: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
9830: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
9840: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
9850: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
9860: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
9870: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
9880: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
9890: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
98a0: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
98b0: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
98c0: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
98d0: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
98e0: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
98f0: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
9900: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
9910: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
9920: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
9930: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
9950: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
9960: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
9970: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
9980: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
9990: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
99a0: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
99b0: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
99c0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
99d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
99e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
99f0: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
9a00: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
9a10: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
9a20: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
9a30: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
9a40: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
9a50: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
9a60: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
9a70: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
9a80: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
9a90: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
9aa0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
9ab0: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
9ac0: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
9ad0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
9ae0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
9af0: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
9b00: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
9b20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9b30: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
9b40: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
9b50: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
9b60: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
9b70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
9b80: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
9b90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
9bc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9bd0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
9be0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
9bf0: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
9c00: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
9c10: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
9c20: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
9c30: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
9c40: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
9c50: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
9c60: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
9c70: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
9c80: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 77 69  3_syscall_ptr wi
9c90: 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a  nGetSystemCall(.
9ca0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
9cb0: 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74  NotUsed,.  const
9cc0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a   char *zName.){.
9cd0: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
9ce0: 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ;..  UNUSED_PARA
9cf0: 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b  METER(pNotUsed);
9d00: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
9d10: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
9d20: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
9d30: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
9d40: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
9d50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
9d60: 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61  e)==0 ) return a
9d70: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
9d80: 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ent;.  }.  retur
9d90: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
9da0: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
9db0: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
9dc0: 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61  m call after zNa
9dd0: 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e  me.  If zName==N
9de0: 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75  ULL.** then retu
9df0: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
9e00: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
9e10: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
9e20: 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69  LL if zName.** i
9e30: 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65  s the last syste
9e40: 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61  m call or if zNa
9e50: 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  me is not the na
9e60: 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a  me of a valid.**
9e70: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f   system call..*/
9e80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
9e90: 61 72 20 2a 77 69 6e 4e 65 78 74 53 79 73 74 65  ar *winNextSyste
9ea0: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
9eb0: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
9ec0: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
9ed0: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
9ee0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
9ef0: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
9f00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
9f10: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
9f20: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
9f30: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
9f40: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
9f50: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
9f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
9f70: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
9f80: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
9f90: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
9fa0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9fb0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
9fc0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
9fd0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9fe0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
9ff0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a  _WIN32_MALLOC./*
a000: 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32 20 6e  .** If a Win32 n
a010: 61 74 69 76 65 20 68 65 61 70 20 68 61 73 20 62  ative heap has b
a020: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
a030: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
a040: 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a  ll attempt to.**
a050: 20 63 6f 6d 70 61 63 74 20 69 74 2e 20 20 55 70   compact it.  Up
a060: 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
a070: 54 45 5f 4f 4b 20 77 69 6c 6c 20 62 65 20 72 65  TE_OK will be re
a080: 74 75 72 6e 65 64 2e 20 20 55 70 6f 6e 20 66 61  turned.  Upon fa
a090: 69 6c 75 72 65 2c 20 6f 6e 65 0a 2a 2a 20 6f 66  ilure, one.** of
a0a0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 53   SQLITE_NOMEM, S
a0b0: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 6f 72 20  QLITE_ERROR, or 
a0c0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
a0d0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
a0e0: 2e 20 20 54 68 65 0a 2a 2a 20 22 70 6e 4c 61 72  .  The.** "pnLar
a0f0: 67 65 73 74 22 20 61 72 67 75 6d 65 6e 74 2c 20  gest" argument, 
a100: 69 66 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 77 69 6c  if non-zero, wil
a110: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 74  l be used to ret
a120: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
a130: 74 68 65 0a 2a 2a 20 6c 61 72 67 65 73 74 20 63  the.** largest c
a140: 6f 6d 6d 69 74 74 65 64 20 66 72 65 65 20 62 6c  ommitted free bl
a150: 6f 63 6b 20 69 6e 20 74 68 65 20 68 65 61 70 2c  ock in the heap,
a160: 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 69 6e   in bytes..*/.in
a170: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
a180: 63 6f 6d 70 61 63 74 5f 68 65 61 70 28 4c 50 55  compact_heap(LPU
a190: 49 4e 54 20 70 6e 4c 61 72 67 65 73 74 29 7b 0a  INT pnLargest){.
a1a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
a1b0: 45 5f 4f 4b 3b 0a 20 20 55 49 4e 54 20 6e 4c 61  E_OK;.  UINT nLa
a1c0: 72 67 65 73 74 20 3d 20 30 3b 0a 20 20 48 41 4e  rgest = 0;.  HAN
a1d0: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
a1e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
a1f0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
a200: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
a210: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
a220: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
a230: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
a240: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
a250: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
a260: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
a270: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
a280: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
a290: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
a2a0: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
a2b0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
a2c0: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
a2d0: 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  dif.#if !SQLITE_
a2e0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
a2f0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
a300: 66 28 20 28 6e 4c 61 72 67 65 73 74 3d 6f 73 48  f( (nLargest=osH
a310: 65 61 70 43 6f 6d 70 61 63 74 28 68 48 65 61 70  eapCompact(hHeap
a320: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  , SQLITE_WIN32_H
a330: 45 41 50 5f 46 4c 41 47 53 29 29 3d 3d 30 20 29  EAP_FLAGS))==0 )
a340: 7b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74  {.    DWORD last
a350: 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
a360: 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 69 66  tError();.    if
a370: 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 4e 4f 5f  ( lastErrno==NO_
a380: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 73  ERROR ){.      s
a390: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
a3a0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
a3b0: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20   to HeapCompact 
a3c0: 28 6e 6f 20 73 70 61 63 65 29 2c 20 68 65 61 70  (no space), heap
a3d0: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
a3e0: 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 68          (void*)h
a3f0: 48 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Heap);.      rc 
a400: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
a410: 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
a420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
a430: 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20  g(SQLITE_ERROR, 
a440: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
a450: 6f 6d 70 61 63 74 20 28 25 6c 75 29 2c 20 68 65  ompact (%lu), he
a460: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
a470: 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 4c            osGetL
a480: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
a490: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 20  d*)hHeap);.     
a4a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
a4b0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  OR;.    }.  }.#e
a4c0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f  lse.  sqlite3_lo
a4d0: 67 28 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  g(SQLITE_NOTFOUN
a4e0: 44 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  D, "failed to He
a4f0: 61 70 43 6f 6d 70 61 63 74 2c 20 68 65 61 70 3d  apCompact, heap=
a500: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
a510: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
a520: 3b 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  ;.  rc = SQLITE_
a530: 4e 4f 54 46 4f 55 4e 44 3b 0a 23 65 6e 64 69 66  NOTFOUND;.#endif
a540: 0a 20 20 69 66 28 20 70 6e 4c 61 72 67 65 73 74  .  if( pnLargest
a550: 20 29 20 2a 70 6e 4c 61 72 67 65 73 74 20 3d 20   ) *pnLargest = 
a560: 6e 4c 61 72 67 65 73 74 3b 0a 20 20 72 65 74 75  nLargest;.  retu
a570: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
a580: 49 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76  If a Win32 nativ
a590: 65 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20  e heap has been 
a5a0: 63 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73  configured, this
a5b0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61   function will a
a5c0: 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 64 65 73  ttempt to.** des
a5d0: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
a5e0: 65 20 69 74 2e 20 20 49 66 20 74 68 65 20 57 69  e it.  If the Wi
a5f0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20  n32 native heap 
a600: 69 73 20 6e 6f 74 20 69 73 6f 6c 61 74 65 64 20  is not isolated 
a610: 61 6e 64 2f 6f 72 0a 2a 2a 20 74 68 65 20 73 71  and/or.** the sq
a620: 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65  lite3_memory_use
a630: 64 28 29 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  d() function doe
a640: 73 20 6e 6f 74 20 72 65 74 75 72 6e 20 7a 65 72  s not return zer
a650: 6f 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  o, SQLITE_BUSY w
a660: 69 6c 6c 0a 2a 2a 20 62 65 20 72 65 74 75 72 6e  ill.** be return
a670: 65 64 20 61 6e 64 20 6e 6f 20 63 68 61 6e 67 65  ed and no change
a680: 73 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74  s will be made t
a690: 6f 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  o the Win32 nati
a6a0: 76 65 20 68 65 61 70 2e 0a 2a 2f 0a 69 6e 74 20  ve heap..*/.int 
a6b0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 72 65  sqlite3_win32_re
a6c0: 73 65 74 5f 68 65 61 70 28 29 7b 0a 20 20 69 6e  set_heap(){.  in
a6d0: 74 20 72 63 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f  t rc;.  MUTEX_LO
a6e0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
a6f0: 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 20 2f  ex *pMaster; ) /
a700: 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61 74 69  * The main stati
a710: 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54  c mutex */.  MUT
a720: 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65  EX_LOGIC( sqlite
a730: 33 5f 6d 75 74 65 78 20 2a 70 4d 65 6d 3b 20 29  3_mutex *pMem; )
a740: 20 20 20 20 2f 2a 20 54 68 65 20 6d 65 6d 73 79      /* The memsy
a750: 73 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a  s static mutex *
a760: 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  /.  MUTEX_LOGIC(
a770: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
a780: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a790: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a7a0: 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 4d 55  _MASTER); ).  MU
a7b0: 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20  TEX_LOGIC( pMem 
a7c0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
a7d0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
a7e0: 5f 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a  _STATIC_MEM); ).
a7f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a800: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
a810: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a820: 65 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77  enter(pMem);.  w
a830: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
a840: 28 29 3b 0a 20 20 69 66 28 20 77 69 6e 4d 65 6d  ();.  if( winMem
a850: 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20  GetHeap()!=NULL 
a860: 26 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  && winMemGetOwne
a870: 64 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d  d() && sqlite3_m
a880: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
a890: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
a8a0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
a8b0: 74 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  there should be 
a8c0: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d  no outstanding m
a8d0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
a8e0: 73 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  s on.    ** the 
a8f0: 68 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e  heap.  Also, sin
a900: 63 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74  ce both the mast
a910: 65 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f  er and memsys lo
a920: 63 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c  cks are currentl
a930: 79 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68  y.    ** being h
a940: 65 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74  eld by us, no ot
a950: 68 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e  her function (i.
a960: 65 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20  e. from another 
a970: 74 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20  thread) should. 
a980: 20 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f     ** be able to
a990: 20 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65   even access the
a9a0: 20 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20   heap.  Attempt 
a9b0: 74 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  to destroy and r
a9c0: 65 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20  ecreate our.    
a9d0: 2a 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33  ** isolated Win3
a9e0: 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f  2 native heap no
a9f0: 77 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  w..    */.    as
aa00: 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48  sert( winMemGetH
aa10: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20  eap()!=NULL );. 
aa20: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
aa30: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
aa40: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
aa50: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
aa60: 3d 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65  ==0 );.    winMe
aa70: 6d 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d  mShutdown(winMem
aa80: 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20  GetDataPtr());. 
aa90: 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65     assert( winMe
aaa0: 6d 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c  mGetHeap()==NULL
aab0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
aac0: 21 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28  !winMemGetOwned(
aad0: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
aae0: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
aaf0: 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20  used()==0 );.   
ab00: 20 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74   rc = winMemInit
ab10: 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74  (winMemGetDataPt
ab20: 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  r());.    assert
ab30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ab40: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  || winMemGetHeap
ab50: 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()!=NULL );.    
ab60: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
ab70: 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47  TE_OK || winMemG
ab80: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
ab90: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
aba0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65  ITE_OK || sqlite
abb0: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
abc0: 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  =0 );.  }else{. 
abd0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
abe0: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
abf0: 61 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64  ap cannot be mod
ac00: 69 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74  ified because it
ac10: 20 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a   may be in use..
ac20: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
ac30: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
ac40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ac50: 5f 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20  _leave(pMem);.  
ac60: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ac70: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ave(pMaster);.  
ac80: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
ac90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
aca0: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
acb0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
acc0: 6f 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73  on outputs the s
acd0: 70 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20  pecified (ANSI) 
ace0: 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69  string to the Wi
acf0: 6e 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20  n32 debugger.** 
ad00: 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
ad10: 2a 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */..void sqlite3
ad20: 5f 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62  _win32_write_deb
ad30: 75 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ug(const char *z
ad40: 42 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a  Buf, int nBuf){.
ad50: 20 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53    char zDbgBuf[S
ad60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
ad70: 42 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  BUF_SIZE];.  int
ad80: 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66   nMin = MIN(nBuf
ad90: 2c 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  , (SQLITE_WIN32_
ada0: 44 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31  DBG_BUF_SIZE - 1
adb0: 29 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65  )); /* may be ne
adc0: 67 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28  gative. */.  if(
add0: 20 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20   nMin<-1 ) nMin 
ade0: 3d 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67  = -1; /* all neg
adf0: 61 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63  ative values bec
ae00: 6f 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73  ome -1. */.  ass
ae10: 65 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c  ert( nMin==-1 ||
ae20: 20 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e   nMin==0 || nMin
ae30: 3c 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42  <SQLITE_WIN32_DB
ae40: 47 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69  G_BUF_SIZE );.#i
ae50: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
ae60: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
ae70: 66 28 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20  f( !zBuf ){.    
ae80: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
ae90: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
aea0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
aeb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
aec0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
aed0: 53 49 29 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  SI).  if( nMin>0
aee0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
aef0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
af00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
af10: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
af20: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
af30: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 6f 73 4f 75   nMin);.    osOu
af40: 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 41  tputDebugStringA
af50: 28 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c  (zDbgBuf);.  }el
af60: 73 65 7b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  se{.    osOutput
af70: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 42 75  DebugStringA(zBu
af80: 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 64 65  f);.  }.#elif de
af90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
afa0: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 6d  32_HAS_WIDE).  m
afb0: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
afc0: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
afd0: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
afe0: 69 66 20 28 20 6f 73 4d 75 6c 74 69 42 79 74 65  if ( osMultiByte
aff0: 54 6f 57 69 64 65 43 68 61 72 28 0a 20 20 20 20  ToWideChar(.    
b000: 20 20 20 20 20 20 6f 73 41 72 65 46 69 6c 65 41        osAreFileA
b010: 70 69 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41  pisANSI() ? CP_A
b020: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 2c 20 30  CP : CP_OEMCP, 0
b030: 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20  , zBuf,.        
b040: 20 20 6e 4d 69 6e 2c 20 28 4c 50 57 53 54 52 29    nMin, (LPWSTR)
b050: 7a 44 62 67 42 75 66 2c 20 53 51 4c 49 54 45 5f  zDbgBuf, SQLITE_
b060: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
b070: 5a 45 2f 73 69 7a 65 6f 66 28 57 43 48 41 52 29  ZE/sizeof(WCHAR)
b080: 29 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )<=0 ){.    retu
b090: 72 6e 3b 0a 20 20 7d 0a 20 20 6f 73 4f 75 74 70  rn;.  }.  osOutp
b0a0: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 28 28  utDebugStringW((
b0b0: 4c 50 43 57 53 54 52 29 7a 44 62 67 42 75 66 29  LPCWSTR)zDbgBuf)
b0c0: 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6e 4d  ;.#else.  if( nM
b0d0: 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  in>0 ){.    mems
b0e0: 65 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53  et(zDbgBuf, 0, S
b0f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
b100: 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20 20 20 6d  BUF_SIZE);.    m
b110: 65 6d 63 70 79 28 7a 44 62 67 42 75 66 2c 20 7a  emcpy(zDbgBuf, z
b120: 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  Buf, nMin);.    
b130: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
b140: 22 25 73 22 2c 20 7a 44 62 67 42 75 66 29 3b 0a  "%s", zDbgBuf);.
b150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72    }else{.    fpr
b160: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
b170: 22 2c 20 7a 42 75 66 29 3b 0a 20 20 7d 0a 23 65  ", zBuf);.  }.#e
b180: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
b190: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
b1a0: 69 6e 65 20 73 75 73 70 65 6e 64 73 20 74 68 65  ine suspends the
b1b0: 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
b1c0: 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6d 73 0a  for at least ms.
b1d0: 2a 2a 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e  ** milliseconds.
b1e0: 20 20 54 68 69 73 20 69 73 20 65 71 75 69 76 61    This is equiva
b1f0: 6c 65 6e 74 20 74 6f 20 74 68 65 20 57 69 6e 33  lent to the Win3
b200: 32 20 53 6c 65 65 70 28 29 20 69 6e 74 65 72 66  2 Sleep() interf
b210: 61 63 65 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  ace..*/.#if SQLI
b220: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 73 74 61 74  TE_OS_WINRT.stat
b230: 69 63 20 48 41 4e 44 4c 45 20 73 6c 65 65 70 4f  ic HANDLE sleepO
b240: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69  bj = NULL;.#endi
b250: 66 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  f..void sqlite3_
b260: 77 69 6e 33 32 5f 73 6c 65 65 70 28 44 57 4f 52  win32_sleep(DWOR
b270: 44 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 7b  D milliseconds){
b280: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
b290: 49 4e 52 54 0a 20 20 69 66 20 28 20 73 6c 65 65  INRT.  if ( slee
b2a0: 70 4f 62 6a 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20  pObj==NULL ){.  
b2b0: 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20 6f 73 43    sleepObj = osC
b2c0: 72 65 61 74 65 45 76 65 6e 74 45 78 57 28 4e 55  reateEventExW(NU
b2d0: 4c 4c 2c 20 4e 55 4c 4c 2c 20 43 52 45 41 54 45  LL, NULL, CREATE
b2e0: 5f 45 56 45 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45  _EVENT_MANUAL_RE
b2f0: 53 45 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  SET,.           
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 20 20 20 20 53 59 4e 43 48 52 4f 4e 49 5a 45       SYNCHRONIZE
b320: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
b330: 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20   sleepObj!=NULL 
b340: 29 3b 0a 20 20 6f 73 57 61 69 74 46 6f 72 53 69  );.  osWaitForSi
b350: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 28 73 6c 65  ngleObjectEx(sle
b360: 65 70 4f 62 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f  epObj, milliseco
b370: 6e 64 73 2c 20 46 41 4c 53 45 29 3b 0a 23 65 6c  nds, FALSE);.#el
b380: 73 65 0a 20 20 6f 73 53 6c 65 65 70 28 6d 69 6c  se.  osSleep(mil
b390: 6c 69 73 65 63 6f 6e 64 73 29 3b 0a 23 65 6e 64  liseconds);.#end
b3a0: 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  if.}..#if SQLITE
b3b0: 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
b3c0: 41 44 53 3e 30 20 26 26 20 21 53 51 4c 49 54 45  ADS>0 && !SQLITE
b3d0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
b3e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b3f0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
b400: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 44  E_THREADSAFE>0.D
b410: 57 4f 52 44 20 73 71 6c 69 74 65 33 57 69 6e 33  WORD sqlite3Win3
b420: 32 57 61 69 74 28 48 41 4e 44 4c 45 20 68 4f 62  2Wait(HANDLE hOb
b430: 6a 65 63 74 29 7b 0a 20 20 44 57 4f 52 44 20 72  ject){.  DWORD r
b440: 63 3b 0a 20 20 77 68 69 6c 65 28 20 28 72 63 20  c;.  while( (rc 
b450: 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
b460: 65 4f 62 6a 65 63 74 45 78 28 68 4f 62 6a 65 63  eObjectEx(hObjec
b470: 74 2c 20 49 4e 46 49 4e 49 54 45 2c 0a 20 20 20  t, INFINITE,.   
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4a0: 20 20 20 20 54 52 55 45 29 29 3d 3d 57 41 49 54      TRUE))==WAIT
b4b0: 5f 49 4f 5f 43 4f 4d 50 4c 45 54 49 4f 4e 20 29  _IO_COMPLETION )
b4c0: 7b 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  {}.  return rc;.
b4d0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
b4e0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
b4f0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
b500: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
b510: 69 6e 4e 54 2c 20 57 69 6e 32 4b 2c 20 57 69 6e  inNT, Win2K, Win
b520: 58 50 2c 0a 2a 2a 20 6f 72 20 57 69 6e 43 45 2e  XP,.** or WinCE.
b530: 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28    Return false (
b540: 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c  zero) for Win95,
b550: 20 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45   Win98, or WinME
b560: 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20  ..**.** Here is 
b570: 61 6e 20 69 6e 74 65 72 65 73 74 69 6e 67 20 6f  an interesting o
b580: 62 73 65 72 76 61 74 69 6f 6e 3a 20 20 57 69 6e  bservation:  Win
b590: 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e 64 20 57  95, Win98, and W
b5a0: 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20 74 68 65  inME lack.** the
b5b0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
b5c0: 49 2e 20 20 42 75 74 20 77 65 20 63 61 6e 20 73  I.  But we can s
b5d0: 74 69 6c 6c 20 73 74 61 74 69 63 61 6c 6c 79 20  till statically 
b5e0: 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20 74 68 61  link against tha
b5f0: 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c 6f 6e 67  t.** API as long
b600: 20 61 73 20 77 65 20 64 6f 6e 27 74 20 63 61 6c   as we don't cal
b610: 6c 20 69 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  l it when runnin
b620: 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  g Win95/98/ME.  
b630: 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69  A call to.** thi
b640: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
b650: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
b660: 66 20 74 68 65 20 68 6f 73 74 20 69 73 20 57 69  f the host is Wi
b670: 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20  n95/98/ME or.** 
b680: 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f 20 74  WinNT/2K/XP so t
b690: 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77  hat we will know
b6a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b6b0: 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20 63 61  we can safely ca
b6c0: 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69  ll.** the LockFi
b6d0: 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a  leEx() API..*/..
b6e0: 23 69 66 20 21 53 51 4c 49 54 45 5f 57 49 4e 33  #if !SQLITE_WIN3
b6f0: 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a 23  2_GETVERSIONEX.#
b700: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b710: 20 20 28 31 29 0a 23 65 6c 69 66 20 53 51 4c 49    (1).#elif SQLI
b720: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
b730: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 7c  QLITE_OS_WINRT |
b740: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
b750: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
b760: 29 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73 4e  ).# define osIsN
b770: 54 28 29 20 20 28 31 29 0a 23 65 6c 69 66 20 21  T()  (1).#elif !
b780: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b790: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 23  IN32_HAS_WIDE).#
b7a0: 20 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29   define osIsNT()
b7b0: 20 20 28 30 29 0a 23 65 6c 73 65 0a 23 20 64 65    (0).#else.# de
b7c0: 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28  fine osIsNT()  (
b7d0: 28 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  (sqlite3_os_type
b7e0: 3d 3d 32 29 20 7c 7c 20 73 71 6c 69 74 65 33 5f  ==2) || sqlite3_
b7f0: 77 69 6e 33 32 5f 69 73 5f 6e 74 28 29 29 0a 23  win32_is_nt()).#
b800: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
b810: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
b820: 6d 69 6e 65 73 20 69 66 20 74 68 65 20 6d 61 63  mines if the mac
b830: 68 69 6e 65 20 69 73 20 72 75 6e 6e 69 6e 67 20  hine is running 
b840: 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 57 69 6e  a version of Win
b850: 64 6f 77 73 0a 2a 2a 20 62 61 73 65 64 20 6f 6e  dows.** based on
b860: 20 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a   the NT kernel..
b870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
b880: 69 6e 33 32 5f 69 73 5f 6e 74 28 76 6f 69 64 29  in32_is_nt(void)
b890: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
b8a0: 57 49 4e 52 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20  WINRT.  /*.  ** 
b8b0: 4e 4f 54 45 3a 20 54 68 65 20 57 69 6e 52 54 20  NOTE: The WinRT 
b8c0: 73 75 62 2d 70 6c 61 74 66 6f 72 6d 20 69 73 20  sub-platform is 
b8d0: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64 20 74  always assumed t
b8e0: 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  o be based on th
b8f0: 65 20 4e 54 0a 20 20 2a 2a 20 20 20 20 20 20 20  e NT.  **       
b900: 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72  kernel..  */.  r
b910: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 69 66 20 53  eturn 1;.#elif S
b920: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
b930: 45 52 53 49 4f 4e 45 58 0a 20 20 69 66 28 20 6f  ERSIONEX.  if( o
b940: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b950: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b960: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 30 2c  ite3_os_type, 0,
b970: 20 30 29 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65   0)==0 ){.#if de
b980: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
b990: 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 20  32_HAS_ANSI).   
b9a0: 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 41 20   OSVERSIONINFOA 
b9b0: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
b9c0: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
b9d0: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
b9e0: 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74 56  nfo);.    osGetV
b9f0: 65 72 73 69 6f 6e 45 78 41 28 26 73 49 6e 66 6f  ersionExA(&sInfo
ba00: 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f  );.    osInterlo
ba10: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
ba20: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
ba30: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28 73  type,.        (s
ba40: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
ba50: 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52  d == VER_PLATFOR
ba60: 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20  M_WIN32_NT) ? 2 
ba70: 3a 20 31 2c 20 30 29 3b 0a 23 65 6c 69 66 20 64  : 1, 0);.#elif d
ba80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
ba90: 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20  N32_HAS_WIDE).  
baa0: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 57    OSVERSIONINFOW
bab0: 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66   sInfo;.    sInf
bac0: 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66  o.dwOSVersionInf
bad0: 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73  oSize = sizeof(s
bae0: 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73 47 65 74  Info);.    osGet
baf0: 56 65 72 73 69 6f 6e 45 78 57 28 26 73 49 6e 66  VersionExW(&sInf
bb00: 6f 29 3b 0a 20 20 20 20 6f 73 49 6e 74 65 72 6c  o);.    osInterl
bb10: 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68  ockedCompareExch
bb20: 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73  ange(&sqlite3_os
bb30: 5f 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 28  _type,.        (
bb40: 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d  sInfo.dwPlatform
bb50: 49 64 20 3d 3d 20 56 45 52 5f 50 4c 41 54 46 4f  Id == VER_PLATFO
bb60: 52 4d 5f 57 49 4e 33 32 5f 4e 54 29 20 3f 20 32  RM_WIN32_NT) ? 2
bb70: 20 3a 20 31 2c 20 30 29 3b 0a 23 65 6e 64 69 66   : 1, 0);.#endif
bb80: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73  .  }.  return os
bb90: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
bba0: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
bbb0: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
bbc0: 32 29 3d 3d 32 3b 0a 23 65 6c 69 66 20 53 51 4c  2)==2;.#elif SQL
bbd0: 49 54 45 5f 54 45 53 54 0a 20 20 72 65 74 75 72  ITE_TEST.  retur
bbe0: 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43  n osInterlockedC
bbf0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28 26  ompareExchange(&
bc00: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c  sqlite3_os_type,
bc10: 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65 6c 73 65   2, 2)==2;.#else
bc20: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a  .  /*.  ** NOTE:
bc30: 20 41 6c 6c 20 73 75 62 2d 70 6c 61 74 66 6f 72   All sub-platfor
bc40: 6d 73 20 77 68 65 72 65 20 74 68 65 20 47 65 74  ms where the Get
bc50: 56 65 72 73 69 6f 6e 45 78 5b 41 57 5d 20 66 75  VersionEx[AW] fu
bc60: 6e 63 74 69 6f 6e 73 20 61 72 65 0a 20 20 2a 2a  nctions are.  **
bc70: 20 20 20 20 20 20 20 64 65 70 72 65 63 61 74 65         deprecate
bc80: 64 20 61 72 65 20 61 6c 77 61 79 73 20 61 73 73  d are always ass
bc90: 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65 64  umed to be based
bca0: 20 6f 6e 20 74 68 65 20 4e 54 20 6b 65 72 6e 65   on the NT kerne
bcb0: 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  l..  */.  return
bcc0: 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69   1;.#endif.}..#i
bcd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
bce0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41  2_MALLOC./*.** A
bcf0: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 73 20 6f  llocate nBytes o
bd00: 66 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  f memory..*/.sta
bd10: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
bd20: 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e 42 79 74 65  Malloc(int nByte
bd30: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
bd40: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
bd50: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bd60: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bd70: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bd90: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bda0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bdb0: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bdc0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bdd0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bde0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bdf0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
be00: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
be10: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
be20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
be30: 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b  _FLAGS, NULL) );
be40: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
be50: 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a 20  ( nBytes>=0 );. 
be60: 20 70 20 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63   p = osHeapAlloc
be70: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
be80: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
be90: 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73 29   (SIZE_T)nBytes)
bea0: 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  ;.  if( !p ){.  
beb0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bec0: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
bed0: 6c 65 64 20 74 6f 20 48 65 61 70 41 6c 6c 6f 63  led to HeapAlloc
bee0: 20 25 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c   %u bytes (%lu),
bef0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
bf00: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
bf10: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
bf20: 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61  r(), (void*)hHea
bf30: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
bf40: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65   p;.}../*.** Fre
bf50: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
bf60: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46  tic void winMemF
bf70: 72 65 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72  ree(void *pPrior
bf80: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bf90: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
bfa0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bfb0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
bfc0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bfd0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bfe0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bff0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
c000: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
c010: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
c020: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
c030: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
c040: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
c050: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
c060: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
c070: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
c080: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
c090: 69 66 28 20 21 70 50 72 69 6f 72 20 29 20 72 65  if( !pPrior ) re
c0a0: 74 75 72 6e 3b 20 2f 2a 20 50 61 73 73 69 6e 67  turn; /* Passing
c0b0: 20 4e 55 4c 4c 20 74 6f 20 48 65 61 70 46 72 65   NULL to HeapFre
c0c0: 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
c0d0: 2a 2f 0a 20 20 69 66 28 20 21 6f 73 48 65 61 70  */.  if( !osHeap
c0e0: 46 72 65 65 28 68 48 65 61 70 2c 20 53 51 4c 49  Free(hHeap, SQLI
c0f0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c100: 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29 7b 0a  AGS, pPrior) ){.
c110: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
c120: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66  SQLITE_NOMEM, "f
c130: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 46 72 65  ailed to HeapFre
c140: 65 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29  e block %p (%lu)
c150: 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20  , heap=%p",.    
c160: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72 69              pPri
c170: 6f 72 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  or, osGetLastErr
c180: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65  or(), (void*)hHe
c190: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ap);.  }.}../*.*
c1a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
c1b0: 65 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67  e of an existing
c1c0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
c1d0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
c1e0: 64 20 2a 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63  d *winMemRealloc
c1f0: 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 2c 20 69  (void *pPrior, i
c200: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
c210: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
c220: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
c230: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
c240: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
c250: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
c260: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
c270: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
c280: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
c290: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
c2a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
c2b0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
c2c0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
c2d0: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
c2e0: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
c2f0: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c300: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c310: 70 50 72 69 6f 72 29 20 29 3b 0a 23 65 6e 64 69  pPrior) );.#endi
c320: 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42 79 74  f.  assert( nByt
c330: 65 73 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 21  es>=0 );.  if( !
c340: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 20  pPrior ){.    p 
c350: 3d 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48  = osHeapAlloc(hH
c360: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c370: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53  2_HEAP_FLAGS, (S
c380: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
c390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
c3a0: 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 28 68 48  osHeapReAlloc(hH
c3b0: 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  eap, SQLITE_WIN3
c3c0: 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50  2_HEAP_FLAGS, pP
c3d0: 72 69 6f 72 2c 20 28 53 49 5a 45 5f 54 29 6e 42  rior, (SIZE_T)nB
c3e0: 79 74 65 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ytes);.  }.  if(
c3f0: 20 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   !p ){.    sqlit
c400: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
c410: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
c420: 25 73 20 25 75 20 62 79 74 65 73 20 28 25 6c 75  %s %u bytes (%lu
c430: 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  ), heap=%p",.   
c440: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 72               pPr
c450: 69 6f 72 20 3f 20 22 48 65 61 70 52 65 41 6c 6c  ior ? "HeapReAll
c460: 6f 63 22 20 3a 20 22 48 65 61 70 41 6c 6c 6f 63  oc" : "HeapAlloc
c470: 22 2c 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74  ", nBytes, osGet
c480: 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
c490: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
c4a0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
c4b0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
c4c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c4d0: 73 69 7a 65 20 6f 66 20 61 6e 20 6f 75 74 73 74  size of an outst
c4e0: 61 6e 64 69 6e 67 20 61 6c 6c 6f 63 61 74 69 6f  anding allocatio
c4f0: 6e 2c 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a  n, in bytes..*/.
c500: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65  static int winMe
c510: 6d 53 69 7a 65 28 76 6f 69 64 20 2a 70 29 7b 0a  mSize(void *p){.
c520: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
c530: 20 20 53 49 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77    SIZE_T n;..  w
c540: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
c550: 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69  ();.  hHeap = wi
c560: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20  nMemGetHeap();. 
c570: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
c580: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68  0 );.  assert( h
c590: 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41  Heap!=INVALID_HA
c5a0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69  NDLE_VALUE );.#i
c5b0: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
c5c0: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
c5d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f  LITE_WIN32_MALLO
c5e0: 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73  C_VALIDATE).  as
c5f0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
c600: 64 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49  date(hHeap, SQLI
c610: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
c620: 41 47 53 2c 20 70 29 20 29 3b 0a 23 65 6e 64 69  AGS, p) );.#endi
c630: 66 0a 20 20 69 66 28 20 21 70 20 29 20 72 65 74  f.  if( !p ) ret
c640: 75 72 6e 20 30 3b 0a 20 20 6e 20 3d 20 6f 73 48  urn 0;.  n = osH
c650: 65 61 70 53 69 7a 65 28 68 48 65 61 70 2c 20 53  eapSize(hHeap, S
c660: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c670: 5f 46 4c 41 47 53 2c 20 70 29 3b 0a 20 20 69 66  _FLAGS, p);.  if
c680: 28 20 6e 3d 3d 28 53 49 5a 45 5f 54 29 2d 31 20  ( n==(SIZE_T)-1 
c690: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c6a0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
c6b0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c6c0: 53 69 7a 65 20 62 6c 6f 63 6b 20 25 70 20 28 25  Size block %p (%
c6d0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
c6f0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
c700: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
c710: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
c720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
c730: 6e 74 29 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  nt)n;.}../*.** R
c740: 6f 75 6e 64 20 75 70 20 61 20 72 65 71 75 65 73  ound up a reques
c750: 74 20 73 69 7a 65 20 74 6f 20 74 68 65 20 6e 65  t size to the ne
c760: 78 74 20 76 61 6c 69 64 20 61 6c 6c 6f 63 61 74  xt valid allocat
c770: 69 6f 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61  ion size..*/.sta
c780: 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 52 6f  tic int winMemRo
c790: 75 6e 64 75 70 28 69 6e 74 20 6e 29 7b 0a 20 20  undup(int n){.  
c7a0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
c7b0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
c7c0: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
c7d0: 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 49  atic int winMemI
c7e0: 6e 69 74 28 76 6f 69 64 20 2a 70 41 70 70 44 61  nit(void *pAppDa
c7f0: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c800: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c810: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c820: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c830: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
c850: 4f 52 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57  OR;.  assert( pW
c860: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c870: 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31  1==WINMEM_MAGIC1
c880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57   );.  assert( pW
c890: 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61 67 69 63  inMemData->magic
c8a0: 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32  2==WINMEM_MAGIC2
c8b0: 20 29 3b 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   );..#if !SQLITE
c8c0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c  _OS_WINRT && SQL
c8d0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43  ITE_WIN32_HEAP_C
c8e0: 52 45 41 54 45 0a 20 20 69 66 28 20 21 70 57 69  REATE.  if( !pWi
c8f0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20  nMemData->hHeap 
c900: 29 7b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 49  ){.    DWORD dwI
c910: 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 53 51 4c  nitialSize = SQL
c920: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 49  ITE_WIN32_HEAP_I
c930: 4e 49 54 5f 53 49 5a 45 3b 0a 20 20 20 20 44 57  NIT_SIZE;.    DW
c940: 4f 52 44 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a  ORD dwMaximumSiz
c950: 65 20 3d 20 28 44 57 4f 52 44 29 73 71 6c 69 74  e = (DWORD)sqlit
c960: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
c970: 48 65 61 70 3b 0a 20 20 20 20 69 66 28 20 64 77  Heap;.    if( dw
c980: 4d 61 78 69 6d 75 6d 53 69 7a 65 3d 3d 30 20 29  MaximumSize==0 )
c990: 7b 0a 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75  {.      dwMaximu
c9a0: 6d 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57  mSize = SQLITE_W
c9b0: 49 4e 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49  IN32_HEAP_MAX_SI
c9c0: 5a 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ZE;.    }else if
c9d0: 28 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 3e  ( dwInitialSize>
c9e0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 29 7b  dwMaximumSize ){
c9f0: 0a 20 20 20 20 20 20 64 77 49 6e 69 74 69 61 6c  .      dwInitial
ca00: 53 69 7a 65 20 3d 20 64 77 4d 61 78 69 6d 75 6d  Size = dwMaximum
ca10: 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Size;.    }.    
ca20: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ca30: 61 70 20 3d 20 6f 73 48 65 61 70 43 72 65 61 74  ap = osHeapCreat
ca40: 65 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  e(SQLITE_WIN32_H
ca50: 45 41 50 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  EAP_FLAGS,.     
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 20   dwInitialSize, 
ca90: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b 0a  dwMaximumSize);.
caa0: 20 20 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d      if( !pWinMem
cab0: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
cac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
cad0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
cae0: 20 20 20 20 20 20 20 20 20 22 66 61 69 6c 65 64           "failed
caf0: 20 74 6f 20 48 65 61 70 43 72 65 61 74 65 20 28   to HeapCreate (
cb00: 25 6c 75 29 2c 20 66 6c 61 67 73 3d 25 75 2c 20  %lu), flags=%u, 
cb10: 69 6e 69 74 53 69 7a 65 3d 25 6c 75 2c 20 6d 61  initSize=%lu, ma
cb20: 78 53 69 7a 65 3d 25 6c 75 22 2c 0a 20 20 20 20  xSize=%lu",.    
cb30: 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45        osGetLastE
cb40: 72 72 6f 72 28 29 2c 20 53 51 4c 49 54 45 5f 57  rror(), SQLITE_W
cb50: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
cb60: 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65 2c 0a   dwInitialSize,.
cb70: 20 20 20 20 20 20 20 20 20 20 64 77 4d 61 78 69            dwMaxi
cb80: 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  mumSize);.      
cb90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
cba0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
cbb0: 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d      pWinMemData-
cbc0: 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45 3b 0a  >bOwned = TRUE;.
cbd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e      assert( pWin
cbe0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cbf0: 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 70  );.  }.#else.  p
cc00: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cc10: 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65 73 73  p = osGetProcess
cc20: 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20 21 70  Heap();.  if( !p
cc30: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
cc40: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
cc50: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
cc60: 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61 69 6c  M,.        "fail
cc70: 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65 73 73  ed to GetProcess
cc80: 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f 73 47  Heap (%lu)", osG
cc90: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 3b 0a  etLastError());.
cca0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ccb0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
ccc0: 7d 0a 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  }.  pWinMemData-
ccd0: 3e 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b  >bOwned = FALSE;
cce0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 57 69 6e  .  assert( !pWin
ccf0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
cd00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
cd10: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
cd20: 3e 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61  >hHeap!=0 );.  a
cd30: 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61  ssert( pWinMemDa
cd40: 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c  ta->hHeap!=INVAL
cd50: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
cd60: 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  );.#if !SQLITE_O
cd70: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
cd80: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
cd90: 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29  MALLOC_VALIDATE)
cda0: 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61  .  assert( osHea
cdb0: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
cdc0: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
cdd0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
cde0: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
cdf0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
ce00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
ce10: 0a 2a 2a 20 44 65 69 6e 69 74 69 61 6c 69 7a 65  .** Deinitialize
ce20: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f   this module..*/
ce30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
ce40: 4d 65 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64  MemShutdown(void
ce50: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
ce60: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
ce70: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
ce80: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
ce90: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
cea0: 44 61 74 61 20 29 20 72 65 74 75 72 6e 3b 0a 20  Data ) return;. 
ceb0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
cec0: 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49  Data->magic1==WI
ced0: 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20  NMEM_MAGIC1 );. 
cee0: 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d   assert( pWinMem
cef0: 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49  Data->magic2==WI
cf00: 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a  NMEM_MAGIC2 );..
cf10: 20 20 69 66 28 20 70 57 69 6e 4d 65 6d 44 61 74    if( pWinMemDat
cf20: 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20  a->hHeap ){.    
cf30: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
cf40: 61 74 61 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41  ata->hHeap!=INVA
cf50: 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
cf60: 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f   );.#if !SQLITE_
cf70: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
cf80: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
cf90: 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45  _MALLOC_VALIDATE
cfa0: 29 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 73  ).    assert( os
cfb0: 48 65 61 70 56 61 6c 69 64 61 74 65 28 70 57 69  HeapValidate(pWi
cfc0: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c  nMemData->hHeap,
cfd0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
cfe0: 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20  AP_FLAGS, NULL) 
cff0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  );.#endif.    if
d000: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62  ( pWinMemData->b
d010: 4f 77 6e 65 64 20 29 7b 0a 20 20 20 20 20 20 69  Owned ){.      i
d020: 66 28 20 21 6f 73 48 65 61 70 44 65 73 74 72 6f  f( !osHeapDestro
d030: 79 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  y(pWinMemData->h
d040: 48 65 61 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Heap) ){.       
d050: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
d060: 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c  ITE_NOMEM, "fail
d070: 65 64 20 74 6f 20 48 65 61 70 44 65 73 74 72 6f  ed to HeapDestro
d080: 79 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  y (%lu), heap=%p
d090: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
d0a0: 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
d0b0: 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29  Error(), (void*)
d0c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
d0d0: 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ap);.      }.   
d0e0: 20 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e     pWinMemData->
d0f0: 62 4f 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a  bOwned = FALSE;.
d100: 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65      }.    pWinMe
d110: 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e  mData->hHeap = N
d120: 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ULL;.  }.}../*.*
d130: 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * Populate the l
d140: 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20  ow-level memory 
d150: 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74  allocation funct
d160: 69 6f 6e 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a  ion pointers in.
d170: 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  ** sqlite3Global
d180: 43 6f 6e 66 69 67 2e 6d 20 77 69 74 68 20 70 6f  Config.m with po
d190: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 72 6f  inters to the ro
d1a0: 75 74 69 6e 65 73 20 69 6e 20 74 68 69 73 20 66  utines in this f
d1b0: 69 6c 65 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75  ile. The.** argu
d1c0: 6d 65 6e 74 73 20 73 70 65 63 69 66 79 20 74 68  ments specify th
d1d0: 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72  e block of memor
d1e0: 79 20 74 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a  y to manage..**.
d1f0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d200: 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  is only called b
d210: 79 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  y sqlite3_config
d220: 28 29 2c 20 61 6e 64 20 74 68 65 72 65 66 6f 72  (), and therefor
d230: 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 72 65 71 75  e.** is not requ
d240: 69 72 65 64 20 74 6f 20 62 65 20 74 68 72 65 61  ired to be threa
d250: 64 73 61 66 65 20 28 69 74 20 69 73 20 6e 6f 74  dsafe (it is not
d260: 29 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  )..*/.const sqli
d270: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
d280: 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69  *sqlite3MemGetWi
d290: 6e 33 32 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  n32(void){.  sta
d2a0: 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
d2b0: 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69  3_mem_methods wi
d2c0: 6e 4d 65 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a  nMemMethods = {.
d2d0: 20 20 20 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63      winMemMalloc
d2e0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 46 72 65 65  ,.    winMemFree
d2f0: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c  ,.    winMemReal
d300: 6c 6f 63 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  loc,.    winMemS
d310: 69 7a 65 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52  ize,.    winMemR
d320: 6f 75 6e 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d  oundup,.    winM
d330: 65 6d 49 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d  emInit,.    winM
d340: 65 6d 53 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20  emShutdown,.    
d350: 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20  &win_mem_data.  
d360: 7d 3b 0a 20 20 72 65 74 75 72 6e 20 26 77 69 6e  };.  return &win
d370: 4d 65 6d 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76  MemMethods;.}..v
d380: 6f 69 64 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  oid sqlite3MemSe
d390: 74 44 65 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a  tDefault(void){.
d3a0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67    sqlite3_config
d3b0: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d  (SQLITE_CONFIG_M
d3c0: 41 4c 4c 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65  ALLOC, sqlite3Me
d3d0: 6d 47 65 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a  mGetWin32());.}.
d3e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d3f0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f  _WIN32_MALLOC */
d400: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20  ../*.** Convert 
d410: 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20 74  a UTF-8 string t
d420: 6f 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  o Microsoft Unic
d430: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65  ode..**.** Space
d440: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74   to hold the ret
d450: 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20  urned string is 
d460: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
d470: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
d480: 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54 52  */.static LPWSTR
d490: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
d4a0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  e(const char *zT
d4b0: 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ext){.  int nCha
d4c0: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
d4d0: 65 54 65 78 74 3b 0a 0a 20 20 6e 43 68 61 72 20  eText;..  nChar 
d4e0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
d4f0: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
d500: 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e   0, zText, -1, N
d510: 55 4c 4c 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  ULL, 0);.  if( n
d520: 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Char==0 ){.    r
d530: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d540: 57 69 64 65 54 65 78 74 20 3d 20 73 71 6c 69 74  WideText = sqlit
d550: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43  e3MallocZero( nC
d560: 68 61 72 2a 73 69 7a 65 6f 66 28 57 43 48 41 52  har*sizeof(WCHAR
d570: 29 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65  ) );.  if( zWide
d580: 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Text==0 ){.    r
d590: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
d5a0: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
d5b0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
d5c0: 55 54 46 38 2c 20 30 2c 20 7a 54 65 78 74 2c 20  UTF8, 0, zText, 
d5d0: 2d 31 2c 20 7a 57 69 64 65 54 65 78 74 2c 0a 20  -1, zWideText,. 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d600: 43 68 61 72 29 3b 0a 20 20 69 66 28 20 6e 43 68  Char);.  if( nCh
d610: 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  ar==0 ){.    sql
d620: 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 54  ite3_free(zWideT
d630: 65 78 74 29 3b 0a 20 20 20 20 7a 57 69 64 65 54  ext);.    zWideT
d640: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
d650: 65 74 75 72 6e 20 7a 57 69 64 65 54 65 78 74 3b  eturn zWideText;
d660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d670: 74 20 61 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e  t a Microsoft Un
d680: 69 63 6f 64 65 20 73 74 72 69 6e 67 20 74 6f 20  icode string to 
d690: 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  UTF-8..**.** Spa
d6a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d6b0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d6c0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d6d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d6f0: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74   *winUnicodeToUt
d700: 66 38 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  f8(LPCWSTR zWide
d710: 54 65 78 74 29 7b 0a 20 20 69 6e 74 20 6e 42 79  Text){.  int nBy
d720: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  te;.  char *zTex
d730: 74 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  t;..  nByte = os
d740: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d750: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d760: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30  zWideText, -1, 0
d770: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d780: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d7a0: 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69  }.  zText = sqli
d7b0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d7c0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54  Byte );.  if( zT
d7d0: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d7e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
d7f0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d800: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d810: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d820: 74 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 20 6e 42  t, -1, zText, nB
d830: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
d840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d850: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
d860: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d870: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d880: 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54 65  (zText);.    zTe
d890: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  xt = 0;.  }.  re
d8a0: 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f  turn zText;.}../
d8b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20  *.** Convert an 
d8c0: 41 4e 53 49 20 73 74 72 69 6e 67 20 74 6f 20 4d  ANSI string to M
d8d0: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
d8e0: 2c 20 75 73 69 6e 67 20 74 68 65 20 41 4e 53 49  , using the ANSI
d8f0: 20 6f 72 20 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20   or OEM.** code 
d900: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  page..**.** Spac
d910: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d920: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d930: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d940: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d950: 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57 53 54  .*/.static LPWST
d960: 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f  R winMbcsToUnico
d970: 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  de(const char *z
d980: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
d990: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
d9a0: 0a 20 20 4c 50 57 53 54 52 20 7a 4d 62 63 73 54  .  LPWSTR zMbcsT
d9b0: 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70  ext;.  int codep
d9c0: 61 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20  age = useAnsi ? 
d9d0: 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43  CP_ACP : CP_OEMC
d9e0: 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73  P;..  nByte = os
d9f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
da00: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
da10: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c   zText, -1, NULL
da20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da40: 20 20 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41    0)*sizeof(WCHA
da50: 52 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d  R);.  if( nByte=
da60: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
da70: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 54   0;.  }.  zMbcsT
da80: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ext = sqlite3Mal
da90: 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
daa0: 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
dab0: 20 20 69 66 28 20 7a 4d 62 63 73 54 65 78 74 3d    if( zMbcsText=
dac0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
dad0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
dae0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
daf0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
db00: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
db10: 7a 4d 62 63 73 54 65 78 74 2c 0a 20 20 20 20 20  zMbcsText,.     
db20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
db30: 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65             nByte
db40: 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  );.  if( nByte==
db50: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
db60: 5f 66 72 65 65 28 7a 4d 62 63 73 54 65 78 74 29  _free(zMbcsText)
db70: 3b 0a 20 20 20 20 7a 4d 62 63 73 54 65 78 74 20  ;.    zMbcsText 
db80: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
db90: 6e 20 7a 4d 62 63 73 54 65 78 74 3b 0a 7d 0a 0a  n zMbcsText;.}..
dba0: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
dbb0: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
dbc0: 65 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  e string to a mu
dbd0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
dbe0: 65 72 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 75 73  er string,.** us
dbf0: 69 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20  ing the ANSI or 
dc00: 4f 45 4d 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a  OEM code page..*
dc10: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
dc20: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
dc30: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
dc40: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
dc50: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
dc60: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
dc70: 63 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53  codeToMbcs(LPCWS
dc80: 54 52 20 7a 57 69 64 65 54 65 78 74 2c 20 69 6e  TR zWideText, in
dc90: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
dca0: 74 20 6e 42 79 74 65 3b 0a 20 20 63 68 61 72 20  t nByte;.  char 
dcb0: 2a 7a 54 65 78 74 3b 0a 20 20 69 6e 74 20 63 6f  *zText;.  int co
dcc0: 64 65 70 61 67 65 20 3d 20 75 73 65 41 6e 73 69  depage = useAnsi
dcd0: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
dce0: 45 4d 43 50 3b 0a 0a 20 20 6e 42 79 74 65 20 3d  EMCP;..  nByte =
dcf0: 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   osWideCharToMul
dd00: 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65 2c  tiByte(codepage,
dd10: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
dd20: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  1, 0, 0, 0, 0);.
dd30: 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20 30    if( nByte == 0
dd40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
dd50: 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74 20 3d 20  ;.  }.  zText = 
dd60: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
dd70: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
dd80: 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
dd90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
dda0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
ddb0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
ddc0: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69  codepage, 0, zWi
ddd0: 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a 54 65 78  deText, -1, zTex
dde0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
ddf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de00: 20 20 20 6e 42 79 74 65 2c 20 30 2c 20 30 29 3b     nByte, 0, 0);
de10: 0a 20 20 69 66 28 20 6e 42 79 74 65 20 3d 3d 20  .  if( nByte == 
de20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
de30: 5f 66 72 65 65 28 7a 54 65 78 74 29 3b 0a 20 20  _free(zText);.  
de40: 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d    zText = 0;.  }
de50: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 3b  .  return zText;
de60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
de70: 74 20 61 20 6d 75 6c 74 69 2d 62 79 74 65 20 63  t a multi-byte c
de80: 68 61 72 61 63 74 65 72 20 73 74 72 69 6e 67 20  haracter string 
de90: 74 6f 20 55 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20  to UTF-8..**.** 
dea0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
deb0: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
dec0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
ded0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
dee0: 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  c()..*/.static c
def0: 68 61 72 20 2a 77 69 6e 4d 62 63 73 54 6f 55 74  har *winMbcsToUt
df00: 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  f8(const char *z
df10: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
df20: 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65 78  i){.  char *zTex
df30: 74 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52 20  tUtf8;.  LPWSTR 
df40: 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d  zTmpWide;..  zTm
df50: 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73 54  pWide = winMbcsT
df60: 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 2c 20  oUnicode(zText, 
df70: 75 73 65 41 6e 73 69 29 3b 0a 20 20 69 66 28 20  useAnsi);.  if( 
df80: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
df90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dfa0: 0a 20 20 7a 54 65 78 74 55 74 66 38 20 3d 20 77  .  zTextUtf8 = w
dfb0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
dfc0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
dfd0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
dfe0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54  de);.  return zT
dff0: 65 78 74 55 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a  extUtf8;.}../*.*
e000: 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d  * Convert a UTF-
e010: 38 20 73 74 72 69 6e 67 20 74 6f 20 61 20 6d 75  8 string to a mu
e020: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
e030: 65 72 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  er string..**.**
e040: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
e050: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
e060: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
e070: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
e080: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
e090: 63 68 61 72 20 2a 77 69 6e 55 74 66 38 54 6f 4d  char *winUtf8ToM
e0a0: 62 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bcs(const char *
e0b0: 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e  zText, int useAn
e0c0: 73 69 29 7b 0a 20 20 63 68 61 72 20 2a 7a 54 65  si){.  char *zTe
e0d0: 78 74 4d 62 63 73 3b 0a 20 20 4c 50 57 53 54 52  xtMbcs;.  LPWSTR
e0e0: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
e0f0: 6d 70 57 69 64 65 20 3d 20 77 69 6e 55 74 66 38  mpWide = winUtf8
e100: 54 6f 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29  ToUnicode(zText)
e110: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
e120: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
e130: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
e140: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
e150: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
e160: 2c 20 75 73 65 41 6e 73 69 29 3b 0a 20 20 73 71  , useAnsi);.  sq
e170: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
e180: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
e190: 54 65 78 74 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a  TextMbcs;.}../*.
e1a0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e1b0: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e1c0: 74 68 65 20 77 69 6e 55 74 66 38 54 6f 55 6e 69  the winUtf8ToUni
e1d0: 63 6f 64 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e  code() function.
e1e0: 0a 2a 2f 0a 4c 50 57 53 54 52 20 73 71 6c 69 74  .*/.LPWSTR sqlit
e1f0: 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
e200: 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63  _unicode(const c
e210: 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66  har *zText){.#if
e220: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e230: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
e240: 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20  ( !zText ){.    
e250: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
e260: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
e270: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  turn 0;.  }.#end
e280: 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
e290: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
e2a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e    if( sqlite3_in
e2b0: 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74  itialize() ) ret
e2c0: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  urn 0;.#endif.  
e2d0: 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f  return winUtf8To
e2e0: 55 6e 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a  Unicode(zText);.
e2f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e300: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e310: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 6e 69  r for the winUni
e320: 63 6f 64 65 54 6f 55 74 66 38 28 29 20 66 75 6e  codeToUtf8() fun
e330: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e340: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e  sqlite3_win32_un
e350: 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38 28 4c 50  icode_to_utf8(LP
e360: 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74 29  CWSTR zWideText)
e370: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e380: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e390: 0a 20 20 69 66 28 20 21 7a 57 69 64 65 54 65 78  .  if( !zWideTex
e3a0: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e3b0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e3c0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e3d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e3e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e3f0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e400: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e410: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e420: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e430: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
e440: 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 7d 0a 0a  (zWideText);.}..
e450: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
e460: 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66  public wrapper f
e470: 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54 6f  or the winMbcsTo
e480: 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e  Utf8() function.
e490: 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
e4a0: 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f  3_win32_mbcs_to_
e4b0: 75 74 66 38 28 63 6f 6e 73 74 20 63 68 61 72 20  utf8(const char 
e4c0: 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20  *zText){.#ifdef 
e4d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
e4e0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
e4f0: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
e500: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
e510: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
e520: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
e530: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
e540: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
e550: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
e560: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
e570: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
e580: 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  rn winMbcsToUtf8
e590: 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c  (zText, osAreFil
e5a0: 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a  eApisANSI());.}.
e5b0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
e5c0: 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72 20   public wrapper 
e5d0: 66 6f 72 20 74 68 65 20 77 69 6e 4d 62 63 73 54  for the winMbcsT
e5e0: 6f 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f 6e  oUtf8() function
e5f0: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
e600: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
e610: 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63  _utf8_v2(const c
e620: 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20  har *zText, int 
e630: 75 73 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66  useAnsi){.#ifdef
e640: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
e650: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
e660: 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f  zText ){.    (vo
e670: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
e680: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
e690: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
e6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e6b0: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
e6c0: 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  f( sqlite3_initi
e6d0: 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e  alize() ) return
e6e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   0;.#endif.  ret
e6f0: 75 72 6e 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  urn winMbcsToUtf
e700: 38 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69  8(zText, useAnsi
e710: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
e720: 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61   is a public wra
e730: 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e  pper for the win
e740: 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75 6e  Utf8ToMbcs() fun
e750: 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a  ction..*/.char *
e760: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
e770: 66 38 5f 74 6f 5f 6d 62 63 73 28 63 6f 6e 73 74  f8_to_mbcs(const
e780: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 23   char *zText){.#
e790: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e7a0: 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20  BLE_API_ARMOR.  
e7b0: 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20 20  if( !zText ){.  
e7c0: 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
e7d0: 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
e7e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
e7f0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c  ndif.#ifndef SQL
e800: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
e810: 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
e820: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72  initialize() ) r
e830: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
e840: 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66 38    return winUtf8
e850: 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 6f 73  ToMbcs(zText, os
e860: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
e870: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ));.}../*.** Thi
e880: 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77 72  s is a public wr
e890: 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77 69  apper for the wi
e8a0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 29 20 66 75  nUtf8ToMbcs() fu
e8b0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20  nction..*/.char 
e8c0: 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75  *sqlite3_win32_u
e8d0: 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63  tf8_to_mbcs_v2(c
e8e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
e8f0: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
e900: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
e910: 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
e920: 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a 20   if( !zText ){. 
e930: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
e940: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
e950: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
e960: 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51  endif.#ifndef SQ
e970: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
e980: 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  IT.  if( sqlite3
e990: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20  _initialize() ) 
e9a0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e9b0: 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55 74 66  .  return winUtf
e9c0: 38 54 6f 4d 62 63 73 28 7a 54 65 78 74 2c 20 75  8ToMbcs(zText, u
e9d0: 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  seAnsi);.}../*.*
e9e0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e9f0: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
ea00: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
ea10: 5f 64 69 72 65 63 74 6f 72 79 20 28 62 65 6c 6f  _directory (belo
ea20: 77 29 3b 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20  w); however,.** 
ea30: 69 74 20 61 63 63 65 70 74 73 20 61 20 55 54 46  it accepts a UTF
ea40: 2d 38 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69 6e  -8 string..*/.in
ea50: 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  t sqlite3_win32_
ea60: 73 65 74 5f 64 69 72 65 63 74 6f 72 79 38 28 0a  set_directory8(.
ea70: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
ea80: 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e 74 69 66  type, /* Identif
ea90: 69 65 72 20 66 6f 72 20 64 69 72 65 63 74 6f 72  ier for director
eaa0: 79 20 62 65 69 6e 67 20 73 65 74 20 6f 72 20 72  y being set or r
eab0: 65 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  eset */.  const 
eac0: 63 68 61 72 20 2a 7a 56 61 6c 75 65 20 20 2f 2a  char *zValue  /*
ead0: 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 64   New value for d
eae0: 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67 20 73  irectory being s
eaf0: 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f 0a 29  et or reset */.)
eb00: 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69 72  {.  char **ppDir
eb10: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66 6e  ectory = 0;.#ifn
eb20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eb30: 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20 72  AUTOINIT.  int r
eb40: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
eb50: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
eb60: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
eb70: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79 70  #endif.  if( typ
eb80: 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  e==SQLITE_WIN32_
eb90: 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f 54  DATA_DIRECTORY_T
eba0: 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69 72  YPE ){.    ppDir
ebb0: 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74 65  ectory = &sqlite
ebc0: 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
ebd0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74 79  ;.  }else if( ty
ebe0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
ebf0: 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f  _TEMP_DIRECTORY_
ec00: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
ec10: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
ec20: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
ec30: 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  y;.  }.  assert(
ec40: 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c   !ppDirectory ||
ec50: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
ec60: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
ec70: 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20 20  RY_TYPE.        
ec80: 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54    || type==SQLIT
ec90: 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52  E_WIN32_TEMP_DIR
eca0: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29 3b  ECTORY_TYPE.  );
ecb0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44 69  .  assert( !ppDi
ecc0: 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69 74  rectory || sqlit
ecd0: 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79 70  e3MemdebugHasTyp
ece0: 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c 20  e(*ppDirectory, 
ecf0: 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29 3b  MEMTYPE_HEAP) );
ed00: 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74 6f  .  if( ppDirecto
ed10: 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ry ){.    char *
ed20: 7a 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 69  zCopy = 0;.    i
ed30: 66 28 20 7a 56 61 6c 75 65 20 26 26 20 7a 56 61  f( zValue && zVa
ed40: 6c 75 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  lue[0] ){.      
ed50: 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 5f  zCopy = sqlite3_
ed60: 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 56  mprintf("%s", zV
ed70: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 69 66 20  alue);.      if 
ed80: 28 20 7a 43 6f 70 79 3d 3d 30 20 29 7b 0a 20 20  ( zCopy==0 ){.  
ed90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
eda0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
edb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
edc0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a    sqlite3_free(*
edd0: 70 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  ppDirectory);.  
ede0: 20 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d    *ppDirectory =
edf0: 20 7a 43 6f 70 79 3b 0a 20 20 20 20 72 65 74 75   zCopy;.    retu
ee00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
ee10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
ee20: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
ee30: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
ee40: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
ee50: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74  qlite3_win32_set
ee60: 5f 64 69 72 65 63 74 6f 72 79 20 28 62 65 6c 6f  _directory (belo
ee70: 77 29 3b 20 68 6f 77 65 76 65 72 2c 0a 2a 2a 20  w); however,.** 
ee80: 69 74 20 61 63 63 65 70 74 73 20 61 20 55 54 46  it accepts a UTF
ee90: 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 69  -16 string..*/.i
eea0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
eeb0: 5f 73 65 74 5f 64 69 72 65 63 74 6f 72 79 31 36  _set_directory16
eec0: 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  (.  unsigned lon
eed0: 67 20 74 79 70 65 2c 20 2f 2a 20 49 64 65 6e 74  g type, /* Ident
eee0: 69 66 69 65 72 20 66 6f 72 20 64 69 72 65 63 74  ifier for direct
eef0: 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20 6f 72  ory being set or
ef00: 20 72 65 73 65 74 20 2a 2f 0a 20 20 63 6f 6e 73   reset */.  cons
ef10: 74 20 76 6f 69 64 20 2a 7a 56 61 6c 75 65 20 20  t void *zValue  
ef20: 2f 2a 20 4e 65 77 20 76 61 6c 75 65 20 66 6f 72  /* New value for
ef30: 20 64 69 72 65 63 74 6f 72 79 20 62 65 69 6e 67   directory being
ef40: 20 73 65 74 20 6f 72 20 72 65 73 65 74 20 2a 2f   set or reset */
ef50: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
ef60: 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 30 3b  char *zUtf8 = 0;
ef70: 0a 20 20 69 66 28 20 7a 56 61 6c 75 65 20 29 7b  .  if( zValue ){
ef80: 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c  .    zUtf8 = sql
ef90: 69 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f  ite3_win32_unico
efa0: 64 65 5f 74 6f 5f 75 74 66 38 28 7a 56 61 6c 75  de_to_utf8(zValu
efb0: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66  e);.    if( zUtf
efc0: 38 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  8==0 ) return SQ
efd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
efe0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
eff0: 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69  te3_win32_set_di
f000: 72 65 63 74 6f 72 79 38 28 74 79 70 65 2c 20 7a  rectory8(type, z
f010: 55 74 66 38 29 3b 0a 20 20 69 66 28 20 7a 55 74  Utf8);.  if( zUt
f020: 66 38 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65  f8 ) sqlite3_fre
f030: 65 28 7a 55 74 66 38 29 3b 0a 20 20 72 65 74 75  e(zUtf8);.  retu
f040: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
f050: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  This function se
f060: 74 73 20 74 68 65 20 64 61 74 61 20 64 69 72 65  ts the data dire
f070: 63 74 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d  ctory or the tem
f080: 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79  porary directory
f090: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65   based on.** the
f0a0: 20 70 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65   provided argume
f0b0: 6e 74 73 2e 20 20 54 68 65 20 74 79 70 65 20 61  nts.  The type a
f0c0: 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
f0d0: 31 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  1 in order to se
f0e0: 74 20 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69  t the.** data di
f0f0: 72 65 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20  rectory or 2 in 
f100: 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65  order to set the
f110: 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
f120: 74 6f 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75  tory.  The zValu
f130: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73  e.** argument is
f140: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f150: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73   directory to us
f160: 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  e.  The return v
f170: 61 6c 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  alue will be.** 
f180: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
f190: 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20  cessful..*/.int 
f1a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
f1b0: 74 5f 64 69 72 65 63 74 6f 72 79 28 0a 20 20 75  t_directory(.  u
f1c0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 74 79 70  nsigned long typ
f1d0: 65 2c 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72  e, /* Identifier
f1e0: 20 66 6f 72 20 64 69 72 65 63 74 6f 72 79 20 62   for directory b
f1f0: 65 69 6e 67 20 73 65 74 20 6f 72 20 72 65 73 65  eing set or rese
f200: 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 7a 56 61  t */.  void *zVa
f210: 6c 75 65 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  lue        /* Ne
f220: 77 20 76 61 6c 75 65 20 66 6f 72 20 64 69 72 65  w value for dire
f230: 63 74 6f 72 79 20 62 65 69 6e 67 20 73 65 74 20  ctory being set 
f240: 6f 72 20 72 65 73 65 74 20 2a 2f 0a 29 7b 0a 20  or reset */.){. 
f250: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
f260: 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65 63 74  win32_set_direct
f270: 6f 72 79 31 36 28 74 79 70 65 2c 20 7a 56 61 6c  ory16(type, zVal
f280: 75 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ue);.}../*.** Th
f290: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
f2a0: 66 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f  f winGetLastErro
f2b0: 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  rMsg.** is zero 
f2c0: 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  if the error mes
f2d0: 73 61 67 65 20 66 69 74 73 20 69 6e 20 74 68 65  sage fits in the
f2e0: 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d   buffer, or non-
f2f0: 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73  zero.** otherwis
f300: 65 20 28 69 66 20 74 68 65 20 6d 65 73 73 61 67  e (if the messag
f310: 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 29  e was truncated)
f320: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f330: 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
f340: 73 67 28 44 57 4f 52 44 20 6c 61 73 74 45 72 72  sg(DWORD lastErr
f350: 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  no, int nBuf, ch
f360: 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20  ar *zBuf){.  /* 
f370: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 72 65  FormatMessage re
f380: 74 75 72 6e 73 20 30 20 6f 6e 20 66 61 69 6c 75  turns 0 on failu
f390: 72 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 69  re.  Otherwise i
f3a0: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 74  t.  ** returns t
f3b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 54 43 48  he number of TCH
f3c0: 41 52 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ARs written to t
f3d0: 68 65 20 6f 75 74 70 75 74 0a 20 20 2a 2a 20 62  he output.  ** b
f3e0: 75 66 66 65 72 2c 20 65 78 63 6c 75 64 69 6e 67  uffer, excluding
f3f0: 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6e 67   the terminating
f400: 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20 20 2a 2f   null char..  */
f410: 0a 20 20 44 57 4f 52 44 20 64 77 4c 65 6e 20 3d  .  DWORD dwLen =
f420: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74   0;.  char *zOut
f430: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 73 49   = 0;..  if( osI
f440: 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
f450: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
f460: 20 57 43 48 41 52 20 7a 54 65 6d 70 57 69 64 65   WCHAR zTempWide
f470: 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  [SQLITE_WIN32_MA
f480: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2b 31  X_ERRMSG_CHARS+1
f490: 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  ];.    dwLen = o
f4a0: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
f4b0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46  FORMAT_MESSAGE_F
f4c0: 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20  ROM_SYSTEM |.   
f4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f4e0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
f4f0: 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f  _MESSAGE_IGNORE_
f500: 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20  INSERTS,.       
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20        NULL,.    
f530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f540: 20 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72           lastErr
f550: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f570: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f590: 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20 20   zTempWide,.    
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5b0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
f5c0: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
f5d0: 5f 43 48 41 52 53 2c 0a 20 20 20 20 20 20 20 20  _CHARS,.        
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 20 20 20 20 30 29 3b 0a 23 65 6c 73 65 0a 20       0);.#else. 
f600: 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 57     LPWSTR zTempW
f610: 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ide = NULL;.    
f620: 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74  dwLen = osFormat
f630: 4d 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f  MessageW(FORMAT_
f640: 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45  MESSAGE_ALLOCATE
f650: 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20  _BUFFER |.      
f660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f670: 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45         FORMAT_ME
f680: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
f690: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
f6c0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
f6f0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 20 20 20 20 20 20 28 4c 50 57 53 54 52 29          (LPWSTR)
f760: 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a 20 20 20   &zTempWide,.   
f770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f780: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65            0);.#e
f7b0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 64 77 4c  ndif.    if( dwL
f7c0: 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20  en > 0 ){.      
f7d0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75  /* allocate a bu
f7e0: 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74  ffer and convert
f7f0: 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20   to UTF8 */.    
f800: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
f810: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f820: 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 55 6e      zOut = winUn
f830: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 65 6d  icodeToUtf8(zTem
f840: 70 57 69 64 65 29 3b 0a 20 20 20 20 20 20 73 71  pWide);.      sq
f850: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
f860: 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21 53 51 4c  lloc();.#if !SQL
f870: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
f880: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
f890: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
f8a0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
f8b0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
f8c0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
f8d0: 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64 69 66 0a  mpWide);.#endif.
f8e0: 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66      }.  }.#ifdef
f8f0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
f900: 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
f910: 20 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 20 3d     char *zTemp =
f920: 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e   NULL;.    dwLen
f930: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
f940: 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geA(FORMAT_MESSA
f950: 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46  GE_ALLOCATE_BUFF
f960: 45 52 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ER |.           
f970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f980: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
f990: 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20  _FROM_SYSTEM |. 
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d              FORM
f9c0: 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52  AT_MESSAGE_IGNOR
f9d0: 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20 20  E_INSERTS,.     
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9f0: 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20          NULL,.  
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa10: 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74 45             lastE
fa20: 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa60: 20 20 20 28 4c 50 53 54 52 29 20 26 7a 54 65 6d     (LPSTR) &zTem
fa70: 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
fa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa90: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 30 29 3b 0a 20 20 20 20 69 66 28 20 64 77 4c 65  0);.    if( dwLe
fac0: 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20 20 20 2f  n > 0 ){.      /
fad0: 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20 62 75 66  * allocate a buf
fae0: 66 65 72 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  fer and convert 
faf0: 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20 20 20 20  to UTF8 */.     
fb00: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
fb10: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
fb20: 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63     zOut = winMbc
fb30: 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f  sToUtf8(zTemp, o
fb40: 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
fb50: 28 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ());.      sqlit
fb60: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
fb70: 63 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72  c();.      /* fr
fb80: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
fb90: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
fba0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
fbb0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
fbc0: 46 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Free(zTemp);.   
fbd0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
fbe0: 69 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29  if( 0 == dwLen )
fbf0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
fc00: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
fc10: 66 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c  f, "OsError 0x%l
fc20: 78 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72  x (%lu)", lastEr
fc30: 72 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b  rno, lastErrno);
fc40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
fc50: 20 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20   copy a maximum 
fc60: 6f 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f  of nBuf chars to
fc70: 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   output buffer *
fc80: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
fc90: 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75  printf(nBuf, zBu
fca0: 66 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  f, "%s", zOut);.
fcb0: 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20      /* free the 
fcc0: 55 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20  UTF8 buffer */. 
fcd0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
fce0: 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  zOut);.  }.  ret
fcf0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  urn 0;.}../*.**.
fd00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
fd10: 20 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74   - winLogErrorAt
fd20: 4c 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79  Line() - is only
fd30: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
fd40: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69   the macro.** wi
fd50: 6e 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a  nLogError()..**.
fd60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
fd70: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
fd80: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
fd90: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
fda0: 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61  on..** It logs a
fdb0: 20 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73   message using s
fdc0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e  qlite3_log() con
fdd0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72  taining the curr
fde0: 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  ent value of.** 
fdf0: 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20  error code and, 
fe00: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
fe10: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
fe20: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 0a  equivalent from.
fe30: 2a 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  ** FormatMessage
fe40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
fe50: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
fe60: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
fe70: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
fe80: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
fe90: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
fea0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
feb0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
fec0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
fed0: 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20 74  TOPEN)..** The t
fee0: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
fef0: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
ff00: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
ff10: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
ff20: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64  at.** failed and
ff30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
ff40: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
ff50: 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65  , if any..*/.#de
ff60: 66 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72  fine winLogError
ff70: 28 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c  (a,b,c,d)   winL
ff80: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c  ogErrorAtLine(a,
ff90: 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a  b,c,d,__LINE__).
ffa0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f  static int winLo
ffb0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20  gErrorAtLine(.  
ffc0: 69 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20  int errcode,    
ffd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffe0: 2f 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  /* SQLite error 
fff0: 63 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20  code */.  DWORD 
10000 6c 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20  lastErrno,      
10010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
10020 33 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f  32 last error */
10030 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10040 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
10050 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
10060 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
10070 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
10080 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
10090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
100a0 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
100b0 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
100c0 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
100f0 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
10100 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
10110 0a 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b  .){.  char zMsg[
10120 35 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20  500];           
10130 20 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72        /* Human r
10140 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65  eadable error te
10150 78 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  xt */.  int i;  
10160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10170 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
10180 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d  counter */..  zM
10190 73 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e  sg[0] = 0;.  win
101a0 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28  GetLastErrorMsg(
101b0 6c 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f  lastErrno, sizeo
101c0 66 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a  f(zMsg), zMsg);.
101d0 20 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64    assert( errcod
101e0 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e!=SQLITE_OK );.
101f0 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29    if( zPath==0 )
10200 20 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66   zPath = "";.  f
10210 6f 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20  or(i=0; zMsg[i] 
10220 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27  && zMsg[i]!='\r'
10230 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e   && zMsg[i]!='\n
10240 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67  '; i++){}.  zMsg
10250 5b 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  [i] = 0;.  sqlit
10260 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a  e3_log(errcode,.
10270 20 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a        "os_win.c:
10280 25 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29  %d: (%lu) %s(%s)
10290 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c   - %s",.      iL
102a0 69 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ine, lastErrno, 
102b0 7a 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d  zFunc, zPath, zM
102c0 73 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72  sg.  );..  retur
102d0 6e 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a  n errcode;.}../*
102e0 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  .** The number o
102f0 66 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52  f times that a R
10300 65 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65  eadFile(), Write
10310 46 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65  File(), and Dele
10320 74 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c  teFile().** will
10330 20 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c   be retried foll
10340 6f 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20  owing a locking 
10350 65 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79  error - probably
10360 20 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61 6e   caused by.** an
10370 74 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65  tivirus software
10380 2e 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74  .  Also the init
10390 69 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65  ial delay before
103a0 20 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79   the first retry
103b0 2e 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69  ..** The delay i
103c0 6e 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c  ncreases linearl
103d0 79 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72  y with each retr
103e0 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y..*/.#ifndef SQ
103f0 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
10400 5f 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20  _RETRY.# define 
10410 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
10420 52 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64  RR_RETRY 10.#end
10430 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
10440 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
10450 54 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69  TRY_DELAY.# defi
10460 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
10470 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
10480 59 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74  Y 25.#endif.stat
10490 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
104a0 65 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49  etry = SQLITE_WI
104b0 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b  N32_IOERR_RETRY;
104c0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
104d0 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
104e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f   SQLITE_WIN32_IO
104f0 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b  ERR_RETRY_DELAY;
10500 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e  ../*.** The "win
10510 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
10520 6d 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f  macro is used to
10530 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20   determine if a 
10540 70 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a  particular I/O.*
10550 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74  * error code obt
10560 61 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73  ained via GetLas
10570 74 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67  tError() is elig
10580 69 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69  ible to be retri
10590 65 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20  ed.  It.** must 
105a0 61 63 63 65 70 74 20 74 68 65 20 65 72 72 6f 72  accept the error
105b0 20 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69   code DWORD as i
105c0 74 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  ts only argument
105d0 20 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75   and should retu
105e0 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  rn.** non-zero i
105f0 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
10600 20 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e   is transient in
10610 20 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65 20   nature and the 
10620 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73  operation.** res
10630 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e  ponsible for gen
10640 65 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67  erating the orig
10650 69 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74  inal error might
10660 20 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65   succeed upon be
10670 69 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  ing.** retried. 
10680 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   The argument to
10690 20 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75   this macro shou
106a0 6c 64 20 62 65 20 61 20 76 61 72 69 61 62 6c 65  ld be a variable
106b0 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ..**.** Addition
106c0 61 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61  ally, a macro na
106d0 6d 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  med "winIoerrCan
106e0 52 65 74 72 79 32 22 20 6d 61 79 20 62 65 20 64  Retry2" may be d
106f0 65 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a  efined.  If it.*
10700 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74  * is defined, it
10710 20 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74   will be consult
10720 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65  ed only when the
10730 20 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72   macro "winIoerr
10740 43 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65  CanRetry1".** re
10750 74 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65  turns zero.  The
10760 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
10770 72 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f  ry2" macro is co
10780 6d 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61  mpletely optiona
10790 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20  l and.** may be 
107a0 75 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20  used to include 
107b0 61 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72  additional error
107c0 20 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65   codes in the se
107d0 74 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  t that should.**
107e0 20 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66   result in the f
107f0 61 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61  ailing I/O opera
10800 74 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69  tion being retri
10810 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
10820 2e 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64  .  If.** defined
10830 2c 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43  , the "winIoerrC
10840 61 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20  anRetry2" macro 
10850 6d 75 73 74 20 65 78 68 69 62 69 74 20 65 78 74  must exhibit ext
10860 65 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a  ernal semantics.
10870 2a 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20  ** identical to 
10880 74 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69  those of the "wi
10890 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22  nIoerrCanRetry1"
108a0 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21   macro..*/.#if !
108b0 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72  defined(winIoerr
108c0 43 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69  CanRetry1).#defi
108d0 6e 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ne winIoerrCanRe
108e0 74 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45  try1(a) (((a)==E
108f0 52 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49  RROR_ACCESS_DENI
10900 45 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a  ED)        || \.
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
10930 61 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e  a)==ERROR_SHARIN
10940 47 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20  G_VIOLATION)    
10950 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
10960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10970 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c     ((a)==ERROR_L
10980 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20  OCK_VIOLATION)  
10990 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
109a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109b0 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
109c0 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53  ROR_DEV_NOT_EXIS
109d0 54 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  T)        || \. 
109e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
109f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
10a00 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45  )==ERROR_NETNAME
10a10 5f 44 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c  _DELETED)      |
10a20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
10a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a40 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45    ((a)==ERROR_SE
10a50 4d 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20  M_TIMEOUT)      
10a60 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
10a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a80 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
10a90 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41  OR_NETWORK_UNREA
10aa0 43 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a  CHABLE)).#endif.
10ab0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64  ./*.** If a Read
10ac0 46 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46  File() or WriteF
10ad0 69 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75  ile() error occu
10ae0 72 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  rs, invoke this 
10af0 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65  routine.** to se
10b00 65 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62  e if it should b
10b10 65 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75  e retried.  Retu
10b20 72 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79  rn TRUE to retry
10b30 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
10b40 2a 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69  ** to give up wi
10b50 74 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  th an error..*/.
10b60 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65  static int winRe
10b70 74 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e  tryIoerr(int *pn
10b80 52 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45  Retry, DWORD *pE
10b90 72 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65  rror){.  DWORD e
10ba0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10bb0 72 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65  r();.  if( *pnRe
10bc0 74 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74  try>=winIoerrRet
10bd0 72 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45  ry ){.    if( pE
10be0 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70  rror ){.      *p
10bf0 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d  Error = e;.    }
10c00 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
10c10 20 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72   }.  if( winIoer
10c20 72 43 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b  rCanRetry1(e) ){
10c30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  .    sqlite3_win
10c40 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72  32_sleep(winIoer
10c50 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a  rRetryDelay*(1+*
10c60 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b  pnRetry));.    +
10c70 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72  +*pnRetry;.    r
10c80 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66  eturn 1;.  }.#if
10c90 20 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72   defined(winIoer
10ca0 72 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c  rCanRetry2).  el
10cb0 73 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43  se if( winIoerrC
10cc0 61 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20  anRetry2(e) ){. 
10cd0 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32     sqlite3_win32
10ce0 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52  _sleep(winIoerrR
10cf0 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e  etryDelay*(1+*pn
10d00 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a  Retry));.    ++*
10d10 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74  pnRetry;.    ret
10d20 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 1;.  }.#endi
10d30 66 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29  f.  if( pError )
10d40 7b 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20  {.    *pError = 
10d50 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
10d60 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20  0;.}../*.** Log 
10d70 61 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72  a I/O error retr
10d80 79 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74  y episode..*/.st
10d90 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67  atic void winLog
10da0 49 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79  Ioerr(int nRetry
10db0 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  , int lineno){. 
10dc0 20 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20   if( nRetry ){. 
10dd0 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10de0 51 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20 20  QLITE_NOTICE,.  
10df0 20 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d      "delayed %dm
10e00 73 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69  s for lock/shari
10e10 6e 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20 6c  ng conflict at l
10e20 69 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20 77  ine %d",.      w
10e30 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10e40 79 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79  y*nRetry*(nRetry
10e50 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20  +1)/2, lineno.  
10e60 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a    );.  }.}../*.*
10e70 2a 20 54 68 69 73 20 23 69 66 20 64 6f 65 73 20  * This #if does 
10e80 6e 6f 74 20 72 65 6c 79 20 6f 6e 20 74 68 65 20  not rely on the 
10e90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
10ea0 64 65 66 69 6e 65 20 62 65 63 61 75 73 65 20 74  define because t
10eb0 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
10ec0 69 6e 67 20 73 65 63 74 69 6f 6e 20 69 6e 20 22  ing section in "
10ed0 64 61 74 65 2e 63 22 20 63 61 6e 6e 6f 74 20 75  date.c" cannot u
10ee0 73 65 20 69 74 2e 0a 2a 2f 0a 23 69 66 20 21 64  se it..*/.#if !d
10ef0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
10f00 49 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26 26  IT_LOCALTIME) &&
10f10 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
10f20 57 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28 21  WCE) && \.    (!
10f30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
10f40 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
10f50 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
10f60 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
10f70 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43  )./*.** The MSVC
10f80 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20   CRT on Windows 
10f90 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  CE may not have 
10fa0 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75  a localtime() fu
10fb0 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53 6f 20 64 65  nction..** So de
10fc0 66 69 6e 65 20 61 20 73 75 62 73 74 69 74 75 74  fine a substitut
10fd0 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63 6c 75 64 65  e..*/.#  include
10fe0 20 3c 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74   <time.h>.struct
10ff0 20 74 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63   tm *__cdecl loc
11000 61 6c 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d  altime(const tim
11010 65 5f 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74  e_t *t).{.  stat
11020 69 63 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a  ic struct tm y;.
11030 20 20 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20    FILETIME uTm, 
11040 6c 54 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d  lTm;.  SYSTEMTIM
11050 45 20 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33  E pTm;.  sqlite3
11060 5f 69 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36  _int64 t64;.  t6
11070 34 20 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20  4 = *t;.  t64 = 
11080 28 74 36 34 20 2b 20 31 31 36 34 34 34 37 33 36  (t64 + 116444736
11090 30 30 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20  00)*10000000;.  
110a0 75 54 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d  uTm.dwLowDateTim
110b0 65 20 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20  e = (DWORD)(t64 
110c0 26 20 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20  & 0xFFFFFFFF);. 
110d0 20 75 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54   uTm.dwHighDateT
110e0 69 6d 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34  ime= (DWORD)(t64
110f0 20 3e 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c   >> 32);.  osFil
11100 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65  eTimeToLocalFile
11110 54 69 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b  Time(&uTm,&lTm);
11120 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53  .  osFileTimeToS
11130 79 73 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26  ystemTime(&lTm,&
11140 70 54 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61  pTm);.  y.tm_yea
11150 72 20 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20  r = pTm.wYear - 
11160 31 39 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e  1900;.  y.tm_mon
11170 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20   = pTm.wMonth - 
11180 31 3b 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d  1;.  y.tm_wday =
11190 20 70 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b   pTm.wDayOfWeek;
111a0 0a 20 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70  .  y.tm_mday = p
111b0 54 6d 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f  Tm.wDay;.  y.tm_
111c0 68 6f 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72  hour = pTm.wHour
111d0 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70  ;.  y.tm_min = p
111e0 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e  Tm.wMinute;.  y.
111f0 74 6d 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65  tm_sec = pTm.wSe
11200 63 6f 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26  cond;.  return &
11210 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
11220 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
11230 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
11240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
11280 68 69 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74  his section cont
11290 61 69 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69  ains code for Wi
112a0 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 64 65  nCE only..*/.#de
112b0 66 69 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57  fine HANDLE_TO_W
112c0 49 4e 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69  INFILE(a) (winFi
112d0 6c 65 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b  le*)&((char*)a)[
112e0 2d 28 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77  -(int)offsetof(w
112f0 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a  inFile,h)]../*.*
11300 2a 20 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b  * Acquire a lock
11310 20 6f 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68   on the handle h
11320 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11330 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72  winceMutexAcquir
11340 65 28 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20  e(HANDLE h){.   
11350 44 57 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20  DWORD dwErr;.   
11360 64 6f 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20  do {.     dwErr 
11370 3d 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  = osWaitForSingl
11380 65 4f 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e  eObject(h, INFIN
11390 49 54 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65  ITE);.   } while
113a0 20 28 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f   (dwErr != WAIT_
113b0 4f 42 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72  OBJECT_0 && dwEr
113c0 72 20 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f  r != WAIT_ABANDO
113d0 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  NED);.}./*.** Re
113e0 6c 65 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71  lease a lock acq
113f0 75 69 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75  uired by winceMu
11400 74 65 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a  texAcquire().*/.
11410 23 64 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74  #define winceMut
11420 65 78 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c  exRelease(h) Rel
11430 65 61 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a  easeMutex(h)../*
11440 0a 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d  .** Create the m
11450 75 74 65 78 20 61 6e 64 20 73 68 61 72 65 64 20  utex and shared 
11460 6d 65 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20  memory used for 
11470 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66  locking in the f
11480 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
11490 72 20 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69  r pFile.*/.stati
114a0 63 20 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74  c int winceCreat
114b0 65 4c 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72  eLock(const char
114c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e   *zFilename, win
114d0 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
114e0 4c 50 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c  LPWSTR zTok;.  L
114f0 50 57 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44  PWSTR zName;.  D
11500 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
11510 20 20 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d    BOOL bLogged =
11520 20 46 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62   FALSE;.  BOOL b
11530 49 6e 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20  Init = TRUE;..  
11540 7a 4e 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54  zName = winUtf8T
11550 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
11560 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  me);.  if( zName
11570 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75  ==0 ){.    /* ou
11580 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
11590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
115a0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
115b0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  T;.  }..  /* Ini
115c0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61  tialize the loca
115d0 6c 20 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20  l lockdata */.  
115e0 6d 65 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c  memset(&pFile->l
115f0 6f 63 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ocal, 0, sizeof(
11600 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a  pFile->local));.
11610 0a 20 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68  .  /* Replace th
11620 65 20 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72  e backslashes fr
11630 6f 6d 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  om the filename 
11640 61 6e 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74  and lowercase it
11650 0a 20 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20  .  ** to derive 
11660 61 20 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f  a mutex name. */
11670 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72  .  zTok = osChar
11680 4c 6f 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20  LowerW(zName);. 
11690 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f   for (;*zTok;zTo
116a0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a  k++){.    if (*z
116b0 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54  Tok == '\\') *zT
116c0 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20  ok = '_';.  }.. 
116d0 20 2f 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20   /* Create/open 
116e0 74 68 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20  the named mutex 
116f0 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  */.  pFile->hMut
11700 65 78 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74  ex = osCreateMut
11710 65 78 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c  exW(NULL, FALSE,
11720 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21   zName);.  if (!
11730 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a  pFile->hMutex){.
11740 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
11750 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
11760 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c  Error();.    sql
11770 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29  ite3_free(zName)
11780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
11790 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
117a0 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61  IOERR, pFile->la
117b0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
117c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
117d0 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b  "winceCreateLock
117e0 31 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  1", zFilename);.
117f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
11800 65 20 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f  e the mutex befo
11810 72 65 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f  re continuing */
11820 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
11830 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
11840 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65  ex);..  /* Since
11850 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61   the names of na
11860 6d 65 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d  med mutexes, sem
11870 61 70 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61  aphores, file ma
11880 70 70 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20  ppings etc are. 
11890 20 2a 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69   ** case-sensiti
118a0 76 65 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ve, take advanta
118b0 67 65 20 6f 66 20 74 68 61 74 20 62 79 20 75 70  ge of that by up
118c0 70 65 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75  percasing the mu
118d0 74 65 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  tex name.  ** an
118e0 64 20 75 73 69 6e 67 20 74 68 61 74 20 61 73 20  d using that as 
118f0 74 68 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d  the shared filem
11900 61 70 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a  apping name..  *
11910 2f 0a 20 20 6f 73 43 68 61 72 55 70 70 65 72 57  /.  osCharUpperW
11920 28 7a 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65  (zName);.  pFile
11930 2d 3e 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72  ->hShared = osCr
11940 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
11950 28 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  (INVALID_HANDLE_
11960 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20  VALUE, NULL,.   
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11990 20 20 20 20 20 50 41 47 45 5f 52 45 41 44 57 52       PAGE_READWR
119a0 49 54 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ITE, 0, sizeof(w
119b0 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  inceLock),.     
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119e0 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a     zName);..  /*
119f0 20 53 65 74 20 61 20 66 6c 61 67 20 74 68 61 74   Set a flag that
11a00 20 69 6e 64 69 63 61 74 65 73 20 77 65 27 72 65   indicates we're
11a10 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 63 72   the first to cr
11a20 65 61 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  eate the memory 
11a30 73 6f 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20  so it.  ** must 
11a40 62 65 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69  be zero-initiali
11a50 7a 65 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72  zed */.  lastErr
11a60 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
11a70 72 6f 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73  ror();.  if (las
11a80 74 45 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f  tErrno == ERROR_
11a90 41 4c 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b  ALREADY_EXISTS){
11aa0 0a 20 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c  .    bInit = FAL
11ab0 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
11ac0 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
11ad0 0a 20 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63  .  /* If we succ
11ae0 65 65 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20  eeded in making 
11af0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
11b00 79 20 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74  y handle, map it
11b10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  . */.  if( pFile
11b20 2d 3e 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20  ->hShared ){.   
11b30 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d   pFile->shared =
11b40 20 28 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d   (winceLock*)osM
11b50 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
11b60 6c 65 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20  le->hShared,.   
11b70 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d            FILE_M
11b80 41 50 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50  AP_READ|FILE_MAP
11b90 5f 57 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69  _WRITE, 0, 0, si
11ba0 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
11bb0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70  ;.    /* If mapp
11bc0 69 6e 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73  ing failed, clos
11bd0 65 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  e the shared mem
11be0 6f 72 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65  ory handle and e
11bf0 72 61 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  rase it */.    i
11c00 66 28 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65  f( !pFile->share
11c10 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  d ){.      pFile
11c20 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ->lastErrno = os
11c30 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
11c40 20 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f        winLogErro
11c50 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  r(SQLITE_IOERR, 
11c60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
11c70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11c80 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
11c90 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock2", zFilenam
11ca0 65 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65  e);.      bLogge
11cb0 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
11cc0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
11cd0 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20  ile->hShared);. 
11ce0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61       pFile->hSha
11cf0 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  red = NULL;.    
11d00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73  }.  }..  /* If s
11d10 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75  hared memory cou
11d20 6c 64 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65  ld not be create
11d30 64 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68  d, then close th
11d40 65 20 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c  e mutex and fail
11d50 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
11d60 3e 68 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29  >hShared==NULL )
11d70 7b 0a 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67  {.    if( !bLogg
11d80 65 64 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed ){.      pFil
11d90 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
11da0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
11db0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
11dc0 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d  TE_IOERR, pFile-
11dd0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
11de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
11df0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22  inceCreateLock3"
11e00 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
11e10 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52      bLogged = TR
11e20 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69  UE;.    }.    wi
11e30 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
11e40 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11e50 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
11e60 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
11e70 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75  ;.    pFile->hMu
11e80 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tex = NULL;.    
11e90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11ea0 45 52 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ERR;.  }..  /* I
11eb0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68  nitialize the sh
11ec0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77  ared memory if w
11ed0 65 27 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f  e're supposed to
11ee0 20 2a 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20   */.  if( bInit 
11ef0 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46  ){.    memset(pF
11f00 69 6c 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20  ile->shared, 0, 
11f10 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b  sizeof(winceLock
11f20 29 29 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65  ));.  }..  wince
11f30 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69  MutexRelease(pFi
11f40 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72  le->hMutex);.  r
11f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f  .}../*.** Destro
11f70 79 20 74 68 65 20 70 61 72 74 20 6f 66 20 77 69  y the part of wi
11f80 6e 46 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73  nFile that deals
11f90 20 77 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b   with wince lock
11fa0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
11fb0 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63   winceDestroyLoc
11fc0 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  k(winFile *pFile
11fd0 29 7b 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  ){.  if (pFile->
11fe0 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20  hMutex){.    /* 
11ff0 41 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65  Acquire the mute
12000 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75  x */.    winceMu
12010 74 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65  texAcquire(pFile
12020 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20  ->hMutex);..    
12030 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
12040 20 62 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70   blocks should p
12050 72 6f 62 61 62 6c 79 20 61 73 73 65 72 74 20 69  robably assert i
12060 6e 20 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75  n debug mode, bu
12070 74 20 74 68 65 79 0a 20 20 20 20 20 20 20 61 72  t they.       ar
12080 65 20 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20  e to cleanup in 
12090 63 61 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72  case any locks r
120a0 65 6d 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a  emained open */.
120b0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
120c0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
120d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
120e0 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d  red->nReaders --
120f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12100 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65  pFile->local.bRe
12110 73 65 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70  served){.      p
12120 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12130 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b  eserved = FALSE;
12140 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70  .    }.    if (p
12150 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
12160 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69  ding){.      pFi
12170 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e  le->shared->bPen
12180 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20  ding = FALSE;.  
12190 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c    }.    if (pFil
121a0 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73  e->local.bExclus
121b0 69 76 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ive){.      pFil
121c0 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
121d0 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20  usive = FALSE;. 
121e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d     }..    /* De-
121f0 72 65 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c  reference and cl
12200 6f 73 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20  ose our copy of 
12210 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
12220 79 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  y handle */.    
12230 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
12240 65 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29  e(pFile->shared)
12250 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e  ;.    osCloseHan
12260 64 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72  dle(pFile->hShar
12270 65 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e  ed);..    /* Don
12280 65 20 77 69 74 68 20 74 68 65 20 6d 75 74 65 78  e with the mutex
12290 20 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74   */.    winceMut
122a0 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
122b0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73  >hMutex);.    os
122c0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
122d0 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20  e->hMutex);.    
122e0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
122f0 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  NULL;.  }.}../*.
12300 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  ** An implementa
12310 74 69 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b  tion of the Lock
12320 46 69 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69  File() API of Wi
12330 6e 64 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a  ndows for CE.*/.
12340 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63  static BOOL winc
12350 65 4c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  eLockFile(.  LPH
12360 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
12370 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
12380 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
12390 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
123a0 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
123b0 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
123c0 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65  ,.  DWORD nNumbe
123d0 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
123e0 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  gh.){.  winFile 
123f0 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f  *pFile = HANDLE_
12400 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c  TO_WINFILE(phFil
12410 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75  e);.  BOOL bRetu
12420 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55  rn = FALSE;..  U
12430 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12440 64 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68  dwFileOffsetHigh
12450 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
12460 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42  METER(nNumberOfB
12470 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b  ytesToLockHigh);
12480 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e  ..  if (!pFile->
12490 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54  hMutex) return T
124a0 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65  RUE;.  winceMute
124b0 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
124c0 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57  hMutex);..  /* W
124d0 61 6e 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73  anting an exclus
124e0 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69  ive lock? */.  i
124f0 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c  f (dwFileOffsetL
12500 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41  ow == (DWORD)SHA
12510 52 45 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20  RED_FIRST.      
12520 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
12530 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  esToLockLow == (
12540 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12550 45 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  E){.    if (pFil
12560 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64  e->shared->nRead
12570 65 72 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c  ers == 0 && pFil
12580 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c  e->shared->bExcl
12590 75 73 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20  usive == 0){.   
125a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
125b0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
125c0 54 52 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69  TRUE;.       pFi
125d0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
125e0 73 69 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20  sive = TRUE;.   
125f0 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
12600 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
12610 20 2f 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d   /* Want a read-
12620 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  only lock? */.  
12630 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12640 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12650 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 20  RD)SHARED_FIRST 
12660 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e  &&.           nN
12670 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
12680 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20  ckLow == 1){.   
12690 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72   if (pFile->shar
126a0 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d  ed->bExclusive =
126b0 3d 20 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  = 0){.      pFil
126c0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
126d0 73 20 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28  s ++;.      if (
126e0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
126f0 61 64 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20  aders == 1){.   
12700 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72       pFile->shar
12710 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  ed->nReaders ++;
12720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
12730 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
12750 61 6e 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f  ant a pending lo
12760 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
12770 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
12780 77 20 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44  w == (DWORD)PEND
12790 49 4e 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20  ING_BYTE.       
127a0 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66      && nNumberOf
127b0 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d  BytesToLockLow =
127c0 3d 20 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  = 1){.    /* If 
127d0 6e 6f 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20  no pending lock 
127e0 68 61 73 20 62 65 65 6e 20 61 63 71 75 69 72 65  has been acquire
127f0 64 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  d, then acquire 
12800 69 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  it */.    if (pF
12810 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65  ile->shared->bPe
12820 6e 64 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20  nding == 0) {.  
12830 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
12840 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52  d->bPending = TR
12850 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  UE;.      pFile-
12860 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12870 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52  = TRUE;.      bR
12880 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12890 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61    }.  }..  /* Wa
128a0 6e 74 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  nt a reserved lo
128b0 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ck? */.  else if
128c0 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f   (dwFileOffsetLo
128d0 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45  w == (DWORD)RESE
128e0 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20  RVED_BYTE.      
128f0 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
12900 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
12910 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70  == 1){.    if (p
12920 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52  File->shared->bR
12930 65 73 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a  eserved == 0) {.
12940 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12950 72 65 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d  red->bReserved =
12960 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69   TRUE;.      pFi
12970 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
12980 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
12990 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
129a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77  ;.    }.  }..  w
129b0 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
129c0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
129d0 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72  .  return bRetur
129e0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  n;.}../*.** An i
129f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
12a00 20 74 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20   the UnlockFile 
12a10 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66  API of Windows f
12a20 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20  or CE.*/.static 
12a30 42 4f 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b  BOOL winceUnlock
12a40 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
12a50 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
12a60 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
12a70 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
12a80 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
12a90 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
12aa0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20  esToUnlockLow,. 
12ab0 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
12ac0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67  BytesToUnlockHig
12ad0 68 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  h.){.  winFile *
12ae0 70 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54  pFile = HANDLE_T
12af0 4f 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65  O_WINFILE(phFile
12b00 29 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72  );.  BOOL bRetur
12b10 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e  n = FALSE;..  UN
12b20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
12b30 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29  wFileOffsetHigh)
12b40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
12b50 45 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79  ETER(nNumberOfBy
12b60 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29  tesToUnlockHigh)
12b70 3b 0a 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d  ;..  if (!pFile-
12b80 3e 68 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20  >hMutex) return 
12b90 54 52 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74  TRUE;.  winceMut
12ba0 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
12bb0 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
12bc0 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64  Releasing a read
12bd0 65 72 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78  er lock or an ex
12be0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
12bf0 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73    if (dwFileOffs
12c00 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
12c10 53 48 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20  SHARED_FIRST){. 
12c20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76     /* Did we hav
12c30 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  e an exclusive l
12c40 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28  ock? */.    if (
12c50 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
12c60 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
12c70 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
12c80 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
12c90 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
12ca0 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70  D_SIZE);.      p
12cb0 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63  File->local.bExc
12cc0 6c 75 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a  lusive = FALSE;.
12cd0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
12ce0 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20  red->bExclusive 
12cf0 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62  = FALSE;.      b
12d00 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
12d10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64     }..    /* Did
12d20 20 77 65 20 6a 75 73 74 20 68 61 76 65 20 61 20   we just have a 
12d30 72 65 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a  reader lock? */.
12d40 20 20 20 20 65 6c 73 65 20 69 66 20 28 70 46 69      else if (pFi
12d50 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12d60 72 73 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  rs){.      asser
12d70 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
12d80 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
12d90 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12da0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  E.             |
12db0 7c 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  | nNumberOfBytes
12dc0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31  ToUnlockLow == 1
12dd0 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
12de0 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d  local.nReaders -
12df0 2d 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46 69  -;.      if (pFi
12e00 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12e10 72 73 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b  rs == 0).      {
12e20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
12e30 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
12e40 20 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   --;.      }.   
12e50 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12e60 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
12e70 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70  /* Releasing a p
12e80 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20  ending lock */. 
12e90 20 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65   else if (dwFile
12ea0 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12eb0 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45  ORD)PENDING_BYTE
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
12ed0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12ee0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
12ef0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
12f00 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a  ocal.bPending){.
12f10 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
12f20 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41  al.bPending = FA
12f30 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
12f40 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
12f50 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
12f60 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
12f70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
12f80 20 52 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73   Releasing a res
12f90 65 72 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20  erved lock */.  
12fa0 65 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f  else if (dwFileO
12fb0 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f  ffsetLow == (DWO
12fc0 52 44 29 52 45 53 45 52 56 45 44 5f 42 59 54 45  RD)RESERVED_BYTE
12fd0 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 6e  .           && n
12fe0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12ff0 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a  nlockLow == 1){.
13000 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
13010 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20  ocal.bReserved) 
13020 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
13030 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
13040 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46   FALSE;.      pF
13050 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65  ile->shared->bRe
13060 73 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a  served = FALSE;.
13070 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
13080 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
13090 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
130a0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
130b0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
130c0 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45  eturn;.}./*.** E
130d0 6e 64 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  nd of the specia
130e0 6c 20 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65  l code for wince
130f0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
13140 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13150 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a  _OS_WINCE */../*
13160 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20  .** Lock a file 
13170 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  region..*/.stati
13180 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69  c BOOL winLockFi
13190 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
131a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66  hFile,.  DWORD f
131b0 6c 61 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66  lags,.  DWORD of
131c0 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44  fsetLow,.  DWORD
131d0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44   offsetHigh,.  D
131e0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77  WORD numBytesLow
131f0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
13200 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51  esHigh.){.#if SQ
13210 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
13220 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69  /*.  ** NOTE: Wi
13230 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64  ndows CE is hand
13240 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20  led differently 
13250 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63  here due its lac
13260 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20  k of the Win32. 
13270 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
13280 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72  ckFile..  */.  r
13290 65 74 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46  eturn winceLockF
132a0 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
132b0 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
132c0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
132d0 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
132e0 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48  esLow, numBytesH
132f0 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66  igh);.#else.  if
13300 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
13310 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
13320 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
13330 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f  vlp, 0, sizeof(O
13340 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20  VERLAPPED));.   
13350 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f   ovlp.Offset = o
13360 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76  ffsetLow;.    ov
13370 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  lp.OffsetHigh = 
13380 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20  offsetHigh;.    
13390 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c  return osLockFil
133a0 65 45 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61  eEx(*phFile, fla
133b0 67 73 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  gs, 0, numBytesL
133c0 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
133d0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
133e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
133f0 4c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65  LockFile(*phFile
13400 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66  , offsetLow, off
13410 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65  setHigh, numByte
13420 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20  sLow,.          
13430 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
13440 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23  ytesHigh);.  }.#
13450 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
13460 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67  nlock a file reg
13470 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ion.. */.static 
13480 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  BOOL winUnlockFi
13490 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
134a0 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f  hFile,.  DWORD o
134b0 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52  ffsetLow,.  DWOR
134c0 44 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  D offsetHigh,.  
134d0 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f  DWORD numBytesLo
134e0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  w,.  DWORD numBy
134f0 74 65 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53  tesHigh.){.#if S
13500 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
13510 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57   /*.  ** NOTE: W
13520 69 6e 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e  indows CE is han
13530 64 6c 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  dled differently
13540 20 68 65 72 65 20 64 75 65 20 69 74 73 20 6c 61   here due its la
13550 63 6b 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a  ck of the Win32.
13560 20 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55    **       API U
13570 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a  nlockFile..  */.
13580 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e    return winceUn
13590 6c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  lockFile(phFile,
135a0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
135b0 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
135c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135d0 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75   numBytesLow, nu
135e0 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c  mBytesHigh);.#el
135f0 73 65 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28  se.  if( osIsNT(
13600 29 20 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50  ) ){.    OVERLAP
13610 50 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65  PED ovlp;.    me
13620 6d 73 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73  mset(&ovlp, 0, s
13630 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44  izeof(OVERLAPPED
13640 29 29 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66  ));.    ovlp.Off
13650 73 65 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b  set = offsetLow;
13660 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
13670 48 69 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67  High = offsetHig
13680 68 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  h;.    return os
13690 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68  UnlockFileEx(*ph
136a0 46 69 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65  File, 0, numByte
136b0 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69  sLow, numBytesHi
136c0 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65  gh, &ovlp);.  }e
136d0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
136e0 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68  osUnlockFile(*ph
136f0 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
13700 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
13710 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
13720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13730 20 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b    numBytesHigh);
13740 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
137a0 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20   The next group 
137b0 6f 66 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c  of routines impl
137c0 65 6d 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65  ement the I/O me
137d0 74 68 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a  thods specified.
137e0 2a 2a 20 62 79 20 74 68 65 20 73 71 6c 69 74 65  ** by the sqlite
137f0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
13800 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ect..***********
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13850 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  ***/../*.** Some
13860 20 4d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   Microsoft compi
13870 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
13880 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
13890 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
138a0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
138b0 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
138c0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
138d0 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
138e0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
138f0 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69  the current posi
13900 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  tion of the file
13910 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
13920 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
13930 72 67 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65  rgument to offse
13940 74 20 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e  t iOffset within
13950 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75   the file. If su
13960 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e  ccessful, return
13970 20 30 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65   0..** Otherwise
13980 2c 20 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73  , set pFile->las
13990 74 45 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72  tErrno and retur
139a0 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73  n non-zero..*/.s
139b0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65  tatic int winSee
139c0 6b 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  kFile(winFile *p
139d0 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e  File, sqlite3_in
139e0 74 36 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69  t64 iOffset){.#i
139f0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
13a00 52 54 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  RT.  LONG upperB
13a10 69 74 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  its;            
13a20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67       /* Most sig
13a30 2e 20 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77  . 32 bits of new
13a40 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e   offset */.  LON
13a50 47 20 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20  G lowerBits;    
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a70 4c 65 61 73 74 20 73 69 67 2e 20 33 32 20 62 69  Least sig. 32 bi
13a80 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74  ts of new offset
13a90 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65   */.  DWORD dwRe
13aa0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
13ab0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
13ac0 65 74 75 72 6e 65 64 20 62 79 20 53 65 74 46 69  eturned by SetFi
13ad0 6c 65 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20  lePointer() */. 
13ae0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
13af0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13b00 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13b10 65 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72  ed by GetLastErr
13b20 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41  or() */..  OSTRA
13b30 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
13b40 70 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e  p, offset=%lld\n
13b50 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66  ", pFile->h, iOf
13b60 66 73 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72  fset));..  upper
13b70 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69  Bits = (LONG)((i
13b80 4f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  Offset>>32) & 0x
13b90 37 66 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77  7fffffff);.  low
13ba0 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28  erBits = (LONG)(
13bb0 69 4f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  iOffset & 0xffff
13bc0 66 66 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49  ffff);..  /* API
13bd0 20 6f 64 64 69 74 79 3a 20 49 66 20 73 75 63 63   oddity: If succ
13be0 65 73 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50  essful, SetFileP
13bf0 6f 69 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73  ointer() returns
13c00 20 61 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f   a dword.  ** co
13c10 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77  ntaining the low
13c20 65 72 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68  er 32-bits of th
13c30 65 20 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65  e new file-offse
13c40 74 2e 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69  t. Or, if it fai
13c50 6c 73 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75  ls,.  ** it retu
13c60 72 6e 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  rns INVALID_SET_
13c70 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f  FILE_POINTER. Ho
13c80 77 65 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20  wever according 
13c90 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e  to MSDN,.  ** IN
13ca0 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13cb0 4f 49 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20  OINTER may also 
13cc0 62 65 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f  be a valid new o
13cd0 66 66 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74  ffset. So to det
13ce0 65 72 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74  ermine.  ** whet
13cf0 68 65 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73  her an error has
13d00 20 61 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72   actually occurr
13d10 65 64 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e  ed, it is also n
13d20 65 63 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c  ecessary to call
13d30 0a 20 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72  .  ** GetLastErr
13d40 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52  or()..  */.  dwR
13d50 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f  et = osSetFilePo
13d60 69 6e 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20  inter(pFile->h, 
13d70 6c 6f 77 65 72 42 69 74 73 2c 20 26 75 70 70 65  lowerBits, &uppe
13d80 72 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49  rBits, FILE_BEGI
13d90 4e 29 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65  N);..  if( (dwRe
13da0 74 3d 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  t==INVALID_SET_F
13db0 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20  ILE_POINTER.    
13dc0 20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f    && ((lastErrno
13dd0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
13de0 72 28 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29  r())!=NO_ERROR))
13df0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
13e00 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
13e10 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
13e20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
13e30 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e  RR_SEEK, pFile->
13e40 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
13e50 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
13e60 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d  eekFile", pFile-
13e70 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54  >zPath);.    OST
13e80 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
13e90 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
13ea0 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46  OERR_SEEK\n", pF
13eb0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
13ec0 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f  turn 1;.  }..  O
13ed0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
13ee0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
13ef0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
13f00 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
13f10 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20  #else.  /*.  ** 
13f20 53 61 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65  Same as above, e
13f30 78 63 65 70 74 20 74 68 61 74 20 74 68 69 73 20  xcept that this 
13f40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77  implementation w
13f50 6f 72 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a  orks for WinRT..
13f60 20 20 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e    */..  LARGE_IN
13f70 54 45 47 45 52 20 78 3b 20 20 20 20 20 20 20 20  TEGER x;        
13f80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
13f90 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42  ew offset */.  B
13fa0 4f 4f 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20  OOL bRet;       
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13fc0 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
13fd0 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74   by SetFilePoint
13fe0 65 72 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51  erEx() */..  x.Q
13ff0 75 61 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65  uadPart = iOffse
14000 74 3b 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65  t;.  bRet = osSe
14010 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70  tFilePointerEx(p
14020 46 69 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46  File->h, x, 0, F
14030 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69  ILE_BEGIN);..  i
14040 66 28 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46  f(!bRet){.    pF
14050 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
14060 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14070 29 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  );.    winLogErr
14080 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
14090 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  SEEK, pFile->las
140a0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
140b0 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b          "winSeek
140c0 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  File", pFile->zP
140d0 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ath);.    OSTRAC
140e0 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
140f0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
14100 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65  R_SEEK\n", pFile
14110 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
14120 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  n 1;.  }..  OSTR
14130 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d  ACE(("SEEK file=
14140 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14150 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
14160 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
14170 64 69 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  dif.}..#if SQLIT
14180 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14190 30 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  0./* Forward ref
141a0 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
141b0 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
141c0 65 64 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61  ed for memory ma
141d0 70 70 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74  pped files */.st
141e0 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66  atic int winMapf
141f0 69 6c 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71  ile(winFile*, sq
14200 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74  lite3_int64);.st
14210 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61  atic int winUnma
14220 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b  pfile(winFile*);
14230 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
14240 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a  lose a file..**.
14250 2a 2a 20 49 74 20 69 73 20 72 65 70 6f 72 74 65  ** It is reporte
14260 64 20 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70  d that an attemp
14270 74 20 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e  t to close a han
14280 64 6c 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69  dle might someti
14290 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68  mes.** fail.  Th
142a0 69 73 20 69 73 20 61 20 76 65 72 79 20 75 6e 72  is is a very unr
142b0 65 61 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74  easonable result
142c0 2c 20 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73  , but Windows is
142d0 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f   notorious.** fo
142e0 72 20 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e  r being unreason
142f0 61 62 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74  able so I do not
14300 20 64 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d   doubt that it m
14310 69 67 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66  ight happen.  If
14320 0a 2a 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61  .** the close fa
14330 69 6c 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f  ils, we pause fo
14340 72 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e  r 100 millisecon
14350 64 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  ds and try again
14360 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73  .  As.** many as
14370 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50   MX_CLOSE_ATTEMP
14380 54 20 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c  T attempts to cl
14390 6f 73 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61  ose the handle a
143a0 72 65 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a  re made before.*
143b0 2a 20 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20  * giving up and 
143c0 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  returning an err
143d0 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  or..*/.#define M
143e0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
143f0 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
14400 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
14410 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
14420 63 2c 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69  c, cnt = 0;.  wi
14430 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14440 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  winFile*)id;..  
14450 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
14460 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14470 4f 4d 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72  OMIT_WAL.  asser
14480 74 28 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d  t( pFile->pShm==
14490 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  0 );.#endif.  as
144a0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d  sert( pFile->h!=
144b0 4e 55 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68  NULL && pFile->h
144c0 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
144d0 5f 56 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52  _VALUE );.  OSTR
144e0 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
144f0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14500 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ile=%p\n",.     
14510 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
14520 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14530 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
14540 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
14550 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
14560 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69  winUnmapfile(pFi
14570 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
14580 6f 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c  o{.    rc = osCl
14590 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
145a0 3e 68 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75  >h);.    /* Simu
145b0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
145c0 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f  0; cnt=MX_CLOSE_
145d0 41 54 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20  ATTEMPT; ); */. 
145e0 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26   }while( rc==0 &
145f0 26 20 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f  & ++cnt < MX_CLO
14600 53 45 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73  SE_ATTEMPT && (s
14610 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
14620 65 70 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23  ep(100), 1) );.#
14630 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
14640 43 45 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45  CE.#define WINCE
14650 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
14660 54 53 20 33 0a 20 20 7b 0a 20 20 20 20 77 69 6e  TS 3.  {.    win
14670 56 66 73 41 70 70 44 61 74 61 20 2a 70 41 70 70  VfsAppData *pApp
14680 44 61 74 61 20 3d 20 28 77 69 6e 56 66 73 41 70  Data = (winVfsAp
14690 70 44 61 74 61 2a 29 70 46 69 6c 65 2d 3e 70 56  pData*)pFile->pV
146a0 66 73 2d 3e 70 41 70 70 44 61 74 61 3b 0a 20 20  fs->pAppData;.  
146b0 20 20 69 66 28 20 70 41 70 70 44 61 74 61 3d 3d    if( pAppData==
146c0 4e 55 4c 4c 20 7c 7c 20 21 70 41 70 70 44 61 74  NULL || !pAppDat
146d0 61 2d 3e 62 4e 6f 4c 6f 63 6b 20 29 7b 0a 20 20  a->bNoLock ){.  
146e0 20 20 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79      winceDestroy
146f0 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
14700 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69   }.  }.  if( pFi
14710 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  le->zDeleteOnClo
14720 73 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  se ){.    int cn
14730 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  t = 0;.    while
14740 28 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 44  (.           osD
14750 65 6c 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65  eleteFileW(pFile
14760 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14770 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20  )==0.        && 
14780 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
14790 74 65 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c  tesW(pFile->zDel
147a0 65 74 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66  eteOnClose)!=0xf
147b0 66 66 66 66 66 66 66 0a 20 20 20 20 20 20 20 20  fffffff.        
147c0 26 26 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45  && cnt++ < WINCE
147d0 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50  _DELETION_ATTEMP
147e0 54 53 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  TS.    ){.      
147f0 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73   sqlite3_win32_s
14800 6c 65 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57  leep(100);  /* W
14810 61 69 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66  ait a little bef
14820 6f 72 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e  ore trying again
14830 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   */.    }.    sq
14840 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
14850 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
14860 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
14870 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46  if( rc ){.    pF
14880 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20  ile->h = NULL;. 
14890 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72   }.  OpenCounter
148a0 28 2d 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  (-1);.  OSTRACE(
148b0 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  ("CLOSE pid=%lu,
148c0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
148d0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
148e0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
148f0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14900 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
14910 68 2c 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22  h, rc ? "ok" : "
14920 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
14930 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
14940 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a  OK.            :
14950 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
14960 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
14970 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
14980 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
14990 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
149a0 6e 43 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e  nClose", pFile->
149b0 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zPath);.}../*.**
149c0 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
149d0 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
149e0 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
149f0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
14a00 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
14a10 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
14a20 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
14a30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
14a40 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
14a50 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64  atic int winRead
14a60 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
14a70 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *id,          /
14a80 2a 20 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66  * File to read f
14a90 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  rom */.  void *p
14aa0 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
14ab0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e      /* Write con
14ac0 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62  tent into this b
14ad0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61  uffer */.  int a
14ae0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
14af0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14b00 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61 64  of bytes to read
14b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
14b20 74 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20  t64 offset      
14b30 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
14b40 67 20 61 74 20 74 68 69 73 20 6f 66 66 73 65 74  g at this offset
14b50 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
14b60 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
14b70 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
14b80 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
14b90 45 44 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44  ED).  OVERLAPPED
14ba0 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20   overlapped;    
14bb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
14bc0 73 65 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65  set for ReadFile
14bd0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69  . */.#endif.  wi
14be0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
14bf0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a  winFile*)id;  /*
14c00 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
14c10 20 20 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20    DWORD nRead;  
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14c40 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65  ytes actually re
14c50 61 64 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a  ad from file */.
14c60 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30    int nRetry = 0
14c70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14c80 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
14c90 65 74 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65  etrys */..  asse
14ca0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
14cb0 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
14cc0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
14cd0 3e 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  >=0 );.  Simulat
14ce0 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
14cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
14d00 44 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  D);.  OSTRACE(("
14d10 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
14d20 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
14d30 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75   buffer=%p, amou
14d40 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20  nt=%d, ".       
14d50 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64      "offset=%lld
14d60 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73  , lock=%d\n", os
14d70 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
14d80 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20  sId(), pFile,.  
14d90 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
14da0 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66  h, pBuf, amt, of
14db0 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  fset, pFile->loc
14dc0 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51  ktype));..#if SQ
14dd0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
14de0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
14df0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
14e00 68 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74  his read request
14e10 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
14e20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
14e30 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
14e40 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
14e50 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
14e60 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
14e70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
14e80 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
14e90 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
14ea0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
14eb0 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
14ec0 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
14ed0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
14ee0 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  t], amt);.      
14ef0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d  OSTRACE(("READ-M
14f00 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
14f10 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
14f20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
14f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14f40 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
14f50 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
14f60 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
14f70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14f80 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
14f90 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
14fa0 20 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d   (int)(pFile->mm
14fb0 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29  apSize - offset)
14fc0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
14fd0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
14fe0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
14ff0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
15000 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
15010 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
15020 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
15030 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
15040 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
15050 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15060 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
15070 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
15080 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15090 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
150a0 69 66 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  if( winSeekFile(
150b0 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29  pFile, offset) )
150c0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
150d0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
150e0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
150f0 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
15100 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
15110 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
15120 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
15130 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
15140 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
15150 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ULL;.  }.  while
15160 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
15170 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
15180 74 2c 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b  t, &nRead, 0) ){
15190 0a 23 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28  .#else.  memset(
151a0 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
151b0 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
151c0 44 29 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  D));.  overlappe
151d0 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47  d.Offset = (LONG
151e0 29 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66  )(offset & 0xfff
151f0 66 66 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61  fffff);.  overla
15200 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20  pped.OffsetHigh 
15210 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74  = (LONG)((offset
15220 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66  >>32) & 0x7fffff
15230 66 66 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f  ff);.  while( !o
15240 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d  sReadFile(pFile-
15250 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26  >h, pBuf, amt, &
15260 6e 52 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70  nRead, &overlapp
15270 65 64 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  ed) &&.         
15280 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
15290 21 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45  !=ERROR_HANDLE_E
152a0 4f 46 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  OF ){.#endif.   
152b0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
152c0 3b 0a 20 20 20 20 69 66 28 20 77 69 6e 52 65 74  ;.    if( winRet
152d0 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c  ryIoerr(&nRetry,
152e0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63   &lastErrno) ) c
152f0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69  ontinue;.    pFi
15300 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
15310 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f  lastErrno;.    O
15320 53 54 52 41 43 45 28 28 22 52 45 41 44 20 70 69  STRACE(("READ pi
15330 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
15340 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
15350 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e  ITE_IOERR_READ\n
15360 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15370 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
15380 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
15390 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
153a0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
153b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
153c0 52 45 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  READ, pFile->las
153d0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
153f0 77 69 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d  winRead", pFile-
15400 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77  >zPath);.  }.  w
15410 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72  inLogIoerr(nRetr
15420 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  y, __LINE__);.  
15430 69 66 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44  if( nRead<(DWORD
15440 29 61 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55  )amt ){.    /* U
15450 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74  nread parts of t
15460 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62  he buffer must b
15470 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f  e zero-filled */
15480 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63  .    memset(&((c
15490 68 61 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64  har*)pBuf)[nRead
154a0 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29  ], 0, amt-nRead)
154b0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
154c0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
154d0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
154e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
154f0 5f 53 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a  _SHORT_READ\n",.
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
15510 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
15520 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
15530 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
15540 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15550 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
15560 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ..  OSTRACE(("RE
15570 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
15580 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
15590 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
155a0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
155b0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
155c0 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
155d0 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
155e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
155f0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
15600 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
15610 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
15620 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
15630 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
15640 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
15650 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
15660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
15670 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33  Write(.  sqlite3
15680 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20  _file *id,      
15690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
156a0 20 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a   to write into *
156b0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
156c0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
156d0 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73      /* The bytes
156e0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
156f0 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20  /.  int amt,    
15700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15710 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15720 20 62 79 74 65 73 20 74 6f 20 77 72 69 74 65 20   bytes to write 
15730 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  */.  sqlite3_int
15740 36 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20  64 offset       
15750 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
15760 6e 74 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20  nto the file to 
15770 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74  begin writing at
15780 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
15790 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
157a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
157b0 20 69 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63   if error has oc
157c0 63 75 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c  curred, else fal
157d0 73 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20  se */.  winFile 
157e0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
157f0 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
15800 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  handle */.  int 
15810 6e 52 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20  nRetry = 0;     
15820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
15830 75 6d 62 65 72 20 6f 66 20 72 65 74 72 69 65 73  umber of retries
15840 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61   */..  assert( a
15850 6d 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  mt>0 );.  assert
15860 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15870 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15880 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15890 5f 57 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c  _WRITE);.  Simul
158a0 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
158b0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46  (return SQLITE_F
158c0 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  ULL);..  OSTRACE
158d0 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
158e0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
158f0 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
15900 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
15910 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
15920 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
15930 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
15940 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
15960 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
15970 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
15980 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
15990 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
159a0 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
159b0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
159c0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
159d0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
159e0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
159f0 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
15a00 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
15a10 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
15a20 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
15a30 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
15a40 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
15a50 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
15a60 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
15a70 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
15a80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
15a90 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
15aa0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
15ab0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
15ac0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
15ad0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
15ae0 22 57 52 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d  "WRITE-MMAP pid=
15af0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15b00 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15b10 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
15b20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15b30 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15b40 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15b50 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
15b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
15b70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
15b80 20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70   nCopy = (int)(p
15b90 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
15ba0 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
15bb0 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
15bc0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
15bd0 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
15be0 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
15bf0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
15c00 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
15c10 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
15c20 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
15c30 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
15c40 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
15c50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
15c60 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
15c70 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
15c80 50 50 45 44 29 0a 20 20 72 63 20 3d 20 77 69 6e  PPED).  rc = win
15c90 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
15ca0 6f 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72  offset);.  if( r
15cb0 63 3d 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20  c==0 ){.#else.  
15cc0 7b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51  {.#endif.#if !SQ
15cd0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
15ce0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15cf0 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41  _WIN32_NO_OVERLA
15d00 50 50 45 44 29 0a 20 20 20 20 4f 56 45 52 4c 41  PPED).    OVERLA
15d10 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
15d20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
15d30 66 66 73 65 74 20 66 6f 72 20 57 72 69 74 65 46  ffset for WriteF
15d40 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ile. */.#endif. 
15d50 20 20 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75     u8 *aRem = (u
15d60 38 20 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20  8 *)pBuf;       
15d70 20 2f 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20   /* Data yet to 
15d80 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  be written */.  
15d90 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74    int nRem = amt
15da0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
15db0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
15dc0 65 73 20 79 65 74 20 74 6f 20 62 65 20 77 72 69  es yet to be wri
15dd0 74 74 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52  tten */.    DWOR
15de0 44 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  D nWrite;       
15df0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
15e00 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 65 61  es written by ea
15e10 63 68 20 57 72 69 74 65 46 69 6c 65 28 29 20 63  ch WriteFile() c
15e20 61 6c 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44  all */.    DWORD
15e30 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
15e40 45 52 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75  ERROR;   /* Valu
15e50 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 47 65  e returned by Ge
15e60 74 4c 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a  tLastError() */.
15e70 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
15e80 57 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65  WINCE && !define
15e90 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
15ea0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
15eb0 20 20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61    memset(&overla
15ec0 70 70 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pped, 0, sizeof(
15ed0 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20  OVERLAPPED));.  
15ee0 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
15ef0 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
15f00 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
15f10 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65  );.    overlappe
15f20 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
15f30 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
15f40 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
15f50 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68  ;.#endif..    wh
15f60 69 6c 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23  ile( nRem>0 ){.#
15f70 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15f80 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
15f90 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15fa0 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20  ERLAPPED).      
15fb0 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
15fc0 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
15fd0 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
15fe0 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20  0) ){.#else.    
15ff0 20 20 69 66 28 20 21 6f 73 57 72 69 74 65 46 69    if( !osWriteFi
16000 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65  le(pFile->h, aRe
16010 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65  m, nRem, &nWrite
16020 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29  , &overlapped) )
16030 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  {.#endif.       
16040 20 69 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65   if( winRetryIoe
16050 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73  rr(&nRetry, &las
16060 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e  tErrno) ) contin
16070 75 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ue;.        brea
16080 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
16090 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d   assert( nWrite=
160a0 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44  =0 || nWrite<=(D
160b0 57 4f 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20  WORD)nRem );.   
160c0 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30     if( nWrite==0
160d0 20 7c 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52   || nWrite>(DWOR
160e0 44 29 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  D)nRem ){.      
160f0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
16100 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
16110 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16120 20 20 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49       }.#if !SQLI
16130 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
16140 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
16150 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
16160 45 44 29 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ED).      offset
16170 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20   += nWrite;.    
16180 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66    overlapped.Off
16190 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66  set = (LONG)(off
161a0 73 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66  set & 0xffffffff
161b0 29 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  );.      overlap
161c0 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d  ped.OffsetHigh =
161d0 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e   (LONG)((offset>
161e0 3e 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66  >32) & 0x7ffffff
161f0 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  f);.#endif.     
16200 20 61 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b   aRem += nWrite;
16210 0a 20 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  .      nRem -= n
16220 57 72 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Write;.    }.   
16230 20 69 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20   if( nRem>0 ){. 
16240 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
16250 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
16260 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  o;.      rc = 1;
16270 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
16280 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
16290 20 20 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45    ( pFile->lastE
162a0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44  rrno==ERROR_HAND
162b0 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20  LE_DISK_FULL ). 
162c0 20 20 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65        || ( pFile
162d0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
162e0 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b  OR_DISK_FULL )){
162f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
16300 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
16310 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
16320 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c  p, rc=SQLITE_FUL
16330 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  L\n",.          
16340 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16350 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16360 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
16370 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
16380 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16390 5f 46 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61  _FULL, pFile->la
163a0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
163b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163c0 20 20 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70    "winWrite1", p
163d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
163e0 20 20 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28    }.    OSTRACE(
163f0 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c  ("WRITE pid=%lu,
16400 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16410 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
16420 45 52 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20  ERR_WRITE\n",.  
16430 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16440 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16450 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16460 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
16470 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
16480 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
16490 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
164a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
164b0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 57             "winW
164c0 72 69 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  rite2", pFile->z
164d0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
164e0 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
164f0 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f  nRetry, __LINE__
16500 29 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  );.  }.  OSTRACE
16510 28 28 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75  (("WRITE pid=%lu
16520 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
16530 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
16540 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
16550 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16560 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16570 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
16580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
165a0 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
165b0 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
165c0 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
165d0 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71  t winTruncate(sq
165e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
165f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42  sqlite3_int64 nB
16600 79 74 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20  yte){.  winFile 
16610 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16620 65 2a 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20  e*)id;  /* File 
16630 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f  handle object */
16640 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
16650 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
16660 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
16670 65 20 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74  e for this funct
16680 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ion */.  DWORD l
16690 61 73 74 45 72 72 6e 6f 3b 0a 23 69 66 20 53 51  astErrno;.#if SQ
166a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
166b0 5a 45 3e 30 0a 20 20 73 71 6c 69 74 65 33 5f 69  ZE>0.  sqlite3_i
166c0 6e 74 36 34 20 6f 6c 64 4d 6d 61 70 53 69 7a 65  nt64 oldMmapSize
166d0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
166e0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
166f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
16700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
16710 52 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20  RR_TRUNCATE);.  
16720 4f 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41  OSTRACE(("TRUNCA
16730 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  TE pid=%lu, pFil
16740 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73  e=%p, file=%p, s
16750 69 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  ize=%lld, lock=%
16760 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
16770 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16780 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16790 20 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65   pFile->h, nByte
167a0 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
167b0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
167c0 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69  e user has confi
167d0 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69  gured a chunk-si
167e0 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ze for this file
167f0 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
16800 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74   ** file so that
16810 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20   it consists of 
16820 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65  an integer numbe
16830 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65  r of chunks (i.e
16840 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61  . the.  ** actua
16850 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65  l file size afte
16860 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  r the operation 
16870 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68  may be larger th
16880 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64  an the requested
16890 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a  .  ** size)..  *
168a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
168b0 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
168c0 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20  nByte = ((nByte 
168d0 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  + pFile->szChunk
168e0 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43   - 1)/pFile->szC
168f0 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
16900 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 23 69 66  zChunk;.  }..#if
16910 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
16920 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46  _SIZE>0.  if( pF
16930 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
16940 29 7b 0a 20 20 20 20 6f 6c 64 4d 6d 61 70 53 69  ){.    oldMmapSi
16950 7a 65 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  ze = pFile->mmap
16960 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
16970 20 20 20 6f 6c 64 4d 6d 61 70 53 69 7a 65 20 3d     oldMmapSize =
16980 20 30 3b 0a 20 20 7d 0a 20 20 77 69 6e 55 6e 6d   0;.  }.  winUnm
16990 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23  apfile(pFile);.#
169a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 45  endif..  /* SetE
169b0 6e 64 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72  ndOfFile() retur
169c0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  ns non-zero when
169d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
169e0 7a 65 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69  zero when it fai
169f0 6c 73 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e  ls. */.  if( win
16a00 53 65 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20  SeekFile(pFile, 
16a10 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63  nByte) ){.    rc
16a20 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
16a30 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
16a40 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  CATE, pFile->las
16a50 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
16a70 6e 54 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69  nTruncate1", pFi
16a80 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
16a90 6c 73 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74  lse if( 0==osSet
16aa0 45 6e 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  EndOfFile(pFile-
16ab0 3e 68 29 20 26 26 0a 20 20 20 20 20 20 20 20 20  >h) &&.         
16ac0 20 20 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d     ((lastErrno =
16ad0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16ae0 29 29 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d  ))!=ERROR_USER_M
16af0 41 50 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20  APPED_FILE) ){. 
16b00 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16b10 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
16b20 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67  .    rc = winLog
16b30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16b40 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69  RR_TRUNCATE, pFi
16b50 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
16b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b70 20 20 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65      "winTruncate
16b80 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
16b90 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
16ba0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
16bb0 3e 30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  >0.  if( rc==SQL
16bc0 49 54 45 5f 4f 4b 20 26 26 20 6f 6c 64 4d 6d 61  ITE_OK && oldMma
16bd0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 69  pSize>0 ){.    i
16be0 66 28 20 6f 6c 64 4d 6d 61 70 53 69 7a 65 3e 6e  f( oldMmapSize>n
16bf0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 77 69  Byte ){.      wi
16c00 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  nMapfile(pFile, 
16c10 2d 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  -1);.    }else{.
16c20 20 20 20 20 20 20 77 69 6e 4d 61 70 66 69 6c 65        winMapfile
16c30 28 70 46 69 6c 65 2c 20 6f 6c 64 4d 6d 61 70 53  (pFile, oldMmapS
16c40 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ize);.    }.  }.
16c50 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43  #endif..  OSTRAC
16c60 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69 64  E(("TRUNCATE pid
16c70 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16c80 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e  file=%p, rc=%s\n
16c90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
16ca0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16cb0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
16cc0 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45  ile->h, sqlite3E
16cd0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
16ce0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
16cf0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16d00 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
16d10 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 73   number of fulls
16d20 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c 20  yncs and normal 
16d30 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73 20  syncs.  This is 
16d40 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a 20  used to test.** 
16d50 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20 66  that syncs and f
16d60 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63 63  ullsyncs are occ
16d70 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69 67  uring at the rig
16d80 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74  ht times..*/.int
16d90 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
16da0 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c  unt = 0;.int sql
16db0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
16dc0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16dd0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
16de0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
16df0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
16e00 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
16e10 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
16e20 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73 71  c int winSync(sq
16e30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16e40 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66 6e  int flags){.#ifn
16e50 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16e60 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 65  NC.  /*.  ** Use
16e70 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c 49  d only when SQLI
16e80 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f  TE_NO_SYNC is no
16e90 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a 2f  t defined..   */
16ea0 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e 64  .  BOOL rc;.#end
16eb0 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
16ec0 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66 69  NDEBUG) || !defi
16ed0 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  ned(SQLITE_NO_SY
16ee0 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65 66  NC) || \.    def
16ef0 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
16f00 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a 0a  _OS_TRACE).  /*.
16f10 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20 53    ** Used when S
16f20 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73  QLITE_NO_SYNC is
16f30 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e 64   not defined and
16f40 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28 29   by the assert()
16f50 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53 54   and/or.  ** OST
16f60 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a 20  RACE() macros.. 
16f70 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a    */.  winFile *
16f80 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
16f90 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  *)id;.#else.  UN
16fa0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69  USED_PARAMETER(i
16fb0 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  d);.#endif..  as
16fc0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16fd0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f   /* Check that o
16fe0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e  ne of SQLITE_SYN
16ff0 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c  C_NORMAL or FULL
17000 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20   was passed */. 
17010 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30   assert((flags&0
17020 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
17030 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c  C_NORMAL.      |
17040 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  | (flags&0x0F)==
17050 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
17060 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78  .  );..  /* Unix
17070 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d   cannot, but som
17080 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65  e systems may re
17090 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
170a0 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73   from here. This
170b0 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f  .  ** line is to
170c0 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67   test that doing
170d0 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75   so does not cau
170e0 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e  se any problems.
170f0 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
17100 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72  DiskfullError( r
17110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
17120 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  L );..  OSTRACE(
17130 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20  ("SYNC pid=%lu, 
17140 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
17150 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f 63  p, flags=%x, loc
17160 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  k=%d\n",.       
17170 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
17180 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
17190 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66 6c  le, pFile->h, fl
171a0 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ags,.           
171b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
171c0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
171d0 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45 44  TE_TEST.  UNUSED
171e0 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67 73  _PARAMETER(flags
171f0 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 28  );.#else.  if( (
17200 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
17210 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29 7b  ITE_SYNC_FULL ){
17220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75 6c  .    sqlite3_ful
17230 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
17240 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e   }.  sqlite3_syn
17250 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
17260 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
17270 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
17280 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
17290 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
172a0 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
172b0 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  p.  */.#ifdef SQ
172c0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 4f  LITE_NO_SYNC.  O
172d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e 4f  STRACE(("SYNC-NO
172e0 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
172f0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
17300 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
17310 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
17320 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
17330 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
17340 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  >h));.  return S
17350 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
17360 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
17370 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
17380 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
17390 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73  on ){.    if( os
173a0 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65 28  FlushViewOfFile(
173b0 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
173c0 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 4f  n, 0) ){.      O
173d0 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d  STRACE(("SYNC-MM
173e0 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
173f0 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e  e=%p, pMapRegion
17400 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%p, ".         
17410 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54 45        "rc=SQLITE
17420 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72  _OK\n", osGetCur
17430 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
17440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17450 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70 4d  pFile, pFile->pM
17460 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20  apRegion));.    
17470 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
17480 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17490 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
174a0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
174b0 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64 3d  ("SYNC-MMAP pid=
174c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
174d0 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a  MapRegion=%p, ".
174e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
174f0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
17500 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75  MMAP\n", osGetCu
17510 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
17520 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17530 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70   pFile, pFile->p
17540 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
17550 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
17560 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17570 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e  RR_MMAP, pFile->
17580 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175a0 20 20 20 20 22 77 69 6e 53 79 6e 63 31 22 2c 20      "winSync1", 
175b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
175c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
175d0 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46 69    rc = osFlushFi
175e0 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65 2d  leBuffers(pFile-
175f0 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  >h);.  SimulateI
17600 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53 45  OError( rc=FALSE
17610 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
17620 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59      OSTRACE(("SY
17630 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  NC pid=%lu, pFil
17640 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
17650 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
17660 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
17670 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
17680 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
17690 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
176a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
176b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
176c0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
176d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
176e0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
176f0 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
17700 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
17710 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
17720 46 53 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20 20  FSYNC\n",.      
17730 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
17740 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
17750 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
17760 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
17770 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
17780 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70 46  _IOERR_FSYNC, pF
17790 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63 32         "winSync2
177c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
177d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
177e0 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
177f0 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
17800 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79   of a file in by
17810 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  tes.*/.static in
17820 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73 71  t winFileSize(sq
17830 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
17840 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70  sqlite3_int64 *p
17850 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65  Size){.  winFile
17860 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
17870 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
17880 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
17890 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
178a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 69 7a  ;.  assert( pSiz
178b0 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61  e!=0 );.  Simula
178c0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
178d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
178e0 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  TAT);.  OSTRACE(
178f0 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20  ("SIZE file=%p, 
17900 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46 69  pSize=%p\n", pFi
17910 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b 0a  le->h, pSize));.
17920 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
17930 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49 4c  INRT.  {.    FIL
17940 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f 20  E_STANDARD_INFO 
17950 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f 73  info;.    if( os
17960 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69  GetFileInformati
17970 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46 69  onByHandleEx(pFi
17980 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e 64  le->h, FileStand
17990 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20 20  ardInfo,.       
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
179c0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
179d0 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53 69  )) ){.      *pSi
179e0 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66 46  ze = info.EndOfF
179f0 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20 20  ile.QuadPart;.  
17a00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
17a10 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17a20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17a30 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ();.      rc = w
17a40 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
17a50 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70  E_IOERR_FSTAT, p
17a60 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
17a70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a80 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65          "winFile
17a90 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Size", pFile->zP
17aa0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ath);.    }.  }.
17ab0 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57  #else.  {.    DW
17ac0 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a 20  ORD upperBits;. 
17ad0 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42 69     DWORD lowerBi
17ae0 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 61  ts;.    DWORD la
17af0 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c 6f  stErrno;..    lo
17b00 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74 46  werBits = osGetF
17b10 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e 68  ileSize(pFile->h
17b20 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20  , &upperBits);. 
17b30 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 73     *pSize = (((s
17b40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70 70  qlite3_int64)upp
17b50 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c  erBits)<<32) + l
17b60 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69 66  owerBits;.    if
17b70 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20 3d  (   (lowerBits =
17b80 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 53  = INVALID_FILE_S
17b90 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20 28  IZE).       && (
17ba0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  (lastErrno = osG
17bb0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d  etLastError())!=
17bc0 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20 20  NO_ERROR) ){.   
17bd0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
17be0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
17bf0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
17c00 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
17c10 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c  OERR_FSTAT, pFil
17c20 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c40 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a       "winFileSiz
17c50 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  e", pFile->zPath
17c60 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
17c70 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22  dif.  OSTRACE(("
17c80 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70 53  SIZE file=%p, pS
17c90 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d 25  ize=%p, *pSize=%
17ca0 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  lld, rc=%s\n",. 
17cb0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
17cc0 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69 7a  >h, pSize, *pSiz
17cd0 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
17ce0 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
17cf0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
17d00 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
17d10 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64 65  EDIATELY is unde
17d20 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57 69  fined on some Wi
17d30 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 2a  ndows systems..*
17d40 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  /.#ifndef LOCKFI
17d50 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
17d60 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43  ELY.# define LOC
17d70 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
17d80 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66 0a  IATELY 1.#endif.
17d90 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49 4c  .#ifndef LOCKFIL
17da0 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
17db0 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49  .# define LOCKFI
17dc0 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
17dd0 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  K 2.#endif../*.*
17de0 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c 20  * Historically, 
17df0 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64 20  SQLite has used 
17e00 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  both the LockFil
17e10 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45 78  e and LockFileEx
17e20 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20 57   functions..** W
17e30 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  hen the LockFile
17e40 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75 73   function was us
17e50 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61 79  ed, it was alway
17e60 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 61  s expected to fa
17e70 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  il.** immediatel
17e80 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 6f  y if the lock co
17e90 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61 69  uld not be obtai
17ea0 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20 61  ned.  Also, it a
17eb0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
17ec0 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20 65  o.** obtain an e
17ed0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
17ee0 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65 20  These flags are 
17ef0 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c 6f  used with the Lo
17f00 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f  ckFileEx functio
17f10 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63 74  n.** and reflect
17f20 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74 69   those expectati
17f30 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20  ons; therefore, 
17f40 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74 20  they should not 
17f50 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  be changed..*/.#
17f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
17f70 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20 64  CKFILE_FLAGS.# d
17f80 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43  efine SQLITE_LOC
17f90 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28 4c  KFILE_FLAGS   (L
17fa0 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
17fb0 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20 20  EDIATELY | \.   
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
17fe0 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56  OCKFILE_EXCLUSIV
17ff0 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a 0a  E_LOCK).#endif..
18000 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c  /*.** Currently,
18010 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63 61   SQLite never ca
18020 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  lls the LockFile
18030 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  Ex function with
18040 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65 0a  out wanting the.
18050 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c 20  ** call to fail 
18060 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
18070 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
18080 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a 23  e obtained..*/.#
18090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f  ifndef SQLITE_LO
180a0 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a 23  CKFILEEX_FLAGS.#
180b0 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c   define SQLITE_L
180c0 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 20  OCKFILEEX_FLAGS 
180d0 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49  (LOCKFILE_FAIL_I
180e0 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e 64  MMEDIATELY).#end
180f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  if../*.** Acquir
18100 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e  e a reader lock.
18110 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50  .** Different AP
18120 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  I routines are c
18130 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20  alled depending 
18140 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
18150 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e  t this.** is Win
18160 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a  9x or WinNT..*/.
18170 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
18180 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c  tReadLock(winFil
18190 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74  e *pFile){.  int
181a0 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28   res;.  OSTRACE(
181b0 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65  ("READ-LOCK file
181c0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
181d0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
181e0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
181f0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
18200 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
18210 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  NCE.    /*.    *
18220 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73 20  * NOTE: Windows 
18230 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64 69  CE is handled di
18240 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20 64  fferently here d
18250 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20 74  ue its lack of t
18260 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a 20  he Win32.    ** 
18270 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69        API LockFi
18280 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  leEx..    */.   
18290 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63 6b   res = winceLock
182a0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
182b0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
182c0 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20   1, 0);.#else.  
182d0 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46    res = winLockF
182e0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
182f0 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58  QLITE_LOCKFILEEX
18300 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f 46  _FLAGS, SHARED_F
18310 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20 20  IRST, 0,.       
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
18330 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
18340 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65  #endif.  }.#ifde
18350 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
18360 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
18370 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20      int lk;.    
18380 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
18390 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26  ss(sizeof(lk), &
183a0 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lk);.    pFile->
183b0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
183c0 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20 30   (short)((lk & 0
183d0 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41 52  x7fffffff)%(SHAR
183e0 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a 20  ED_SIZE - 1));. 
183f0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
18400 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
18410 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
18420 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
18430 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
18440 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d  RED_FIRST+pFile-
18450 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
18460 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23   0, 1, 0);.  }.#
18470 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 20  endif.  if( res 
18480 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  == 0 ){.    pFil
18490 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
184a0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
184b0 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20  .    /* No need 
184c0 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72 65  to log a failure
184d0 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a   to lock */.  }.
184e0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
184f0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
18500 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69  esult=%d\n", pFi
18510 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
18520 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
18530 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
18540 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
18550 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64  nt winUnlockRead
18560 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
18570 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
18580 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
18590 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  no;.  OSTRACE(("
185a0 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65  READ-UNLOCK file
185b0 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  =%p, lock=%d\n",
185c0 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
185d0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ->locktype));.  
185e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
185f0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c      res = winUnl
18600 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18610 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  h, SHARED_FIRST,
18620 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c   0, SHARED_SIZE,
18630 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20   0);.  }.#ifdef 
18640 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
18650 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
18660 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
18670 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
18680 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
18690 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
186a0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
186b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
186c0 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73 74  res==0 && ((last
186d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
186e0 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52  tError())!=ERROR
186f0 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b 0a  _NOT_LOCKED) ){.
18700 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
18710 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
18720 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f  ;.    winLogErro
18730 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  r(SQLITE_IOERR_U
18740 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  NLOCK, pFile->la
18750 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
18760 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6c           "winUnl
18770 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70 46  ockReadLock", pF
18780 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
18790 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
187a0 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  D-UNLOCK file=%p
187b0 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20  , result=%d\n", 
187c0 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
187d0 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
187e0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
187f0 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
18800 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
18810 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74   parameter lockt
18820 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ype - one.** of 
18830 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
18840 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
18850 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
18860 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
18870 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
18880 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
18890 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
188a0 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
188b0 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
188c0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
188d0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
188e0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
188f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
18900 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
18910 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
18920 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
18930 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
18940 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
18950 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
18960 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
18970 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
18980 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
18990 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
189a0 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
189b0 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
189c0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
189d0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
189e0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
189f0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
18a00 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
18a10 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
18a20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
18a30 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
18a40 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
18a50 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
18a60 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
18a70 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
18a80 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
18a90 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  IVE.**.** This r
18aa0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
18ab0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
18ac0 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b  .  The winUnlock
18ad0 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72  () routine.** er
18ae0 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61  ases all locks a
18af0 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72  t once and retur
18b00 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c  ns us immediatel
18b10 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  y to locking lev
18b20 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  el 0..** It is n
18b30 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c  ot possible to l
18b40 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
18b50 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20   level one step 
18b60 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a  at a time.  You.
18b70 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69  ** must go strai
18b80 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c  ght to locking l
18b90 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  evel 0..*/.stati
18ba0 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73 71  c int winLock(sq
18bb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18bc0 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20  int locktype){. 
18bd0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
18be0 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75 72  _OK;    /* Retur
18bf0 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 72  n code from subr
18c00 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e 74  outines */.  int
18c10 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20 20   res = 1;       
18c20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f 66      /* Result of
18c30 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b 20   a Windows lock 
18c40 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 65  call */.  int ne
18c50 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20 20  wLocktype;      
18c60 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e 6c   /* Set pFile->l
18c70 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73 20  ocktype to this 
18c80 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78 69  value before exi
18c90 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67 6f  ting */.  int go
18ca0 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30  tPendingLock = 0
18cb0 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 61  ;/* True if we a
18cc0 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49 4e  cquired a PENDIN
18cd0 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d 65  G lock this time
18ce0 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
18cf0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
18d00 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  )id;.  DWORD las
18d10 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f  tErrno = NO_ERRO
18d20 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  R;..  assert( id
18d30 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  !=0 );.  OSTRACE
18d40 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
18d50 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
18d60 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
18d70 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18d80 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
18d90 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
18da0 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
18db0 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20 49  ktype));..  /* I
18dc0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
18dd0 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
18de0 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
18df0 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
18e00 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20 64  e.  ** OsFile, d
18e10 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
18e20 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
18e30 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
18e40 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73 45  .  ** sqlite3OsE
18e50 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
18e60 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
18e70 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
18e80 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d  File->locktype>=
18e90 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20  locktype ){.    
18ea0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 48  OSTRACE(("LOCK-H
18eb0 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  ELD file=%p, rc=
18ec0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
18ed0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
18ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18ef0 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74    }..  /* Do not
18f00 20 61 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64 20   allow any kind 
18f10 6f 66 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e  of write-lock on
18f20 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
18f30 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66 28  abase.  */.  if(
18f40 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
18f50 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f  gs & WINFILE_RDO
18f60 4e 4c 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b 74  NLY)!=0 && lockt
18f70 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype>=RESERVED_LO
18f80 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  CK ){.    return
18f90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
18fa0 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  CK;.  }..  /* Ma
18fb0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
18fc0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
18fd0 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
18fe0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
18ff0 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
19000 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
19010 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
19020 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
19030 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
19040 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
19050 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
19060 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
19070 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
19080 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
19090 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
190a0 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
190b0 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
190c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
190d0 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
190e0 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
190f0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
19100 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
19110 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
19120 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
19130 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
19140 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
19150 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
19160 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46  cktype;.  if( pF
19170 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
19180 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c 6f  O_LOCK.   || (lo
19190 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
191a0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
191b0 3e 6c 6f 63 6b 74 79 70 65 3c 3d 52 45 53 45 52  >locktype<=RESER
191c0 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  VED_LOCK).  ){. 
191d0 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b 0a     int cnt = 3;.
191e0 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
191f0 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69 6e  >0 && (res = win
19200 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
19210 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
19220 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
19230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19250 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45      PENDING_BYTE
19260 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
19270 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20 33  {.      /* Try 3
19280 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74 68   times to get th
19290 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20  e pending lock. 
192a0 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20   This is needed 
192b0 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a 2a  to work.      **
192c0 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73   around problems
192d0 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65 78   caused by index
192e0 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69 2d  ing and/or anti-
192f0 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20 6f  virus software o
19300 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64 6f  n.      ** Windo
19310 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20 20  ws systems..    
19320 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65 20    ** If you are 
19330 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65 20  using this code 
19340 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20 61  as a model for a
19350 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65 73  lternative VFSes
19360 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20 2a  , do not.      *
19370 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74 72  * copy this retr
19380 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73 20  y logic.  It is 
19390 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64 20  a hack intended 
193a0 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c 79  for Windows only
193b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
193c0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
193d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
193e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c       OSTRACE(("L
193f0 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49 4c  OCK-PENDING-FAIL
19400 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d   file=%p, count=
19410 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22  %d, result=%d\n"
19420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19430 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20   pFile->h, cnt, 
19440 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66 28  res));.      if(
19450 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
19460 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  R_INVALID_HANDLE
19470 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
19480 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
19490 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
194a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
194b0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
194c0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
194d0 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 63  -FAIL file=%p, c
194e0 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  ount=%d, rc=%s\n
194f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19500 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e      pFile->h, cn
19510 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  t, sqlite3ErrNam
19520 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20  e(rc)));.       
19530 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19540 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 6e    }.      if( cn
19550 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t ) sqlite3_win3
19560 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20 20  2_sleep(1);.    
19570 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  }.    gotPending
19580 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20 20  Lock = res;.    
19590 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20 20  if( !res ){.    
195a0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
195b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
195c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
195d0 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65 64  Acquire a shared
195e0 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28   lock.  */.  if(
195f0 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
19600 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  D_LOCK && res ){
19610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
19620 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  le->locktype==NO
19630 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
19640 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63   = winGetReadLoc
19650 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  k(pFile);.    if
19660 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e  ( res ){.      n
19670 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41  ewLocktype = SHA
19680 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
19690 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45  lse{.      lastE
196a0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
196b0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20  Error();.    }. 
196c0 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
196d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
196e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  .  */.  if( lock
196f0 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c  type==RESERVED_L
19700 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20  OCK && res ){.  
19710 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
19720 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
19730 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  D_LOCK );.    re
19740 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
19750 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
19760 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
19770 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19780 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
19790 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
197a0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52 45  newLocktype = RE
197b0 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SERVED_LOCK;.   
197c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61   }else{.      la
197d0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
197e0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
197f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75  }.  }..  /* Acqu
19800 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f  ire a PENDING lo
19810 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f  ck.  */.  if( lo
19820 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56  cktype==EXCLUSIV
19830 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b  E_LOCK && res ){
19840 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65  .    newLocktype
19850 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
19860 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c  .    gotPendingL
19870 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ock = 0;.  }..  
19880 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
19890 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20 2a  CLUSIVE lock.  *
198a0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
198b0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
198c0 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
198d0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
198e0 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f 4c  cktype>=SHARED_L
198f0 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20 3d  OCK );.    res =
19900 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f   winUnlockReadLo
19910 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 72  ck(pFile);.    r
19920 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
19930 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
19940 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
19950 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
19960 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
19970 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
19980 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69  _SIZE, 0);.    i
19990 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
199a0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45 58  newLocktype = EX
199b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20  CLUSIVE_LOCK;.  
199c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
199d0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
199e0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
199f0 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f 63     winGetReadLoc
19a00 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  k(pFile);.    }.
19a10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
19a20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50 45  are holding a PE
19a30 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74 20  NDING lock that 
19a40 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c 65  ought to be rele
19a50 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  ased, then.  ** 
19a60 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a  release it now..
19a70 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50 65    */.  if( gotPe
19a80 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f 63  ndingLock && loc
19a90 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
19aa0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
19ab0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19ac0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
19ad0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a   0, 1, 0);.  }..
19ae0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19af0 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63  state of the loc
19b00 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68  k has held in th
19b10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
19b20 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75  r then.  ** retu
19b30 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  rn the appropria
19b40 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  te result code..
19b50 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 29    */.  if( res )
19b60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19b70 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
19b80 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
19b90 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
19ba0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
19bb0 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52 41  _BUSY;.    OSTRA
19bc0 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66  CE(("LOCK-FAIL f
19bd0 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d 25  ile=%p, wanted=%
19be0 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20 20  d, got=%d\n",.  
19bf0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19c00 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 6e  ->h, locktype, n
19c10 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20 20  ewLocktype));.  
19c20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
19c30 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f 63  ype = (u8)newLoc
19c40 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45  ktype;.  OSTRACE
19c50 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  (("LOCK file=%p,
19c60 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c   lock=%d, rc=%s\
19c70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
19c80 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
19c90 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65  locktype, sqlite
19ca0 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
19cb0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19cc0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
19cd0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
19ce0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
19cf0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
19d00 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
19d10 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
19d20 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
19d30 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
19d40 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e   is held, return
19d50 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74  .** non-zero, ot
19d60 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f  herwise zero..*/
19d70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
19d80 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
19d90 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
19da0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
19db0 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 77  {.  int res;.  w
19dc0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
19dd0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  (winFile*)id;.. 
19de0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
19df0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
19e00 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
19e10 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f 53  VEDLOCK; );.  OS
19e20 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52 2d  TRACE(("TEST-WR-
19e30 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70 52  LOCK file=%p, pR
19e40 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46 69  esOut=%p\n", pFi
19e50 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29 29  le->h, pResOut))
19e60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
19e70 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19e80 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53  e->locktype>=RES
19e90 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
19ea0 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20 4f    res = 1;.    O
19eb0 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
19ec0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
19ed0 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c 29  esult=%d (local)
19ee0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
19ef0 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  es));.  }else{. 
19f00 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
19f10 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
19f20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
19f30 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45 44  X_FLAGS,RESERVED
19f40 5f 42 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20 20  _BYTE,0,1,0);.  
19f50 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
19f60 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
19f70 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45  (&pFile->h, RESE
19f80 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
19f90 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
19fa0 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20 4f  es = !res;.    O
19fb0 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
19fc0 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72  -LOCK file=%p, r
19fd0 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74 65  esult=%d (remote
19fe0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
19ff0 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  res));.  }.  *pR
1a000 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20 4f  esOut = res;.  O
1a010 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
1a020 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
1a030 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73  ResOut=%p, *pRes
1a040 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54  Out=%d, rc=SQLIT
1a050 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
1a060 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52      pFile->h, pR
1a070 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29  esOut, *pResOut)
1a080 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1a090 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1a0a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
1a0b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
1a0c0 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74 6f  descriptor id to
1a0d0 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63 6b   locktype.  lock
1a0e0 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65 20  type.** must be 
1a0f0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
1a100 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
1a110 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
1a120 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
1a130 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1a140 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
1a150 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
1a160 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
1a170 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
1a180 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1a190 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74  .**.** It is not
1a1a0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 68   possible for th
1a1b0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66 61  is routine to fa
1a1c0 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64  il if the second
1a1d0 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
1a1e0 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68 65  NO_LOCK.  If the
1a1f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1a200 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   is SHARED_LOCK 
1a210 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1a220 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75 72  e.** might retur
1a230 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
1a240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a250 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  nUnlock(sqlite3_
1a260 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
1a270 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 74  cktype){.  int t
1a280 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ype;.  winFile *
1a290 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1a2a0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
1a2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1a2c0 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
1a2d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
1a2e0 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
1a2f0 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  K );.  OSTRACE((
1a300 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  "UNLOCK file=%p,
1a310 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29 2c   oldLock=%d(%d),
1a320 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a   newLock=%d\n",.
1a330 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
1a340 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
1a350 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61  type, pFile->sha
1a360 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f 63  redLockByte, loc
1a370 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65 20  ktype));.  type 
1a380 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
1a390 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
1a3a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
1a3b0 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
1a3c0 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
1a3d0 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
1a3e0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
1a3f0 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65      if( locktype
1a400 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
1a410 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b   !winGetReadLock
1a420 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 20  (pFile) ){.     
1a430 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64 20   /* This should 
1a440 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20 57  never happen.  W
1a450 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  e should always 
1a460 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20 20  be able to.     
1a470 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74 68   ** reacquire th
1a480 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20  e read lock */. 
1a490 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1a4a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1a4b0 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65 74  RR_UNLOCK, osGet
1a4c0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4e0 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22 2c      "winUnlock",
1a4f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
1a500 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1a510 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
1a520 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
1a530 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
1a540 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  >h, RESERVED_BYT
1a550 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d  E, 0, 1, 0);.  }
1a560 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d  .  if( locktype=
1a570 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65  =NO_LOCK && type
1a580 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  >=SHARED_LOCK ){
1a590 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52 65  .    winUnlockRe
1a5a0 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20  adLock(pFile);. 
1a5b0 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50   }.  if( type>=P
1a5c0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20  ENDING_LOCK ){. 
1a5d0 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65     winUnlockFile
1a5e0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44  (&pFile->h, PEND
1a5f0 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  ING_BYTE, 0, 1, 
1a600 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  0);.  }.  pFile-
1a610 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38 29  >locktype = (u8)
1a620 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52  locktype;.  OSTR
1a630 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69 6c  ACE(("UNLOCK fil
1a640 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72  e=%p, lock=%d, r
1a650 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1a660 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46      pFile->h, pF
1a670 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 73  ile->locktype, s
1a680 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1a690 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  )));.  return rc
1a6a0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
1a6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a6f0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1a700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a710 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
1a720 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
1a730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a740 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
1a750 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
1a760 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
1a770 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
1a780 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
1a790 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
1a7a0 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
1a7b0 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
1a7c0 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
1a7d0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
1a7e0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
1a7f0 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
1a800 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
1a810 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
1a820 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
1a830 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
1a840 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
1a850 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
1a860 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
1a870 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
1a880 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
1a890 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
1a8a0 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
1a8b0 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
1a8c0 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
1a8d0 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
1a8e0 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
1a8f0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
1a900 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
1a910 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1a920 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
1a930 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
1a940 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
1a950 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
1a960 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
1a970 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
1a980 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
1a990 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
1a9a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
1a9b0 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
1a9c0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
1a9d0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
1a9e0 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
1a9f0 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
1aa00 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
1aa10 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
1aa20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4e 6f  static int winNo
1aa30 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
1aa40 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
1aa50 6f 63 6b 74 79 70 65 29 7b 0a 20 20 55 4e 55 53  ocktype){.  UNUS
1aa60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 64 29  ED_PARAMETER(id)
1aa70 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1aa80 45 54 45 52 28 6c 6f 63 6b 74 79 70 65 29 3b 0a  ETER(locktype);.
1aa90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1aaa0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
1aab0 74 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65 63 6b  t winNolockCheck
1aac0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
1aad0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1aae0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
1aaf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ab00 28 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (id);.  UNUSED_P
1ab10 41 52 41 4d 45 54 45 52 28 70 52 65 73 4f 75 74  ARAMETER(pResOut
1ab20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1ab30 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  TE_OK;.}..static
1ab40 20 69 6e 74 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e   int winNolockUn
1ab50 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1ab60 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74  e *id, int lockt
1ab70 79 70 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ype){.  UNUSED_P
1ab80 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 20 20  ARAMETER(id);.  
1ab90 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1aba0 28 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 72 65  (locktype);.  re
1abb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1abc0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
1abd0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
1abe0 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d  he no-op lock im
1abf0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac10 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  */../*.** If *pA
1ac70 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
1ac80 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
1ac90 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
1aca0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
1acb0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
1acc0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1acd0 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
1ace0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1acf0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
1ad00 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
1ad10 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
1ad20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
1ad30 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1ad40 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
1ad50 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69 74 28  void winModeBit(
1ad60 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  winFile *pFile, 
1ad70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61  unsigned char ma
1ad80 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a  sk, int *pArg){.
1ad90 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b    if( *pArg<0 ){
1ada0 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46  .    *pArg = (pF
1adb0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
1adc0 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c   mask)!=0;.  }el
1add0 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d  se if( (*pArg)==
1ade0 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 ){.    pFile->
1adf0 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61  ctrlFlags &= ~ma
1ae00 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sk;.  }else{.   
1ae10 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1ae20 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d  s |= mask;.  }.}
1ae30 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66  ../* Forward ref
1ae40 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68  erences to VFS h
1ae50 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73  elper methods us
1ae60 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  ed for temporary
1ae70 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63   files */.static
1ae80 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e   int winGetTempn
1ae90 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ame(sqlite3_vfs 
1aea0 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73 74 61  *, char **);.sta
1aeb0 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72  tic int winIsDir
1aec0 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 3b 0a  (const void *);.
1aed0 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
1aee0 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
1aef0 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  olon(const char 
1af00 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74 72  *);../*.** Contr
1af10 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66 20  ol and query of 
1af20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68 61  the open file ha
1af30 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
1af40 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e 74 72  int winFileContr
1af50 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ol(sqlite3_file 
1af60 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69  *id, int op, voi
1af70 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69 6e 46  d *pArg){.  winF
1af80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
1af90 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53 54  nFile*)id;.  OST
1afa0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1afb0 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70 41 72  e=%p, op=%d, pAr
1afc0 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  g=%p\n", pFile->
1afd0 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b 0a 20  h, op, pArg));. 
1afe0 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
1aff0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1b000 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20  CNTL_LOCKSTATE: 
1b010 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
1b020 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63  Arg = pFile->loc
1b030 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f 53 54  ktype;.      OST
1b040 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b050 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b060 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b070 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b090 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b0a0 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
1b0b0 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
1b0c0 2a 29 70 41 72 67 20 3d 20 28 69 6e 74 29 70 46  *)pArg = (int)pF
1b0d0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
1b0e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b0f0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b100 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b110 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b130 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b140 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b150 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
1b160 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
1b170 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
1b180 67 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  g;.      OSTRACE
1b190 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b1a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1b1b0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
1b1c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b1d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1b1e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1b1f0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
1b200 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
1b210 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1b220 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
1b230 74 36 34 20 6f 6c 64 53 7a 3b 0a 20 20 20 20 20  t64 oldSz;.     
1b240 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 46     int rc = winF
1b250 69 6c 65 53 69 7a 65 28 69 64 2c 20 26 6f 6c 64  ileSize(id, &old
1b260 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Sz);.        if(
1b270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b280 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
1b290 74 65 33 5f 69 6e 74 36 34 20 6e 65 77 53 7a 20  te3_int64 newSz 
1b2a0 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = *(sqlite3_int6
1b2b0 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 20  4*)pArg;.       
1b2c0 20 20 20 69 66 28 20 6e 65 77 53 7a 3e 6f 6c 64     if( newSz>old
1b2d0 53 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Sz ){.          
1b2e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b2f0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1b300 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e          rc = win
1b310 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6e 65 77  Truncate(id, new
1b320 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Sz);.           
1b330 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b340 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1b350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b360 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
1b370 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1b380 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
1b390 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
1b3a0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1b3b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b3c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1b3d0 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b3e0 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b3f0 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b400 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b410 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b420 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b430 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1b440 41 4c 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d  AL: {.      winM
1b450 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57 49  odeBit(pFile, WI
1b460 4e 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  NFILE_PERSIST_WA
1b470 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
1b480 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1b490 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1b4a0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
1b4b0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
1b4c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b4d0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1b4e0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b4f0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b500 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 77 69 6e  ITE: {.      win
1b510 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 57  ModeBit(pFile, W
1b520 49 4e 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  INFILE_PSOW, (in
1b530 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1b540 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20  OSTRACE(("FCNTL 
1b550 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
1b560 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
1b570 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1b580 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b590 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1b5a0 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
1b5b0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
1b5c0 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
1b5d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1b5e0 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
1b5f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  ame);.      OSTR
1b600 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1b610 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1b620 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
1b630 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1b640 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1b650 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b660 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52  FCNTL_WIN32_AV_R
1b670 45 54 52 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e  ETRY: {.      in
1b680 74 20 2a 61 20 3d 20 28 69 6e 74 2a 29 70 41 72  t *a = (int*)pAr
1b690 67 3b 0a 20 20 20 20 20 20 69 66 28 20 61 5b 30  g;.      if( a[0
1b6a0 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
1b6b0 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 61  inIoerrRetry = a
1b6c0 5b 30 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  [0];.      }else
1b6d0 7b 0a 20 20 20 20 20 20 20 20 61 5b 30 5d 20 3d  {.        a[0] =
1b6e0 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 3b 0a   winIoerrRetry;.
1b6f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1b700 28 20 61 5b 31 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[1]>0 ){.    
1b710 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
1b720 79 44 65 6c 61 79 20 3d 20 61 5b 31 5d 3b 0a 20  yDelay = a[1];. 
1b730 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b740 20 20 20 20 61 5b 31 5d 20 3d 20 77 69 6e 49 6f      a[1] = winIo
1b750 65 72 72 52 65 74 72 79 44 65 6c 61 79 3b 0a 20  errRetryDelay;. 
1b760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1b770 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1b780 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1b790 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  OK\n", pFile->h)
1b7a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b7b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1b7c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1b7d0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54  _FCNTL_WIN32_GET
1b7e0 5f 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20  _HANDLE: {.     
1b7f0 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
1b800 20 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72   = (LPHANDLE)pAr
1b810 67 3b 0a 20 20 20 20 20 20 2a 70 68 46 69 6c 65  g;.      *phFile
1b820 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
1b830 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e     OSTRACE(("FCN
1b840 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  TL file=%p, rc=S
1b850 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
1b860 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
1b870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1b880 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1b890 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61  LITE_TEST.    ca
1b8a0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1b8b0 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45  WIN32_SET_HANDLE
1b8c0 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44  : {.      LPHAND
1b8d0 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48  LE phFile = (LPH
1b8e0 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20  ANDLE)pArg;.    
1b8f0 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c    HANDLE hOldFil
1b900 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  e = pFile->h;.  
1b910 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a      pFile->h = *
1b920 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70  phFile;.      *p
1b930 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65  hFile = hOldFile
1b940 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1b950 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d  ("FCNTL oldFile=
1b960 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20  %p, newFile=%p, 
1b970 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1b980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b990 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d  hOldFile, pFile-
1b9a0 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  >h));.      retu
1b9b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b9c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1b9d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1b9e0 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b  _TEMPFILENAME: {
1b9f0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46  .      char *zTF
1ba00 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  ile = 0;.      i
1ba10 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65  nt rc = winGetTe
1ba20 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
1ba30 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20  fs, &zTFile);.  
1ba40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ba50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ba60 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
1ba70 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
1ba80 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1ba90 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1baa0 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  rc=%s\n", pFile-
1bab0 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  >h, sqlite3ErrNa
1bac0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
1bad0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1bae0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1baf0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1bb00 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1bb10 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1bb20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1bb30 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1bb40 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1bb50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1bb60 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1bb70 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1bb80 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1bb90 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1bba0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1bbb0 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1bbc0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1bbd0 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d   value of newLim
1bbe0 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75  it may be eventu
1bbf0 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 53 49  ally cast to (SI
1bc00 5a 45 5f 54 29 20 61 6e 64 20 70 61 73 73 65 64  ZE_T) and passed
1bc10 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 4d 61 70  .      ** to Map
1bc20 56 69 65 77 4f 66 46 69 6c 65 28 29 2e 20 52 65  ViewOfFile(). Re
1bc30 73 74 72 69 63 74 20 69 74 73 20 76 61 6c 75 65  strict its value
1bc40 20 74 6f 20 32 47 42 20 69 66 20 28 53 49 5a 45   to 2GB if (SIZE
1bc50 5f 54 29 20 69 73 20 6e 6f 74 20 61 74 0a 20 20  _T) is not at.  
1bc60 20 20 20 20 2a 2a 20 6c 65 61 73 74 20 61 20 36      ** least a 6
1bc70 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f 0a 20  4-bit type. */. 
1bc80 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1bc90 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28 53 49  t>0 && sizeof(SI
1bca0 5a 45 5f 54 29 3c 38 20 29 7b 0a 20 20 20 20 20  ZE_T)<8 ){.     
1bcb0 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 28 6e     newLimit = (n
1bcc0 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46 46 46  ewLimit & 0x7FFF
1bcd0 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  FFFF);.      }..
1bce0 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
1bcf0 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
1bd00 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
1bd10 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
1bd20 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
1bd30 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
1bd40 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
1bd50 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1bd60 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1bd70 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
1bd80 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
1bd90 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1bda0 20 20 20 20 20 20 20 20 20 20 77 69 6e 55 6e 6d            winUnm
1bdb0 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  apfile(pFile);. 
1bdc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 69           rc = wi
1bdd0 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20  nMapfile(pFile, 
1bde0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
1bdf0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1be00 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1be10 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
1be20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
1be30 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1be40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1be50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
1be60 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 43  }.  OSTRACE(("FC
1be70 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1be80 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 5c  SQLITE_NOTFOUND\
1be90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1bea0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1beb0 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
1bec0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
1bed0 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
1bee0 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
1bef0 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
1bf00 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
1bf10 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
1bf20 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
1bf30 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
1bf40 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
1bf50 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
1bf60 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
1bf70 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
1bf80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
1bf90 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
1bfa0 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
1bfb0 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
1bfc0 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
1bfd0 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
1bfe0 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
1bff0 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
1c000 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
1c010 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
1c020 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
1c030 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
1c040 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61  for both..*/.sta
1c050 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63 74 6f  tic int winSecto
1c060 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69  rSize(sqlite3_fi
1c070 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f 69 64  le *id){.  (void
1c080 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
1c090 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1c0a0 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  TOR_SIZE;.}../*.
1c0b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74  ** Return a vect
1c0c0 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61  or of device cha
1c0d0 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f  racteristics..*/
1c0e0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44  .static int winD
1c0f0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1c100 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
1c110 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46 69 6c  e *id){.  winFil
1c120 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c 65 2a  e *p = (winFile*
1c130 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  )id;.  return SQ
1c140 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44 45 4c  LITE_IOCAP_UNDEL
1c150 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50 45 4e  ETABLE_WHEN_OPEN
1c160 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28 70 2d   |.         ((p-
1c170 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e  >ctrlFlags & WIN
1c180 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c 49 54  FILE_PSOW)?SQLIT
1c190 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
1c1a0 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29 3b 0a  E_OVERWRITE:0);.
1c1b0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73  }../*.** Windows
1c1c0 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74 20 79   will only let y
1c1d0 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65 20 76  ou create file v
1c1e0 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a 2a 20  iew mappings.** 
1c1f0 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69  on allocation si
1c200 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 62  ze granularity b
1c210 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20 44 75  oundaries..** Du
1c220 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 73 5f  ring sqlite3_os_
1c230 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61 20 47  init() we do a G
1c240 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29 0a 2a  etSystemInfo().*
1c250 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67 72 61  * to get the gra
1c260 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e 0a 2a  nularity size..*
1c270 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45 4d 5f  /.static SYSTEM_
1c280 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66 6f 3b  INFO winSysInfo;
1c290 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1c2a0 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a  _OMIT_WAL../*.**
1c2b0 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
1c2c0 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
1c2d0 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65 20 67  relinquish the g
1c2e0 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54 68 65  lobal mutex. The
1c2f0 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  .** global mutex
1c300 20 69 73 20 75 73 65 64 20 74 6f 20 70 72 6f 74   is used to prot
1c310 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63 6b 49  ect the winLockI
1c320 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73 65 64  nfo objects used
1c330 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69 6c 65   by.** this file
1c340 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d  , all of which m
1c350 61 79 20 62 65 20 73 68 61 72 65 64 20 62 79 20  ay be shared by 
1c360 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
1c370 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
1c380 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1c390 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
1c3a0 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
1c3b0 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a 2a 20  global mutex.** 
1c3c0 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
1c3d0 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
1c3e0 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
1c3f0 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1c400 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65 6d 65  ert().** stateme
1c410 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
1c420 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1c430 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
1c440 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  rt( winShmMutexH
1c450 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20 77 69  eld() );.**   wi
1c460 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1c470 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
1c480 65 33 5f 6d 75 74 65 78 20 2a 77 69 6e 42 69 67  e3_mutex *winBig
1c490 4c 6f 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63  Lock = 0;.static
1c4a0 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65   void winShmEnte
1c4b0 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20  rMutex(void){.  
1c4c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c4d0 74 65 72 28 77 69 6e 42 69 67 4c 6f 63 6b 29 3b  ter(winBigLock);
1c4e0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
1c4f0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1c500 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1c510 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 77 69 6e  _mutex_leave(win
1c520 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 23 69 66 6e  BigLock);.}.#ifn
1c530 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
1c540 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65  c int winShmMute
1c550 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
1c560 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
1c570 75 74 65 78 5f 68 65 6c 64 28 77 69 6e 42 69 67  utex_held(winBig
1c580 4c 6f 63 6b 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  Lock);.}.#endif.
1c590 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73  ./*.** Object us
1c5a0 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20  ed to represent 
1c5b0 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70  a single file op
1c5c0 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ened and mmapped
1c5d0 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73   to provide.** s
1c5e0 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57  hared memory.  W
1c5f0 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
1c600 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
1c610 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c  ce the same.** l
1c620 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68  og-summary, each
1c630 20 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20   thread has its 
1c640 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65  own winFile obje
1c650 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c  ct, but they all
1c660 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73  .** point to a s
1c670 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f  ingle instance o
1c680 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20  f this object.  
1c690 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c6a0 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d  each.** log-summ
1c6b0 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ary is opened on
1c6c0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
1c6d0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68  ess..**.** winSh
1c6e0 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  mMutexHeld() mus
1c6f0 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
1c700 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
1c710 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
1c720 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
1c730 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
1c740 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
1c750 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
1c760 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70    nRef.**      p
1c770 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  Next.**.** The f
1c780 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
1c790 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66  are read-only af
1c7a0 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69  ter the object i
1c7b0 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  s created:.**.**
1c7c0 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
1c7d0 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
1c7e0 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e  * Either winShmN
1c7f0 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
1c800 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d  e held or winShm
1c810 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
1c820 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  .** winShmMutexH
1c830 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
1c840 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
1c850 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
1c860 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
1c870 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
1c880 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e  /.struct winShmN
1c890 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ode {.  sqlite3_
1c8a0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
1c8b0 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
1c8c0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
1c8d0 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
1c8e0 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
1c8f0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1c900 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69   file */.  winFi
1c910 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20  le hFile;       
1c920 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61        /* File ha
1c930 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65  ndle from winOpe
1c940 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65  n */..  int szRe
1c950 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1c960 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
1c970 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1c980 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
1c990 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
1c9a0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
1c9b0 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
1c9c0 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79  .  u8 isReadonly
1c9d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1c9e0 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e   True if read-on
1c9f0 6c 79 20 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c  ly */.  u8 isUnl
1ca00 6f 63 6b 65 64 3b 20 20 20 20 20 20 20 20 20 20  ocked;          
1ca10 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
1ca20 20 44 4d 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a   DMS lock held *
1ca30 2f 0a 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52  /..  struct ShmR
1ca40 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44  egion {.    HAND
1ca50 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
1ca60 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
1ca70 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46  dle from CreateF
1ca80 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ileMapping */.  
1ca90 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20    void *pMap;.  
1caa0 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57  } *aRegion;.  DW
1cab0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
1cac0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cad0 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72  Windows errno fr
1cae0 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20  om the last I/O 
1caf0 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20  error */..  int 
1cb00 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1cb10 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cb20 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63   of winShm objec
1cb30 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1cb40 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  his */.  winShm 
1cb50 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1cb60 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68      /* All winSh
1cb70 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1cb80 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
1cb90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78  winShmNode *pNex
1cba0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  t;         /* Ne
1cbb0 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  xt in list of al
1cbc0 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
1cbd0 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
1cbe0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1cbf0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1cc00 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1cc10 45 29 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  E).  u8 nextShmI
1cc20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1cc30 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
1cc40 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
1cc50 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1cc60 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
1cc70 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
1cc80 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
1cc90 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
1cca0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1ccb0 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
1ccc0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1ccd0 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
1cce0 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
1ccf0 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
1cd00 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
1cd10 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
1cd20 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
1cd30 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
1cd40 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
1cd50 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
1cd60 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
1cd70 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1cd80 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
1cd90 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
1cda0 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
1cdb0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
1cdc0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
1cdd0 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
1cde0 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
1cdf0 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
1ce00 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1ce10 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1ce20 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
1ce30 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
1ce40 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1ce50 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1ce60 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1ce70 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1ce80 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
1ce90 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1cea0 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
1ceb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
1cec0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1ced0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
1cee0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1cef0 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
1cf00 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
1cf10 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
1cf20 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
1cf30 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1cf40 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
1cf50 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
1cf60 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
1cf70 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
1cf80 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1cf90 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1cfa0 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
1cfb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1cfc0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1cfd0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
1cfe0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1cff0 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1d000 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
1d010 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69  OS_TRACE).  u8 i
1d020 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1d030 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1d040 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1d050 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
1d060 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
1d070 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
1d080 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
1d090 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
1d0a0 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
1d0b0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1d0c0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
1d0d0 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
1d0e0 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
1d0f0 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
1d100 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
1d110 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
1d120 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
1d130 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
1d140 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1d150 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
1d160 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
1d170 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48  */.#define WINSH
1d180 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69  M_UNLCK  1.#defi
1d190 6e 65 20 57 49 4e 53 48 4d 5f 52 44 4c 43 4b 20  ne WINSHM_RDLCK 
1d1a0 20 32 0a 23 64 65 66 69 6e 65 20 57 49 4e 53 48   2.#define WINSH
1d1b0 4d 5f 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69  M_WRLCK  3.stati
1d1c0 63 20 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74  c int winShmSyst
1d1d0 65 6d 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d  emLock(.  winShm
1d1e0 4e 6f 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  Node *pFile,    
1d1f0 2f 2a 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74  /* Apply locks t
1d200 6f 20 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72  o this open shar
1d210 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1d220 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54  t */.  int lockT
1d230 79 70 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ype,         /* 
1d240 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  WINSHM_UNLCK, WI
1d250 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f 72 20 57  NSHM_RDLCK, or W
1d260 49 4e 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a 20  INSHM_WRLCK */. 
1d270 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1d280 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1d290 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
1d2a0 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c 6f  o be locked/unlo
1d2b0 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  cked */.  int nB
1d2c0 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20  yte             
1d2d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1d2e0 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  es to lock or un
1d2f0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  lock */.){.  int
1d300 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1d310 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
1d320 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c 6f  e form Lock/Unlo
1d330 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a 20  ckFileEx() */.. 
1d340 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68   /* Access to th
1d350 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  e winShmNode obj
1d360 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
1d370 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1d380 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
1d390 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 73  le->nRef==0 || s
1d3a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1d3b0 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20  d(pFile->mutex) 
1d3c0 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
1d3d0 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  SHM-LOCK file=%p
1d3e0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73 65  , lock=%d, offse
1d3f0 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e 22  t=%d, size=%d\n"
1d400 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1d410 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f 63  le->hFile.h, loc
1d420 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42 79  kType, ofst, nBy
1d430 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65  te));..  /* Rele
1d440 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65 20  ase/Acquire the 
1d450 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1d460 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 54  k */.  if( lockT
1d470 79 70 65 3d 3d 57 49 4e 53 48 4d 5f 55 4e 4c 43  ype==WINSHM_UNLC
1d480 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  K ){.    rc = wi
1d490 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
1d4a0 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73  le->hFile.h, ofs
1d4b0 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b  t, 0, nByte, 0);
1d4c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d4d0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1d4e0 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65  locking paramete
1d4f0 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  rs */.    DWORD 
1d500 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49  dwFlags = LOCKFI
1d510 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
1d520 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63  ELY;.    if( loc
1d530 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d 5f  kType == WINSHM_
1d540 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
1d550 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
1d560 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
1d570 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
1d580 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
1d590 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c  , dwFlags, ofst,
1d5a0 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1d5b0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30   }..  if( rc!= 0
1d5c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1d5d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1d5e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1d5f0 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
1d600 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
1d610 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1d620 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1d630 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1d640 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72  %p, func=%s, err
1d650 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22  no=%lu, rc=%s\n"
1d660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1d670 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f  le->hFile.h, (lo
1d680 63 6b 54 79 70 65 20 3d 3d 20 57 49 4e 53 48 4d  ckType == WINSHM
1d690 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e  _UNLCK) ? "winUn
1d6a0 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20  lockFile" :.    
1d6b0 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46         "winLockF
1d6c0 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  ile", pFile->las
1d6d0 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45  tErrno, sqlite3E
1d6e0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20  rrName(rc)));.. 
1d6f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d700 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
1d710 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68  nces to VFS meth
1d720 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ods */.static in
1d730 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65  t winOpen(sqlite
1d740 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61  3_vfs*,const cha
1d750 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  r*,sqlite3_file*
1d760 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74  ,int,int*);.stat
1d770 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65  ic int winDelete
1d780 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63  (sqlite3_vfs *,c
1d790 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b  onst char*,int);
1d7a0 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
1d7b0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  e winShmNodeList
1d7c0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
1d7d0 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d  ries with winShm
1d7e0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a  Node.nRef==0..**
1d7f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20  .** This is not 
1d800 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  a VFS shared-mem
1d810 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69  ory method; it i
1d820 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63  s a utility func
1d830 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62  tion called.** b
1d840 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d  y VFS shared-mem
1d850 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  ory methods..*/.
1d860 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1d870 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f  hmPurge(sqlite3_
1d880 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64  vfs *pVfs, int d
1d890 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69  eleteFlag){.  wi
1d8a0 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20  nShmNode **pp;. 
1d8b0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a   winShmNode *p;.
1d8c0 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d    assert( winShm
1d8d0 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20  MutexHeld() );. 
1d8e0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
1d8f0 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65  URGE pid=%lu, de
1d900 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a  leteFlag=%d\n",.
1d910 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1d920 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1d930 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29  (), deleteFlag))
1d940 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d  ;.  pp = &winShm
1d950 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  NodeList;.  whil
1d960 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20  e( (p = *pp)!=0 
1d970 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52  ){.    if( p->nR
1d980 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ef==0 ){.      i
1d990 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
1d9a0 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69  p->mutex ){ sqli
1d9b0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
1d9c0 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20  ->mutex); }.    
1d9d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1d9e0 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20  nRegion; i++){. 
1d9f0 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20         BOOL bRc 
1da00 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  = osUnmapViewOfF
1da10 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69  ile(p->aRegion[i
1da20 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20  ].pMap);.       
1da30 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50   OSTRACE(("SHM-P
1da40 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25  URGE-UNMAP pid=%
1da50 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72  lu, region=%d, r
1da60 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1da70 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
1da80 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
1da90 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22  ), i, bRc ? "ok"
1daa0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1dab0 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41         UNUSED_VA
1dac0 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63  RIABLE_VALUE(bRc
1dad0 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d  );.        bRc =
1dae0 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
1daf0 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61  ->aRegion[i].hMa
1db00 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
1db10 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
1db20 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72  CLOSE pid=%lu, r
1db30 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
1db40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1db50 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1db60 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1db70 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1db80 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1db90 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1dba0 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1dbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1dbc0 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c  p->hFile.h!=NULL
1dbd0 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d   && p->hFile.h!=
1dbe0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
1dbf0 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALUE ){.        
1dc00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1dc10 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1dc20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69    winClose((sqli
1dc30 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68  te3_file *)&p->h
1dc40 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53  File);.        S
1dc50 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1dc60 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d  nign(0);.      }
1dc70 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65 74  .      if( delet
1dc80 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  eFlag ){.       
1dc90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1dca0 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1dcb0 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
1dcc0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
1dcd0 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65         winDelete
1dce0 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e  (pVfs, p->zFilen
1dcf0 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ame, 0);.       
1dd00 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
1dd10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
1dd20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1dd30 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
1dd40 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
1dd50 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20   p->pNext;.     
1dd60 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
1dd70 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  >aRegion);.     
1dd80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1dd90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1dda0 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78     pp = &p->pNex
1ddb0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
1ddc0 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20 6c 6f  /*.** The DMS lo
1ddd0 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ck has not yet b
1dde0 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73 68 6d  een taken on shm
1ddf0 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65 2e 20   file pShmNode. 
1de00 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 74 61  Attempt to.** ta
1de10 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74 75 72  ke it now. Retur
1de20 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
1de30 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
1de40 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
1de50 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
1de60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 44 4d  .**.** If the DM
1de70 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b  S cannot be lock
1de80 65 64 20 62 65 63 61 75 73 65 20 74 68 69 73 20  ed because this 
1de90 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f 73 68  is a readonly_sh
1dea0 6d 3d 31 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  m=1.** connectio
1deb0 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70  n and no other p
1dec0 72 6f 63 65 73 73 20 61 6c 72 65 61 64 79 20 68  rocess already h
1ded0 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74  olds a lock, ret
1dee0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45  urn.** SQLITE_RE
1def0 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20  ADONLY_CANTINIT 
1df00 61 6e 64 20 73 65 74 20 70 53 68 6d 4e 6f 64 65  and set pShmNode
1df10 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a  ->isUnlocked=1..
1df20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1df30 6e 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  nLockSharedMemor
1df40 79 28 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53  y(winShmNode *pS
1df50 68 6d 4e 6f 64 65 29 7b 0a 20 20 69 6e 74 20 72  hmNode){.  int r
1df60 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  c = winShmSystem
1df70 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1df80 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49 4e  INSHM_WRLCK, WIN
1df90 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 0a 20  _SHM_DMS, 1);.. 
1dfa0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dfb0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53  OK ){.    if( pS
1dfc0 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
1dfd0 6c 79 20 29 7b 0a 20 20 20 20 20 20 70 53 68 6d  ly ){.      pShm
1dfe0 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64  Node->isUnlocked
1dff0 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 69 6e 53   = 1;.      winS
1e000 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1e010 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e  mNode, WINSHM_UN
1e020 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1e030 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 1);.      retu
1e040 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
1e050 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20 20  LY_CANTINIT;.   
1e060 20 7d 65 6c 73 65 20 69 66 28 20 77 69 6e 54 72   }else if( winTr
1e070 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f  uncate((sqlite3_
1e080 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  file*)&pShmNode-
1e090 3e 68 46 69 6c 65 2c 20 30 29 20 29 7b 0a 20 20  >hFile, 0) ){.  
1e0a0 20 20 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d      winShmSystem
1e0b0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57  Lock(pShmNode, W
1e0c0 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e  INSHM_UNLCK, WIN
1e0d0 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
1e0e0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
1e0f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e100 45 52 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47  ERR_SHMOPEN, osG
1e110 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e130 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b          "winLock
1e140 53 68 61 72 65 64 4d 65 6d 6f 72 79 22 2c 20 70  SharedMemory", p
1e150 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1e160 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  me);.    }.  }..
1e170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e180 5f 4f 4b 20 29 7b 0a 20 20 20 20 77 69 6e 53 68  _OK ){.    winSh
1e190 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e1a0 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c  Node, WINSHM_UNL
1e1b0 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c  CK, WIN_SHM_DMS,
1e1c0 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   1);.  }..  retu
1e1d0 72 6e 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  rn winShmSystemL
1e1e0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 57 49  ock(pShmNode, WI
1e1f0 4e 53 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f  NSHM_RDLCK, WIN_
1e200 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 7d 0a 0a  SHM_DMS, 1);.}..
1e210 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73  /*.** Open the s
1e220 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
1e230 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1e240 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
1e250 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  pDbFd..**.** Whe
1e260 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20  n opening a new 
1e270 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1e280 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  le, if no other 
1e290 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61  instances of tha
1e2a0 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75  t.** file are cu
1e2b0 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e  rrently open, in
1e2c0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72   this process or
1e2d0 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73   in other proces
1e2e0 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ses, then.** the
1e2f0 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72   file must be tr
1e300 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1e310 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69  length or have i
1e320 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65  ts header cleare
1e330 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1e340 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65   winOpenSharedMe
1e350 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44  mory(winFile *pD
1e360 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77  bFd){.  struct w
1e370 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  inShm *p;       
1e380 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e390 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
1e3a0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 77  be opened */.  w
1e3b0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  inShmNode *pShmN
1e3c0 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ode = 0;        
1e3d0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1e3e0 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ing mmapped file
1e3f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
1e400 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
1e410 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
1e420 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 77 69 6e  lt code */.  win
1e430 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b 20 20  ShmNode *pNew;  
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e450 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  /* Newly allocat
1e460 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f  ed winShmNode */
1e470 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20  .  int nName;   
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1e4a0 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20   zName in bytes 
1e4b0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44  */..  assert( pD
1e4c0 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20  bFd->pShm==0 ); 
1e4d0 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f     /* Not previo
1e4e0 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a  usly opened */..
1e4f0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70    /* Allocate sp
1e500 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ace for the new 
1e510 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65  sqlite3_shm obje
1e520 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c  ct.  Also specul
1e530 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c  atively.  ** all
1e540 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
1e550 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65  a new winShmNode
1e560 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20   and filename.. 
1e570 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65   */.  p = sqlite
1e580 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
1e590 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1e5a0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
1e5b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1e5c0 4d 5f 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20  M_BKPT;.  nName 
1e5d0 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
1e5e0 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  0(pDbFd->zPath);
1e5f0 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
1e600 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
1e610 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
1e620 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20   nName + 17 );. 
1e630 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
1e640 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1e650 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
1e660 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1e670 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  EM_BKPT;.  }.  p
1e680 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  New->zFilename =
1e690 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
1e6a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
1e6b0 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70  intf(nName+15, p
1e6c0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  New->zFilename, 
1e6d0 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d  "%s-shm", pDbFd-
1e6e0 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74  >zPath);.  sqlit
1e6f0 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
1e700 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77  bFd->zPath, pNew
1e710 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20  ->zFilename);.. 
1e720 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20   /* Look to see 
1e730 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 65  if there is an e
1e740 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f  xisting winShmNo
1e750 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  de that can be u
1e760 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20  sed..  ** If no 
1e770 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e  matching winShmN
1e780 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78  ode currently ex
1e790 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e  ists, create a n
1e7a0 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77  ew one..  */.  w
1e7b0 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28  inShmEnterMutex(
1e7c0 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64  );.  for(pShmNod
1e7d0 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  e = winShmNodeLi
1e7e0 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53  st; pShmNode; pS
1e7f0 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d  hmNode=pShmNode-
1e800 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20  >pNext){.    /* 
1e810 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65  TBD need to come
1e820 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72 20   up with better 
1e830 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65 72  match here.  Per
1e840 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20  haps.    ** use 
1e850 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52  FILE_ID_BOTH_DIR
1e860 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e  _INFO Structure.
1e870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1e880 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
1e890 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
1e8a0 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  me, pNew->zFilen
1e8b0 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
1e8c0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
1e8d0 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ode ){.    sqlit
1e8e0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1e8f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1e900 69 6e 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  inFlags = SQLITE
1e910 5f 4f 50 45 4e 5f 57 41 4c 3b 0a 20 20 20 20 69  _OPEN_WAL;.    i
1e920 6e 74 20 6f 75 74 46 6c 61 67 73 20 3d 20 30 3b  nt outFlags = 0;
1e930 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  ..    pShmNode =
1e940 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20   pNew;.    pNew 
1e950 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69  = 0;.    ((winFi
1e960 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e  le*)(&pShmNode->
1e970 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56  hFile))->h = INV
1e980 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
1e990 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  E;.    pShmNode-
1e9a0 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e  >pNext = winShmN
1e9b0 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e  odeList;.    win
1e9c0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53  ShmNodeList = pS
1e9d0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 69 66 28  hmNode;..    if(
1e9e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1e9f0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
1ea00 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  ){.      pShmNod
1ea10 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1ea20 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1ea30 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1ea40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
1ea50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
1ea60 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ea70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1ea80 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
1ea90 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1eaa0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
1eab0 7d 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  }..    if( 0==sq
1eac0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1ead0 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  n(pDbFd->zPath, 
1eae0 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20  "readonly_shm", 
1eaf0 30 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 46 6c  0) ){.      inFl
1eb00 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
1eb10 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
1eb20 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1eb30 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  E;.    }else{.  
1eb40 20 20 20 20 69 6e 46 6c 61 67 73 20 7c 3d 20 53      inFlags |= S
1eb50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
1eb60 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NLY;.    }.    r
1eb70 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46  c = winOpen(pDbF
1eb80 64 2d 3e 70 56 66 73 2c 20 70 53 68 6d 4e 6f 64  d->pVfs, pShmNod
1eb90 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  e->zFilename,.  
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1ebb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70  sqlite3_file*)&p
1ebc0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 0a  ShmNode->hFile,.
1ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebe0 20 69 6e 46 6c 61 67 73 2c 20 26 6f 75 74 46 6c   inFlags, &outFl
1ebf0 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ags);.    if( rc
1ec00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ec10 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1ec20 45 72 72 6f 72 28 72 63 2c 20 6f 73 47 65 74 4c  Error(rc, osGetL
1ec30 61 73 74 45 72 72 6f 72 28 29 2c 20 22 77 69 6e  astError(), "win
1ec40 4f 70 65 6e 53 68 6d 22 2c 0a 20 20 20 20 20 20  OpenShm",.      
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec60 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1ec70 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74  name);.      got
1ec80 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1ec90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 75      }.    if( ou
1eca0 74 46 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 4f  tFlags==SQLITE_O
1ecb0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 20 70  PEN_READONLY ) p
1ecc0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
1ecd0 6e 6c 79 20 3d 20 31 3b 0a 0a 20 20 20 20 72 63  nly = 1;..    rc
1ece0 20 3d 20 77 69 6e 4c 6f 63 6b 53 68 61 72 65 64   = winLockShared
1ecf0 4d 65 6d 6f 72 79 28 70 53 68 6d 4e 6f 64 65 29  Memory(pShmNode)
1ed00 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ed10 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1ed20 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
1ed30 41 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73  ANTINIT ) goto s
1ed40 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d  hm_open_err;.  }
1ed50 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
1ed60 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
1ed70 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69   child of the wi
1ed80 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  nShmNode */.  p-
1ed90 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
1eda0 4e 6f 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65  Node;.#if define
1edb0 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1edc0 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1edd0 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29  E_HAVE_OS_TRACE)
1ede0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
1edf0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
1ee00 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
1ee10 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
1ee20 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
1ee30 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1ee40 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
1ee50 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1ee60 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
1ee70 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
1ee80 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
1ee90 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
1eea0 20 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72   the winShmEnter
1eeb0 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
1eec0 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
1eed0 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
1eee0 28 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20  (struct winShm) 
1eef0 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
1ef00 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
1ef10 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
1ef20 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
1ef30 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
1ef40 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
1ef50 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
1ef60 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
1ef70 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1ef80 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
1ef90 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
1efa0 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
1efb0 3e 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65  >mutex.  ** mute
1efc0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
1efd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1efe0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1eff0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
1f000 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
1f010 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1f020 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
1f030 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1f040 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1f050 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
1f060 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
1f070 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
1f080 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77 69 6e 53  open_err:.  winS
1f090 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1f0a0 6d 4e 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 55 4e  mNode, WINSHM_UN
1f0b0 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1f0c0 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50 75  , 1);.  winShmPu
1f0d0 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73 2c  rge(pDbFd->pVfs,
1f0e0 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68 69   0);      /* Thi
1f0f0 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68  s call frees pSh
1f100 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65  mNode if require
1f110 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  d */.  sqlite3_f
1f120 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ree(p);.  sqlite
1f130 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  3_free(pNew);.  
1f140 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1f150 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
1f160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1f170 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
1f180 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
1f190 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
1f1a0 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67 65  lying.** storage
1f1b0 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
1f1c0 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1f1d0 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d 61  c int winShmUnma
1f1e0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
1f1f0 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
1f200 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1f210 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
1f220 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74  y */.  int delet
1f230 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  eFlag           
1f240 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74 65    /* Delete afte
1f250 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72 75  r closing if tru
1f260 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  e */.){.  winFil
1f270 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1f280 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64  /* Database hold
1f290 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1f2a0 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  y */.  winShm *p
1f2b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1f2c0 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1f2d0 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20  o be closed */. 
1f2e0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1f2f0 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75 6e  mNode; /* The un
1f300 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d  derlying shared-
1f310 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20  memory file */. 
1f320 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20 20   winShm **pp;   
1f330 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f         /* For lo
1f340 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69  oping over sibli
1f350 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1f360 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77 69  /..  pDbFd = (wi
1f370 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d  nFile*)fd;.  p =
1f380 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1f390 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1f3a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
1f3b0 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
1f3c0 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65 6d  mNode;..  /* Rem
1f3d0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
1f3e0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
1f3f0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
1f400 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
1f410 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
1f420 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1f430 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
1f440 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
1f450 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1f460 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
1f470 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
1f480 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
1f490 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
1f4a0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
1f4b0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
1f4c0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
1f4d0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
1f4e0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
1f4f0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1f500 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
1f510 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
1f520 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
1f530 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
1f540 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
1f550 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
1f560 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  /.  winShmEnterM
1f570 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1f580 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
1f590 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
1f5a0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
1f5b0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
1f5c0 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d 50  0 ){.    winShmP
1f5d0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1f5e0 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a 20  , deleteFlag);. 
1f5f0 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65   }.  winShmLeave
1f600 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
1f610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1f620 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
1f630 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
1f640 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
1f650 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61   segment..*/.sta
1f660 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c 6f  tic int winShmLo
1f670 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
1f680 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1f690 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
1f6a0 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
1f6b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
1f6c0 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1f6e0 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
1f6f0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
1f700 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
1f710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f720 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
1f730 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
1f740 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1f750 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
1f760 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
1f770 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
1f780 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e  lock */.){.  win
1f790 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77  File *pDbFd = (w
1f7a0 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  inFile*)fd;     
1f7b0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1f7c0 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
1f7d0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53  memory */.  winS
1f7e0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
1f7f0 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1f800 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
1f810 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
1f820 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  ked */.  winShm 
1f830 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
1f840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f850 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1f860 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
1f870 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1f880 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
1f890 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
1f8a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
1f8d0 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
1f8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
1f900 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
1f910 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
1f920 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  /..  assert( ofs
1f930 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
1f940 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
1f950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
1f960 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
1f970 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1f980 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1f990 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
1f9a0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
1f9b0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
1f9c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
1f9d0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
1f9e0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1f9f0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
1fa00 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
1fa10 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1fa20 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1fa30 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1fa40 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
1fa50 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
1fa60 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
1fa70 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
1fa80 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
1fa90 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73 74  (u16)((1U<<(ofst
1faa0 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73 74  +n)) - (1U<<ofst
1fab0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  ));.  assert( n>
1fac0 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
1fad0 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
1fae0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
1faf0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
1fb00 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
1fb10 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1fb20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
1fb30 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
1fb40 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1fb50 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
1fb60 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
1fb70 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
1fb80 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
1fb90 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
1fba0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
1fbb0 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
1fbc0 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
1fbd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1fbe0 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
1fbf0 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
1fc00 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
1fc10 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
1fc20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
1fc30 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
1fc40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
1fc50 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1fc60 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
1fc70 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
1fc80 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
1fc90 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73    rc = winShmSys
1fca0 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1fcb0 2c 20 57 49 4e 53 48 4d 5f 55 4e 4c 43 4b 2c 20  , WINSHM_UNLCK, 
1fcc0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1fcd0 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
1fce0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1fcf0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
1fd00 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
1fd10 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
1fd20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1fd30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1fd40 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
1fd50 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
1fd60 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
1fd70 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
1fd80 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
1fd90 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a  E_SHM_SHARED ){.
1fda0 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65      u16 allShare
1fdb0 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e  d = 0;  /* Union
1fdc0 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1fdd0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1fde0 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1fdf0 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74  .    /* Find out
1fe00 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f   which shared lo
1fe10 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  cks are already 
1fe20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20  held by sibling 
1fe30 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20  connections..   
1fe40 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1fe50 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1fe60 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1fe70 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1fe80 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53   return.    ** S
1fe90 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20  QLITE_BUSY..    
1fea0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
1feb0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
1fec0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
1fed0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
1fee0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
1fef0 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
1ff00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1ff10 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
1ff20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1ff30 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d  allShared |= pX-
1ff40 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
1ff50 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73   }..    /* Get s
1ff60 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1ff70 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1ff80 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1ff90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ffa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ffb0 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26  if( (allShared &
1ffc0 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20   mask)==0 ){.   
1ffd0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1ffe0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1fff0 6f 64 65 2c 20 57 49 4e 53 48 4d 5f 52 44 4c 43  ode, WINSHM_RDLC
20000 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
20010 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
20020 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
20030 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
20040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
20050 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
20060 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
20070 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
20080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20090 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
200a0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
200b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
200c0 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
200d0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
200e0 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
200f0 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
20100 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
20110 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
20120 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
20130 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
20140 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
20150 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
20160 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
20170 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
20180 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
20190 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
201a0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
201b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
201c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
201d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
201e0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
201f0 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
20200 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
20210 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
20220 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
20230 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
20240 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
20250 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
20260 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
20270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
20280 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20290 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
202a0 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
202b0 57 49 4e 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66  WINSHM_WRLCK, of
202c0 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c  st+WIN_SHM_BASE,
202d0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
202e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
202f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20300 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
20310 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
20320 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
20330 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
20340 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
20350 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20360 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
20370 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
20380 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75  SHM-LOCK pid=%lu
20390 2c 20 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d  , id=%d, sharedM
203a0 61 73 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61  ask=%03x, exclMa
203b0 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e  sk=%03x, rc=%s\n
203c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
203d0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
203e0 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d  sId(), p->id, p-
203f0 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
20400 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20  exclMask,.      
20410 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e       sqlite3ErrN
20420 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
20430 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20440 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
20450 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
20460 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
20470 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a  hared memory..**
20480 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
20490 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
204a0 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
204b0 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
204c0 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
204d0 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
204e0 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
204f0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
20500 6f 69 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65  oid winShmBarrie
20510 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
20520 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f  e *fd          /
20530 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69  * Database holdi
20540 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
20550 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55  mory */.){.  UNU
20560 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
20570 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f  );.  sqlite3Memo
20580 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 2f  ryBarrier();   /
20590 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e  * compiler-defin
205a0 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65  ed memory barrie
205b0 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74  r */.  winShmEnt
205c0 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  erMutex();      
205d0 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20   /* Also mutex, 
205e0 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a  for redundancy *
205f0 2f 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  /.  winShmLeaveM
20600 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  utex();.}../*.**
20610 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
20620 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
20630 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
20640 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
20650 66 20 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d  f the.** shared-
20660 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
20670 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  d with the datab
20680 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61  ase file fd. Sha
20690 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
206a0 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  ns.** are number
206b0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
206c0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
206d0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
206e0 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20   is szRegion.** 
206f0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
20700 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
20710 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
20720 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
20730 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
20740 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
20750 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
20760 68 65 20 69 73 57 72 69 74 65 20 70 61 72 61 6d  he isWrite param
20770 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
20780 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
20790 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
207a0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
207b0 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
207c0 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
207d0 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
207e0 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
207f0 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
20800 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
20810 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
20820 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a  K returned. If.*
20830 2a 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e  * isWrite is non
20840 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
20850 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
20860 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
20870 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e   not yet.** been
20880 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
20890 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
208a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
208b0 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
208c0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
208d0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
208e0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
208f0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
20900 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
20910 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
20920 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
20930 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
20940 73 73 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20  sses.** address 
20950 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73 20  space (if it is 
20960 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70  not already), *p
20970 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  p is set to poin
20980 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a  t to the mapped.
20990 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  ** memory and SQ
209a0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
209b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
209c0 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  winShmMap(.  sql
209d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
209e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
209f0 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
20a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
20a10 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
20a40 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
20a50 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
20a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20a70 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
20a80 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65  */.  int isWrite
20a90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20aa0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
20ab0 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
20ac0 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
20ad0 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
20ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20af0 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
20b00 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46  ory */.){.  winF
20b10 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69  ile *pDbFd = (wi
20b20 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e  nFile*)fd;.  win
20b30 53 68 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46  Shm *pShm = pDbF
20b40 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68  d->pShm;.  winSh
20b50 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
20b60 0a 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63 74  .  DWORD protect
20b70 20 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54   = PAGE_READWRIT
20b80 45 3b 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73  E;.  DWORD flags
20b90 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54   = FILE_MAP_WRIT
20ba0 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
20bb0 44 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  D;.  int rc = SQ
20bc0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
20bd0 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72 63 20  !pShm ){.    rc 
20be0 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  = winOpenSharedM
20bf0 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20  emory(pDbFd);.  
20c00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20c10 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
20c20 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44 62 46  .    pShm = pDbF
20c30 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20 70  d->pShm;.  }.  p
20c40 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d 3e  ShmNode = pShm->
20c50 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c  pShmNode;..  sql
20c60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
20c70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
20c80 29 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  );.  if( pShmNod
20c90 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b  e->isUnlocked ){
20ca0 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63  .    rc = winLoc
20cb0 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 53  kSharedMemory(pS
20cc0 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  hmNode);.    if(
20cd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20ce0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
20cf0 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  t;.    pShmNode-
20d00 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b  >isUnlocked = 0;
20d10 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73  .  }.  assert( s
20d20 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
20d30 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
20d40 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
20d50 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53  ==0 );..  if( pS
20d60 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
20d70 3d 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  =iRegion ){.    
20d80 73 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e  struct ShmRegion
20d90 20 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20   *apNew;        
20da0 20 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f     /* New aRegio
20db0 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
20dc0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52   int nByte = (iR
20dd0 65 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f  egion+1)*szRegio
20de0 6e 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  n;  /* Minimum r
20df0 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
20e00 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
20e10 5f 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20  _int64 sz;      
20e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
20e30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77  urrent size of w
20e40 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f  al-index file */
20e50 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
20e60 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
20e70 69 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  ion;..    /* The
20e80 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
20e90 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20  n is not mapped 
20ea0 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73  into this proces
20eb0 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63  ses address spac
20ec0 65 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  e..    ** Check 
20ed0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
20ee0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
20ef0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
20f00 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
20f10 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
20f20 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
20f30 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
20f40 6f 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  on)..    */.    
20f50 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
20f60 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  ((sqlite3_file *
20f70 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
20f80 65 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28  e, &sz);.    if(
20f90 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20fa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  {.      rc = win
20fb0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20fc0 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f  IOERR_SHMSIZE, o
20fd0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
20fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ff0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
21000 61 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap1", pDbFd->zPa
21010 74 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  th);.      goto 
21020 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
21030 20 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e   }..    if( sz<n
21040 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Byte ){.      /*
21050 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   The requested m
21060 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65  emory region doe
21070 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20  s not exist. If 
21080 69 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74  isWrite is set t
21090 6f 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c  o.      ** zero,
210a0 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
210b0 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
210c0 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
210d0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
210e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41     **.      ** A
210f0 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66  lternatively, if
21100 20 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d   isWrite is non-
21110 7a 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63  zero, use ftrunc
21120 61 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74  ate() to allocat
21130 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72  e.      ** the r
21140 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
21150 72 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  region..      */
21160 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72  .      if( !isWr
21170 69 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61  ite ) goto shmpa
21180 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63  ge_out;.      rc
21190 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28   = winTruncate((
211a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26  sqlite3_file *)&
211b0 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c  pShmNode->hFile,
211c0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
211d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
211e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
211f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21200 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
21210 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  E, osGetLastErro
21220 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
21240 69 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46  inShmMap2", pDbF
21250 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
21260 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
21270 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
21280 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
21290 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
212a0 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
212b0 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
212c0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
212d0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74  .    apNew = (st
212e0 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a  ruct ShmRegion *
212f0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
21300 36 34 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  64(.        pShm
21310 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28  Node->aRegion, (
21320 69 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f  iRegion+1)*sizeo
21330 66 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20  f(apNew[0]).    
21340 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
21350 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
21360 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21370 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
21380 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
21390 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
213a0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 20 3d 20 61  ode->aRegion = a
213b0 70 4e 65 77 3b 0a 0a 20 20 20 20 69 66 28 20 70  pNew;..    if( p
213c0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
213d0 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  nly ){.      pro
213e0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
213f0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 6c 61 67  ONLY;.      flag
21400 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  s = FILE_MAP_REA
21410 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68  D;.    }..    wh
21420 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
21430 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
21440 29 7b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20  ){.      HANDLE 
21450 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 20 20 20 20  hMap = NULL;    
21460 20 20 20 20 20 2f 2a 20 66 69 6c 65 2d 6d 61 70       /* file-map
21470 70 69 6e 67 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  ping handle */. 
21480 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 20       void *pMap 
21490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
214a0 20 2f 2a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72   /* Mapped memor
214b0 79 20 72 65 67 69 6f 6e 20 2a 2f 0a 0a 23 69 66  y region */..#if
214c0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
214d0 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73  .      hMap = os
214e0 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
214f0 67 46 72 6f 6d 41 70 70 28 70 53 68 6d 4e 6f 64  gFromApp(pShmNod
21500 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20 20 20 20  e->hFile.h,.    
21510 20 20 20 20 20 20 4e 55 4c 4c 2c 20 70 72 6f 74        NULL, prot
21520 65 63 74 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  ect, nByte, NULL
21530 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
21540 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
21550 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
21560 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
21570 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57  eateFileMappingW
21580 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
21590 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
215a0 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 30 2c 20  LL, protect, 0, 
215b0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
215c0 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
215d0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
215e0 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c  HAS_ANSI) && SQL
215f0 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
21600 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 20  FILEMAPPINGA.   
21610 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
21620 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70  teFileMappingA(p
21630 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
21640 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
21650 2c 20 70 72 6f 74 65 63 74 2c 20 30 2c 20 6e 42  , protect, 0, nB
21660 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20 20 20  yte, NULL.      
21670 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
21680 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41  OSTRACE(("SHM-MA
21690 50 2d 43 52 45 41 54 45 20 70 69 64 3d 25 6c 75  P-CREATE pid=%lu
216a0 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 73 69 7a  , region=%d, siz
216b0 65 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  e=%d, rc=%s\n",.
216c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
216d0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
216e0 73 73 49 64 28 29 2c 20 70 53 68 6d 4e 6f 64 65  ssId(), pShmNode
216f0 2d 3e 6e 52 65 67 69 6f 6e 2c 20 6e 42 79 74 65  ->nRegion, nByte
21700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21710 20 68 4d 61 70 20 3f 20 22 6f 6b 22 20 3a 20 22   hMap ? "ok" : "
21720 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
21730 20 69 66 28 20 68 4d 61 70 20 29 7b 0a 20 20 20   if( hMap ){.   
21740 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74       int iOffset
21750 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65   = pShmNode->nRe
21760 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20  gion*szRegion;. 
21770 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 73         int iOffs
21780 65 74 53 68 69 66 74 20 3d 20 69 4f 66 66 73 65  etShift = iOffse
21790 74 20 25 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64  t % winSysInfo.d
217a0 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75  wAllocationGranu
217b0 6c 61 72 69 74 79 3b 0a 23 69 66 20 53 51 4c 49  larity;.#if SQLI
217c0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
217d0 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
217e0 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
217f0 70 28 68 4d 61 70 2c 20 66 6c 61 67 73 2c 0a 20  p(hMap, flags,. 
21800 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 73             iOffs
21810 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68 69 66  et - iOffsetShif
21820 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20 69 4f  t, szRegion + iO
21830 66 66 73 65 74 53 68 69 66 74 0a 20 20 20 20 20  ffsetShift.     
21840 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20     );.#else.    
21850 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d 61 70      pMap = osMap
21860 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61 70 2c  ViewOfFile(hMap,
21870 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20   flags,.        
21880 20 20 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d      0, iOffset -
21890 20 69 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73   iOffsetShift, s
218a0 7a 52 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65  zRegion + iOffse
218b0 74 53 68 69 66 74 0a 20 20 20 20 20 20 20 20 29  tShift.        )
218c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
218d0 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d   OSTRACE(("SHM-M
218e0 41 50 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  AP-MAP pid=%lu, 
218f0 72 65 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65  region=%d, offse
21900 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  t=%d, size=%d, r
21910 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
21920 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
21930 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21940 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  ), pShmNode->nRe
21950 67 69 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20  gion, iOffset,. 
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21970 73 7a 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f  szRegion, pMap ?
21980 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
21990 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
219a0 20 20 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20    if( !pMap ){. 
219b0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
219c0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
219d0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
219e0 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c         rc = winL
219f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
21a00 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68  OERR_SHMMAP, pSh
21a10 6d 4e 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  mNode->lastErrno
21a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21a30 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
21a40 68 6d 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e  hmMap3", pDbFd->
21a50 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20  zPath);.        
21a60 69 66 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f  if( hMap ) osClo
21a70 73 65 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a  seHandle(hMap);.
21a80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
21a90 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
21aa0 7d 0a 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  }..      pShmNod
21ab0 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  e->aRegion[pShmN
21ac0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d  ode->nRegion].pM
21ad0 61 70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20  ap = pMap;.     
21ae0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69   pShmNode->aRegi
21af0 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
21b00 67 69 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61  gion].hMap = hMa
21b10 70 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  p;.      pShmNod
21b20 65 2d 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20  e->nRegion++;.  
21b30 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
21b40 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
21b50 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
21b60 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74  egion ){.    int
21b70 20 69 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69   iOffset = iRegi
21b80 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20  on*szRegion;.   
21b90 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66   int iOffsetShif
21ba0 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69  t = iOffset % wi
21bb0 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63  nSysInfo.dwAlloc
21bc0 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79  ationGranularity
21bd0 3b 0a 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20  ;.    char *p = 
21be0 28 63 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65  (char *)pShmNode
21bf0 2d 3e 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  ->aRegion[iRegio
21c00 6e 5d 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70  n].pMap;.    *pp
21c10 20 3d 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f   = (void *)&p[iO
21c20 66 66 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d  ffsetShift];.  }
21c30 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20  else{.    *pp = 
21c40 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68  0;.  }.  if( pSh
21c50 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
21c60 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  y && rc==SQLITE_
21c70 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  OK ) rc = SQLITE
21c80 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c  _READONLY;.  sql
21c90 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
21ca0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
21cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21cc0 7d 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  }..#else.# defin
21cd0 65 20 77 69 6e 53 68 6d 4d 61 70 20 20 20 20 20  e winShmMap     
21ce0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
21cf0 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66  mLock    0.# def
21d00 69 6e 65 20 77 69 6e 53 68 6d 42 61 72 72 69 65  ine winShmBarrie
21d10 72 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e  r 0.# define win
21d20 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
21d30 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
21d40 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
21d50 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 73 20  /../*.** Cleans 
21d60 75 70 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  up the mapped re
21d70 67 69 6f 6e 20 6f 66 20 74 68 65 20 73 70 65 63  gion of the spec
21d80 69 66 69 65 64 20 66 69 6c 65 2c 20 69 66 20 61  ified file, if a
21d90 6e 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ny..*/.#if SQLIT
21da0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
21db0 30 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  0.static int win
21dc0 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
21dd0 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
21de0 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
21df0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d  .  OSTRACE(("UNM
21e00 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c  AP-FILE pid=%lu,
21e10 20 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d   pFile=%p, hMap=
21e20 25 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25  %p, pMapRegion=%
21e30 70 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  p, ".           
21e40 22 6d 6d 61 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  "mmapSize=%lld, 
21e50 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3d 25  mmapSizeActual=%
21e60 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 4d 61 78  lld, mmapSizeMax
21e70 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
21e80 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21e90 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21ea0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 4d 61 70  ile, pFile->hMap
21eb0 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
21ec0 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
21ed0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 2c  pFile->mmapSize,
21ee0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
21ef0 41 63 74 75 61 6c 2c 20 70 46 69 6c 65 2d 3e 6d  Actual, pFile->m
21f00 6d 61 70 53 69 7a 65 4d 61 78 29 29 3b 0a 20 20  mapSizeMax));.  
21f10 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52  if( pFile->pMapR
21f20 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28  egion ){.    if(
21f30 20 21 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46   !osUnmapViewOfF
21f40 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
21f50 65 67 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  egion) ){.      
21f60 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
21f70 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
21f80 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  r();.      OSTRA
21f90 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
21fa0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
21fb0 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
21fc0 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
21fd0 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
21fe0 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
21ff0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
22000 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20  Id(), pFile,.   
22010 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
22020 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
22030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
22040 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
22050 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
22060 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61          "winUnma
22090 70 66 69 6c 65 31 22 2c 20 70 46 69 6c 65 2d 3e  pfile1", pFile->
220a0 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
220b0 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
220c0 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ion = 0;.    pFi
220d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  le->mmapSize = 0
220e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61  ;.    pFile->mma
220f0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
22100 0a 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65  .  }.  if( pFile
22110 2d 3e 68 4d 61 70 21 3d 4e 55 4c 4c 20 29 7b 0a  ->hMap!=NULL ){.
22120 20 20 20 20 69 66 28 20 21 6f 73 43 6c 6f 73 65      if( !osClose
22130 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
22140 61 70 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ap) ){.      pFi
22150 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
22160 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
22170 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
22180 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64  ("UNMAP-FILE pid
22190 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
221a0 68 4d 61 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49  hMap=%p, rc=SQLI
221b0 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e 22  TE_IOERR_MMAP\n"
221c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
221d0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
221e0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
221f0 20 70 46 69 6c 65 2d 3e 68 4d 61 70 29 29 3b 0a   pFile->hMap));.
22200 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
22210 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
22220 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c  IOERR_MMAP, pFil
22230 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
22240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22250 20 20 20 20 20 20 20 22 77 69 6e 55 6e 6d 61 70         "winUnmap
22260 66 69 6c 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  file2", pFile->z
22270 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Path);.    }.   
22280 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
22290 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ULL;.  }.  OSTRA
222a0 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20  CE(("UNMAP-FILE 
222b0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
222c0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
222d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
222e0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
222f0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 29 29 3b  ssId(), pFile));
22300 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22310 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  _OK;.}../*.** Me
22320 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
22330 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
22340 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
22350 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
22360 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
22370 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
22380 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
22390 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
223a0 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
223b0 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
223c0 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
223d0 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
223e0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
223f0 73 74 69 6c 6c 0a 2a 2a 20 6f 75 74 73 74 61 6e  still.** outstan
22400 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
22410 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
22420 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
22430 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
22440 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
22450 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
22460 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
22470 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
22480 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6d 61 70 70  e of.** the mapp
22490 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f  ing to create. O
224a0 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79  therwise, if nBy
224b0 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  te is less than 
224c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
224d0 2a 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  * requested size
224e0 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20   is the size of 
224f0 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  the file on disk
22500 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a  . The actual siz
22510 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61  e of the.** crea
22520 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65  ted mapping is e
22530 69 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73  ither the reques
22540 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20  ted size or the 
22550 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64  value configured
22560 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
22570 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
22580 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73  , whichever is s
22590 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51  maller..**.** SQ
225a0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
225b0 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20  ned if no error 
225c0 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20  occurs (even if 
225d0 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
225e0 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20  ot.** recreated 
225f0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f  as a result of o
22600 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
22610 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c  ences) or an SQL
22620 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
22630 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
22640 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d 61  static int winMa
22650 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70  pfile(winFile *p
22660 46 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  Fd, sqlite3_int6
22670 34 20 6e 42 79 74 65 29 7b 0a 20 20 73 71 6c 69  4 nByte){.  sqli
22680 74 65 33 5f 69 6e 74 36 34 20 6e 4d 61 70 20 3d  te3_int64 nMap =
22690 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63   nByte;.  int rc
226a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  ;..  assert( nMa
226b0 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65  p>=0 || pFd->nFe
226c0 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 4f  tchOut==0 );.  O
226d0 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c  STRACE(("MAP-FIL
226e0 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
226f0 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 5c 6e  =%p, size=%lld\n
22700 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
22710 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
22720 73 49 64 28 29 2c 20 70 46 64 2c 20 6e 42 79 74  sId(), pFd, nByt
22730 65 29 29 3b 0a 0a 20 20 69 66 28 20 70 46 64 2d  e));..  if( pFd-
22740 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72  >nFetchOut>0 ) r
22750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22760 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29  ..  if( nMap<0 )
22770 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46 69  {.    rc = winFi
22780 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33 5f  leSize((sqlite3_
22790 66 69 6c 65 2a 29 70 46 64 2c 20 26 6e 4d 61 70  file*)pFd, &nMap
227a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
227b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
227c0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
227d0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
227e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
227f0 41 54 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AT\n",.         
22800 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
22810 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
22820 46 64 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Fd));.      retu
22830 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
22840 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 7d  FSTAT;.    }.  }
22850 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d  .  if( nMap>pFd-
22860 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a  >mmapSizeMax ){.
22870 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e      nMap = pFd->
22880 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d  mmapSizeMax;.  }
22890 0a 20 20 6e 4d 61 70 20 26 3d 20 7e 28 73 71 6c  .  nMap &= ~(sql
228a0 69 74 65 33 5f 69 6e 74 36 34 29 28 77 69 6e 53  ite3_int64)(winS
228b0 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a  ysInfo.dwPageSiz
228c0 65 20 2d 20 31 29 3b 0a 0a 20 20 69 66 28 20 6e  e - 1);..  if( n
228d0 4d 61 70 3d 3d 30 20 26 26 20 70 46 64 2d 3e 6d  Map==0 && pFd->m
228e0 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  mapSize>0 ){.   
228f0 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46   winUnmapfile(pF
22900 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  d);.  }.  if( nM
22910 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ap!=pFd->mmapSiz
22920 65 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70  e ){.    void *p
22930 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 44 57 4f  New = 0;.    DWO
22940 52 44 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47  RD protect = PAG
22950 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
22960 44 57 4f 52 44 20 66 6c 61 67 73 20 3d 20 46 49  DWORD flags = FI
22970 4c 45 5f 4d 41 50 5f 52 45 41 44 3b 0a 0a 20 20  LE_MAP_READ;..  
22980 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
22990 46 64 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  Fd);.#ifdef SQLI
229a0 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54  TE_MMAP_READWRIT
229b0 45 0a 20 20 20 20 69 66 28 20 28 70 46 64 2d 3e  E.    if( (pFd->
229c0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 49 4e 46  ctrlFlags & WINF
229d0 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29  ILE_RDONLY)==0 )
229e0 7b 0a 20 20 20 20 20 20 70 72 6f 74 65 63 74 20  {.      protect 
229f0 3d 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  = PAGE_READWRITE
22a00 3b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d  ;.      flags |=
22a10 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 3b   FILE_MAP_WRITE;
22a20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
22a30 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
22a40 54 0a 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20  T.    pFd->hMap 
22a50 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
22a60 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 46 64  ppingFromApp(pFd
22a70 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65  ->h, NULL, prote
22a80 63 74 2c 20 6e 4d 61 70 2c 20 4e 55 4c 4c 29 3b  ct, nMap, NULL);
22a90 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
22aa0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
22ab0 57 49 44 45 29 0a 20 20 20 20 70 46 64 2d 3e 68  WIDE).    pFd->h
22ac0 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
22ad0 6c 65 4d 61 70 70 69 6e 67 57 28 70 46 64 2d 3e  leMappingW(pFd->
22ae0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
22af0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b10 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
22b20 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
22b30 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
22b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b50 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
22b60 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
22b70 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65 66  NULL);.#elif def
22b80 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
22b90 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
22ba0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
22bb0 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
22bc0 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f     pFd->hMap = o
22bd0 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
22be0 6e 67 41 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  ngA(pFd->h, NULL
22bf0 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20  , protect,.     
22c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c10 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
22c20 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20  D)((nMap>>32) & 
22c30 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20  0xffffffff),.   
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57               (DW
22c60 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66  ORD)(nMap & 0xff
22c70 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a  ffffff), NULL);.
22c80 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
22c90 46 64 2d 3e 68 4d 61 70 3d 3d 4e 55 4c 4c 20 29  Fd->hMap==NULL )
22ca0 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61 73  {.      pFd->las
22cb0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
22cc0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
22cd0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
22ce0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  r(SQLITE_IOERR_M
22cf0 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45 72  MAP, pFd->lastEr
22d00 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
22d10 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
22d20 4d 61 70 66 69 6c 65 31 22 2c 20 70 46 64 2d 3e  Mapfile1", pFd->
22d30 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f 2a  zPath);.      /*
22d40 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c 20   Log the error, 
22d50 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f 72  but continue nor
22d60 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75 73  mal operation us
22d70 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
22d80 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
22d90 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 43 52 45  E(("MAP-FILE-CRE
22da0 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ATE pid=%lu, pFi
22db0 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
22dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22dd0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22de0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
22df0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
22e00 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
22e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
22e20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 6e  }.    assert( (n
22e30 4d 61 70 20 25 20 77 69 6e 53 79 73 49 6e 66 6f  Map % winSysInfo
22e40 2e 64 77 50 61 67 65 53 69 7a 65 29 3d 3d 30 20  .dwPageSize)==0 
22e50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
22e60 69 7a 65 6f 66 28 53 49 5a 45 5f 54 29 3d 3d 73  izeof(SIZE_T)==s
22e70 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 69 6e  izeof(sqlite3_in
22e80 74 36 34 29 20 7c 7c 20 6e 4d 61 70 3c 3d 30 78  t64) || nMap<=0x
22e90 66 66 66 66 66 66 66 66 20 29 3b 0a 23 69 66 20  ffffffff );.#if 
22ea0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
22eb0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 61 70      pNew = osMap
22ec0 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
22ed0 70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61  p(pFd->hMap, fla
22ee0 67 73 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e  gs, 0, (SIZE_T)n
22ef0 4d 61 70 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  Map);.#else.    
22f00 70 4e 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77  pNew = osMapView
22f10 4f 66 46 69 6c 65 28 70 46 64 2d 3e 68 4d 61 70  OfFile(pFd->hMap
22f20 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 28  , flags, 0, 0, (
22f30 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65  SIZE_T)nMap);.#e
22f40 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 4e 65  ndif.    if( pNe
22f50 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  w==NULL ){.     
22f60 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
22f70 46 64 2d 3e 68 4d 61 70 29 3b 0a 20 20 20 20 20  Fd->hMap);.     
22f80 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c   pFd->hMap = NUL
22f90 4c 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6c 61  L;.      pFd->la
22fa0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
22fb0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
22fc0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
22fd0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
22fe0 4d 4d 41 50 2c 20 70 46 64 2d 3e 6c 61 73 74 45  MMAP, pFd->lastE
22ff0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
23000 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
23010 6e 4d 61 70 66 69 6c 65 32 22 2c 20 70 46 64 2d  nMapfile2", pFd-
23020 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 2f  >zPath);.      /
23030 2a 20 4c 6f 67 20 74 68 65 20 65 72 72 6f 72 2c  * Log the error,
23040 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 6e 6f   but continue no
23050 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 20 75  rmal operation u
23060 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
23070 65 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  e */.      OSTRA
23080 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 2d 4d 41  CE(("MAP-FILE-MA
23090 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
230a0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
230c0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
230d0 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71 6c 69  sId(), pFd, sqli
230e0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
230f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
23100 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
23110 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67      pFd->pMapReg
23120 69 6f 6e 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ion = pNew;.    
23130 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
23140 6e 4d 61 70 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  nMap;.    pFd->m
23150 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
23160 6e 4d 61 70 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  nMap;.  }..  OST
23170 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45 20  RACE(("MAP-FILE 
23180 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
23190 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
231a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
231b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
231c0 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20  ssId(), pFd));. 
231d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
231e0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
231f0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
23200 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
23210 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
23220 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23230 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
23240 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
23250 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
23260 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
23270 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
23280 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
23290 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
232a0 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
232b0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
232c0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
232d0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
232e0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
232f0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
23300 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
23310 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
23320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
23330 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
23340 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
23350 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
23360 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
23370 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
23380 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
23390 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
233a0 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
233b0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
233c0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
233d0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
233e0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 0a  must eventually.
233f0 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
23400 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
23410 69 6e 67 20 77 69 6e 55 6e 66 65 74 63 68 28 29  ing winUnfetch()
23420 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23430 77 69 6e 46 65 74 63 68 28 73 71 6c 69 74 65 33  winFetch(sqlite3
23440 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
23450 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
23460 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
23470 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
23480 49 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20  IZE>0.  winFile 
23490 2a 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  *pFd = (winFile*
234a0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
234b0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
234c0 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66  e file */.#endif
234d0 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 20 20 4f  .  *pp = 0;..  O
234e0 53 54 52 41 43 45 28 28 22 46 45 54 43 48 20 70  STRACE(("FETCH p
234f0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
23500 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 61  , offset=%lld, a
23510 6d 6f 75 6e 74 3d 25 64 2c 20 70 70 3d 25 70 5c  mount=%d, pp=%p\
23520 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
23530 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
23540 73 73 49 64 28 29 2c 20 66 64 2c 20 69 4f 66 66  ssId(), fd, iOff
23550 2c 20 6e 41 6d 74 2c 20 70 70 29 29 3b 0a 0a 23  , nAmt, pp));..#
23560 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
23570 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
23580 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
23590 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
235a0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
235b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
235c0 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
235d0 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66  d, -1);.      if
235e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
235f0 29 7b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  ){.        OSTRA
23600 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d 25  CE(("FETCH pid=%
23610 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
23620 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
23630 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
23640 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
23650 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72  , pFd, sqlite3Er
23660 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20  rName(rc)));.   
23670 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
23680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
23690 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
236a0 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
236b0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
236c0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
236d0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
236e0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
236f0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
23700 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  }.#endif..  OSTR
23710 41 43 45 28 28 22 46 45 54 43 48 20 70 69 64 3d  ACE(("FETCH pid=
23720 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70  %lu, pFile=%p, p
23730 70 3d 25 70 2c 20 2a 70 70 3d 25 70 2c 20 72 63  p=%p, *pp=%p, rc
23740 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
23750 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
23760 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
23770 29 2c 20 66 64 2c 20 70 70 2c 20 2a 70 70 29 29  ), fd, pp, *pp))
23780 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23790 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
237a0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
237b0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
237c0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
237d0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 0a  tion releases a.
237e0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
237f0 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
23800 69 65 72 20 63 61 6c 6c 20 74 6f 20 77 69 6e 46  ier call to winF
23810 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
23820 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
23830 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
23840 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
23850 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
23860 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
23870 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
23880 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
23890 77 69 6e 46 65 74 63 68 28 29 20 69 6e 76 6f 63  winFetch() invoc
238a0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c  ation..**.** Or,
238b0 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61 72   if the third ar
238c0 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20  gument is NULL, 
238d0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
238e0 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  on is being call
238f0 65 64 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20  ed.** to inform 
23900 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68  the VFS layer th
23910 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  at, according to
23920 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73   POSIX, any exis
23930 74 69 6e 67 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  ting mapping.** 
23940 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
23950 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
23960 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
23970 61 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 66 65  atic int winUnfe
23980 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  tch(sqlite3_file
23990 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20   *fd, i64 iOff, 
239a0 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51  void *p){.#if SQ
239b0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
239c0 5a 45 3e 30 0a 20 20 77 69 6e 46 69 6c 65 20 2a  ZE>0.  winFile *
239d0 70 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  pFd = (winFile*)
239e0 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
239f0 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
23a00 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49   file */..  /* I
23a10 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68  f p==0 (unmap th
23a20 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74  e entire file) t
23a30 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
23a40 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
23a50 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66  .  ** xFetch ref
23a60 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20  erences. Or, if 
23a70 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74  p!=0 (meaning it
23a80 20 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65   is an xFetch re
23a90 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74  ference),.  ** t
23aa0 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
23ab0 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
23ac0 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a  utstanding.  */.
23ad0 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29    assert( (p==0)
23ae0 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  ==(pFd->nFetchOu
23af0 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  t==0) );..  /* I
23b00 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20  f p!=0, it must 
23b10 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76  match the iOff v
23b20 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72  alue. */.  asser
23b30 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28  t( p==0 || p==&(
23b40 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
23b50 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a  egion)[iOff] );.
23b60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
23b70 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
23b80 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
23b90 6c 6c 64 2c 20 70 3d 25 70 5c 6e 22 2c 0a 20 20  lld, p=%p\n",.  
23ba0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
23bb0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
23bc0 2c 20 70 46 64 2c 20 69 4f 66 66 2c 20 70 29 29  , pFd, iOff, p))
23bd0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
23be0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
23bf0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
23c00 20 2f 2a 20 46 49 58 4d 45 3a 20 20 49 66 20 57   /* FIXME:  If W
23c10 69 6e 64 6f 77 73 20 74 72 75 6c 79 20 61 6c 77  indows truly alw
23c20 61 79 73 20 70 72 65 76 65 6e 74 73 20 74 72 75  ays prevents tru
23c30 6e 63 61 74 69 6e 67 20 6f 72 20 64 65 6c 65 74  ncating or delet
23c40 69 6e 67 20 61 0a 20 20 20 20 2a 2a 20 66 69 6c  ing a.    ** fil
23c50 65 20 77 68 69 6c 65 20 61 20 6d 61 70 70 69 6e  e while a mappin
23c60 67 20 69 73 20 68 65 6c 64 2c 20 74 68 65 6e 20  g is held, then 
23c70 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69  the following wi
23c80 6e 55 6e 6d 61 70 66 69 6c 65 28 29 20 63 61 6c  nUnmapfile() cal
23c90 6c 0a 20 20 20 20 2a 2a 20 69 73 20 75 6e 6e 65  l.    ** is unne
23ca0 63 65 73 73 61 72 79 20 63 61 6e 20 62 65 20 6f  cessary can be o
23cb0 6d 69 74 74 65 64 20 2d 20 70 6f 74 65 6e 74 69  mitted - potenti
23cc0 61 6c 6c 79 20 69 6d 70 72 6f 76 69 6e 67 0a 20  ally improving. 
23cd0 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d 61 6e 63     ** performanc
23ce0 65 2e 20 20 2a 2f 0a 20 20 20 20 77 69 6e 55 6e  e.  */.    winUn
23cf0 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
23d00 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
23d10 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
23d20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52  ;.#endif..  OSTR
23d30 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70 69  ACE(("UNFETCH pi
23d40 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
23d50 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
23d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
23d70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
23d80 49 64 28 29 2c 20 66 64 29 29 3b 0a 20 20 72 65  Id(), fd));.  re
23d90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23da0 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
23db0 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
23dc0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
23dd0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
23de0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
23df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
23e00 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
23e10 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
23e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e30 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
23e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23e80 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
23e90 73 20 76 65 63 74 6f 72 20 64 65 66 69 6e 65 73  s vector defines
23ea0 20 61 6c 6c 20 74 68 65 20 6d 65 74 68 6f 64 73   all the methods
23eb0 20 74 68 61 74 20 63 61 6e 20 6f 70 65 72 61 74   that can operat
23ec0 65 20 6f 6e 20 61 6e 0a 2a 2a 20 73 71 6c 69 74  e on an.** sqlit
23ed0 65 33 5f 66 69 6c 65 20 66 6f 72 20 77 69 6e 33  e3_file for win3
23ee0 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  2..*/.static con
23ef0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
23f00 74 68 6f 64 73 20 77 69 6e 49 6f 4d 65 74 68 6f  thods winIoMetho
23f10 64 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20  d = {.  3,      
23f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f30 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
23f40 69 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73  ion */.  winClos
23f50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23f60 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
23f70 73 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c  se */.  winRead,
23f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f90 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
23fa0 20 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20   */.  winWrite, 
23fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23fc0 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20        /* xWrite 
23fd0 2a 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65  */.  winTruncate
23fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23ff0 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
24000 65 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20  e */.  winSync, 
24010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24020 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
24030 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65  */.  winFileSize
24040 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24050 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
24060 65 20 2a 2f 0a 20 20 77 69 6e 4c 6f 63 6b 2c 20  e */.  winLock, 
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
24090 2a 2f 0a 20 20 77 69 6e 55 6e 6c 6f 63 6b 2c 20  */.  winUnlock, 
240a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240b0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
240c0 2a 2f 0a 20 20 77 69 6e 43 68 65 63 6b 52 65 73  */.  winCheckRes
240d0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20  ervedLock,      
240e0 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
240f0 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20  servedLock */.  
24100 77 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20  winFileControl, 
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24120 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
24130 2a 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69  */.  winSectorSi
24140 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
24150 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
24160 69 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69  ize */.  winDevi
24170 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24180 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76  s,       /* xDev
24190 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
241a0 63 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61  cs */.  winShmMa
241b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
241c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
241d0 61 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f  ap */.  winShmLo
241e0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
241f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c          /* xShmL
24200 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42  ock */.  winShmB
24210 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20  arrier,         
24220 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
24230 42 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e  Barrier */.  win
24240 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24260 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77  xShmUnmap */.  w
24270 69 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  inFetch,        
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24290 2a 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69  * xFetch */.  wi
242a0 6e 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20  nUnfetch        
242b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
242c0 20 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a   xUnfetch */.};.
242d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
242e0 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
242f0 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
24300 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
24310 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
24320 65 20 66 6f 72 20 77 69 6e 33 32 20 77 69 74 68  e for win32 with
24330 6f 75 74 20 70 65 72 66 6f 72 6d 69 6e 67 20 61  out performing a
24340 6e 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  ny locking..*/.s
24350 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
24360 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77  te3_io_methods w
24370 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74 68 6f 64  inIoNolockMethod
24380 20 3d 20 7b 0a 20 20 33 2c 20 20 20 20 20 20 20   = {.  3,       
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
243a0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
243b0 6f 6e 20 2a 2f 0a 20 20 77 69 6e 43 6c 6f 73 65  on */.  winClose
243c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
243d0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
243e0 65 20 2a 2f 0a 20 20 77 69 6e 52 65 61 64 2c 20  e */.  winRead, 
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24400 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20         /* xRead 
24410 2a 2f 0a 20 20 77 69 6e 57 72 69 74 65 2c 20 20  */.  winWrite,  
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24430 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
24440 2f 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  /.  winTruncate,
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
24470 20 2a 2f 0a 20 20 77 69 6e 53 79 6e 63 2c 20 20   */.  winSync,  
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
244a0 2f 0a 20 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c  /.  winFileSize,
244b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244c0 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
244d0 20 2a 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 4c   */.  winNolockL
244e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
244f0 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
24500 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 55 6e 6c  /.  winNolockUnl
24510 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
24520 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
24530 2f 0a 20 20 77 69 6e 4e 6f 6c 6f 63 6b 43 68 65  /.  winNolockChe
24540 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
24550 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
24560 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 77  ervedLock */.  w
24570 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  inFileControl,  
24580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24590 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a  * xFileControl *
245a0 2f 0a 20 20 77 69 6e 53 65 63 74 6f 72 53 69 7a  /.  winSectorSiz
245b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
245c0 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
245d0 7a 65 20 2a 2f 0a 20 20 77 69 6e 44 65 76 69 63  ze */.  winDevic
245e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
245f0 2c 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69  ,       /* xDevi
24600 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24610 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4d 61 70  s */.  winShmMap
24620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24630 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
24640 70 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 6f 63  p */.  winShmLoc
24650 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
24660 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f         /* xShmLo
24670 63 6b 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 42 61  ck */.  winShmBa
24680 72 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20  rrier,          
24690 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
246a0 61 72 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53  arrier */.  winS
246b0 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
246c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
246d0 53 68 6d 55 6e 6d 61 70 20 2a 2f 0a 20 20 77 69  ShmUnmap */.  wi
246e0 6e 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  nFetch,         
246f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24700 20 78 46 65 74 63 68 20 2a 2f 0a 20 20 77 69 6e   xFetch */.  win
24710 55 6e 66 65 74 63 68 20 20 20 20 20 20 20 20 20  Unfetch         
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24730 78 55 6e 66 65 74 63 68 20 2a 2f 0a 7d 3b 0a 0a  xUnfetch */.};..
24740 73 74 61 74 69 63 20 77 69 6e 56 66 73 41 70 70  static winVfsApp
24750 44 61 74 61 20 77 69 6e 41 70 70 44 61 74 61 20  Data winAppData 
24760 3d 20 7b 0a 20 20 26 77 69 6e 49 6f 4d 65 74 68  = {.  &winIoMeth
24770 6f 64 2c 20 20 20 20 20 20 20 2f 2a 20 70 4d 65  od,       /* pMe
24780 74 68 6f 64 20 2a 2f 0a 20 20 30 2c 20 20 20 20  thod */.  0,    
24790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
247a0 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 30   pAppData */.  0
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 2f 2a 20 62 4e 6f 4c 6f 63 6b 20 2a 2f     /* bNoLock */
247d0 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 77 69 6e 56  .};..static winV
247e0 66 73 41 70 70 44 61 74 61 20 77 69 6e 4e 6f 6c  fsAppData winNol
247f0 6f 63 6b 41 70 70 44 61 74 61 20 3d 20 7b 0a 20  ockAppData = {. 
24800 20 26 77 69 6e 49 6f 4e 6f 6c 6f 63 6b 4d 65 74   &winIoNolockMet
24810 68 6f 64 2c 20 2f 2a 20 70 4d 65 74 68 6f 64 20  hod, /* pMethod 
24820 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
24830 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70           /* pApp
24840 44 61 74 61 20 2a 2f 0a 20 20 31 20 20 20 20 20  Data */.  1     
24850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24860 20 62 4e 6f 4c 6f 63 6b 20 2a 2f 0a 7d 3b 0a 0a   bNoLock */.};..
24870 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
24880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
248a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
248b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
248c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
248d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
248e0 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
248f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
24910 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
24920 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
24930 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
24940 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
24950 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
24960 65 63 74 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  ect..*/..#if def
24970 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
24980 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
24990 20 66 69 6c 65 6e 61 6d 65 20 66 72 6f 6d 20 77   filename from w
249a0 68 61 74 65 76 65 72 20 74 68 65 20 75 6e 64 65  hatever the unde
249b0 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
249c0 20 73 79 73 74 65 6d 0a 2a 2a 20 73 75 70 70 6f   system.** suppo
249d0 72 74 73 20 66 6f 72 20 66 69 6c 65 6e 61 6d 65  rts for filename
249e0 73 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 20 53  s into UTF-8.  S
249f0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
24a00 20 72 65 73 75 6c 74 20 69 73 0a 2a 2a 20 6f 62   result is.** ob
24a10 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
24a20 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66  oc and must be f
24a30 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
24a40 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ing function..*/
24a50 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
24a60 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
24a70 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20 76 6f 69  lename(const voi
24a80 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  d *zFilename){. 
24a90 20 63 68 61 72 20 2a 7a 43 6f 6e 76 65 72 74 65   char *zConverte
24aa0 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49  d = 0;.  if( osI
24ab0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f  sNT() ){.    zCo
24ac0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55 6e 69  nverted = winUni
24ad0 63 6f 64 65 54 6f 55 74 66 38 28 7a 46 69 6c 65  codeToUtf8(zFile
24ae0 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65  name);.  }.#ifde
24af0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
24b00 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
24b10 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d      zConverted =
24b20 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a   winMbcsToUtf8(z
24b30 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46  Filename, osAreF
24b40 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
24b50 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
24b60 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
24b70 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
24b80 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
24b90 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69  nverted;.}.#endi
24ba0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
24bb0 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
24bc0 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
24bd0 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
24be0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
24bf0 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
24c00 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
24c10 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
24c20 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
24c30 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
24c40 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
24c50 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
24c60 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
24c70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
24c80 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
24c90 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
24ca0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
24cb0 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
24cc0 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
24cd0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
24ce0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
24cf0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
24d00 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
24d10 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
24d20 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
24d30 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
24d40 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 4d 62 63  d = winUtf8ToMbc
24d50 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 6f 73 41  s(zFilename, osA
24d60 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
24d70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
24d80 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
24d90 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
24da0 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
24db0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 0a 2f  zConverted;.}../
24dc0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24dd0 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
24de0 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
24df0 66 69 65 64 20 55 54 46 2d 38 20 73 74 72 69 6e  fied UTF-8 strin
24e00 67 20 62 75 66 66 65 72 0a 2a 2a 20 65 6e 64 73  g buffer.** ends
24e10 20 77 69 74 68 20 61 20 64 69 72 65 63 74 6f 72   with a director
24e20 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  y separator char
24e30 61 63 74 65 72 20 6f 72 20 6f 6e 65 20 77 61 73  acter or one was
24e40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 0a 2a 2a   successfully.**
24e50 20 61 64 64 65 64 20 74 6f 20 69 74 2e 0a 2a 2f   added to it..*/
24e60 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4d  .static int winM
24e70 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 69  akeEndInDirSep(i
24e80 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
24e90 42 75 66 29 7b 0a 20 20 69 66 28 20 7a 42 75 66  Buf){.  if( zBuf
24ea0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 6e   ){.    int nLen
24eb0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
24ec0 33 30 28 7a 42 75 66 29 3b 0a 20 20 20 20 69 66  30(zBuf);.    if
24ed0 28 20 6e 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nLen>0 ){.    
24ee0 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 53 65    if( winIsDirSe
24ef0 70 28 7a 42 75 66 5b 6e 4c 65 6e 2d 31 5d 29 20  p(zBuf[nLen-1]) 
24f00 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
24f10 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  n 1;.      }else
24f20 20 69 66 28 20 6e 4c 65 6e 2b 31 3c 6e 42 75 66   if( nLen+1<nBuf
24f30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 42 75 66   ){.        zBuf
24f40 5b 6e 4c 65 6e 5d 20 3d 20 77 69 6e 47 65 74 44  [nLen] = winGetD
24f50 69 72 53 65 70 28 29 3b 0a 20 20 20 20 20 20 20  irSep();.       
24f60 20 7a 42 75 66 5b 6e 4c 65 6e 2b 31 5d 20 3d 20   zBuf[nLen+1] = 
24f70 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 72 65  '\0';.        re
24f80 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
24f90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
24fa0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
24fb0 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  reate a temporar
24fc0 79 20 66 69 6c 65 20 6e 61 6d 65 20 61 6e 64 20  y file name and 
24fd0 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
24fe0 69 6e 67 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ing pointer into
24ff0 20 70 7a 42 75 66 2e 0a 2a 2a 20 54 68 65 20 70   pzBuf..** The p
25000 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
25010 69 6e 20 70 7a 42 75 66 20 6d 75 73 74 20 62 65  in pzBuf must be
25020 20 66 72 65 65 64 20 76 69 61 20 73 71 6c 69 74   freed via sqlit
25030 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
25040 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54  atic int winGetT
25050 65 6d 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f  empname(sqlite3_
25060 76 66 73 20 2a 70 56 66 73 2c 20 63 68 61 72 20  vfs *pVfs, char 
25070 2a 2a 70 7a 42 75 66 29 7b 0a 20 20 73 74 61 74  **pzBuf){.  stat
25080 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d  ic char zChars[]
25090 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68   =.    "abcdefgh
250a0 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78  ijklmnopqrstuvwx
250b0 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47  yz".    "ABCDEFG
250c0 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57  HIJKLMNOPQRSTUVW
250d0 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35  XYZ".    "012345
250e0 36 37 38 39 22 3b 0a 20 20 73 69 7a 65 5f 74 20  6789";.  size_t 
250f0 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 50 72 65  i, j;.  int nPre
25100 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
25110 33 30 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46  30(SQLITE_TEMP_F
25120 49 4c 45 5f 50 52 45 46 49 58 29 3b 0a 20 20 69  ILE_PREFIX);.  i
25130 6e 74 20 6e 4d 61 78 2c 20 6e 42 75 66 2c 20 6e  nt nMax, nBuf, n
25140 44 69 72 2c 20 6e 4c 65 6e 3b 0a 20 20 63 68 61  Dir, nLen;.  cha
25150 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 2f 2a 20 49  r *zBuf;..  /* I
25160 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
25170 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
25180 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
25190 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
251a0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
251b0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
251c0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
251d0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
251e0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
251f0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 0a 20 20 2a  ion failing..  *
25200 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
25210 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
25220 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 2f  TE_IOERR );..  /
25230 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 74 65 6d  * Allocate a tem
25240 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 74 6f  porary buffer to
25250 20 73 74 6f 72 65 20 74 68 65 20 66 75 6c 6c 79   store the fully
25260 20 71 75 61 6c 69 66 69 65 64 20 66 69 6c 65 0a   qualified file.
25270 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68    ** name for th
25280 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
25290 2e 20 20 49 66 20 74 68 69 73 20 66 61 69 6c 73  .  If this fails
252a0 2c 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f 6e 74  , we cannot cont
252b0 69 6e 75 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 61  inue..  */.  nMa
252c0 78 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  x = pVfs->mxPath
252d0 6e 61 6d 65 3b 20 6e 42 75 66 20 3d 20 6e 4d 61  name; nBuf = nMa
252e0 78 20 2b 20 32 3b 0a 20 20 7a 42 75 66 20 3d 20  x + 2;.  zBuf = 
252f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
25300 6f 28 20 6e 42 75 66 20 29 3b 0a 20 20 69 66 28  o( nBuf );.  if(
25310 20 21 7a 42 75 66 20 29 7b 0a 20 20 20 20 4f 53   !zBuf ){.    OS
25320 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
25330 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
25340 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
25350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
25360 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
25370 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
25380 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 65  Figure out the e
25390 66 66 65 63 74 69 76 65 20 74 65 6d 70 6f 72 61  ffective tempora
253a0 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20 20 46  ry directory.  F
253b0 69 72 73 74 2c 20 63 68 65 63 6b 20 69 66 20 6f  irst, check if o
253c0 6e 65 0a 20 20 2a 2a 20 68 61 73 20 62 65 65 6e  ne.  ** has been
253d0 20 65 78 70 6c 69 63 69 74 6c 79 20 73 65 74 20   explicitly set 
253e0 62 79 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  by the applicati
253f0 6f 6e 3b 20 6f 74 68 65 72 77 69 73 65 2c 20 75  on; otherwise, u
25400 73 65 20 74 68 65 20 6f 6e 65 0a 20 20 2a 2a 20  se the one.  ** 
25410 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
25420 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
25430 65 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 44 69 72 20  em..  */.  nDir 
25440 3d 20 6e 4d 61 78 20 2d 20 28 6e 50 72 65 20 2b  = nMax - (nPre +
25450 20 31 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20   15);.  assert( 
25460 6e 44 69 72 3e 30 20 29 3b 0a 20 20 69 66 28 20  nDir>0 );.  if( 
25470 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
25480 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 69 6e  ectory ){.    in
25490 74 20 6e 44 69 72 4c 65 6e 20 3d 20 73 71 6c 69  t nDirLen = sqli
254a0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
254b0 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
254c0 72 79 29 3b 0a 20 20 20 20 69 66 28 20 6e 44 69  ry);.    if( nDi
254d0 72 4c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  rLen>0 ){.      
254e0 69 66 28 20 21 77 69 6e 49 73 44 69 72 53 65 70  if( !winIsDirSep
254f0 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  (sqlite3_temp_di
25500 72 65 63 74 6f 72 79 5b 6e 44 69 72 4c 65 6e 2d  rectory[nDirLen-
25510 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  1]) ){.        n
25520 44 69 72 4c 65 6e 2b 2b 3b 0a 20 20 20 20 20 20  DirLen++;.      
25530 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 44 69 72  }.      if( nDir
25540 4c 65 6e 3e 6e 44 69 72 20 29 7b 0a 20 20 20 20  Len>nDir ){.    
25550 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25560 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
25570 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46  OSTRACE(("TEMP-F
25580 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54  ILENAME rc=SQLIT
25590 45 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20  E_ERROR\n"));.  
255a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
255b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
255c0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
255d0 74 54 65 6d 70 6e 61 6d 65 31 22 2c 20 30 29 3b  tTempname1", 0);
255e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
255f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
25600 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22  nMax, zBuf, "%s"
25610 2c 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  , sqlite3_temp_d
25620 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 7d  irectory);.    }
25630 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
25640 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65  (__CYGWIN__).  e
25650 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20  lse{.    static 
25660 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69  const char *azDi
25670 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  rs[] = {.       
25680 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 53 51  0, /* getenv("SQ
25690 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 20 2a 2f  LITE_TMPDIR") */
256a0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
256b0 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 20 2a  tenv("TMPDIR") *
256c0 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67  /.       0, /* g
256d0 65 74 65 6e 76 28 22 54 4d 50 22 29 20 2a 2f 0a  etenv("TMP") */.
256e0 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74         0, /* get
256f0 65 6e 76 28 22 54 45 4d 50 22 29 20 2a 2f 0a 20  env("TEMP") */. 
25700 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
25710 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
25720 29 20 2a 2f 0a 20 20 20 20 20 20 20 22 2f 76 61  ) */.       "/va
25730 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22  r/tmp",.       "
25740 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /usr/tmp",.     
25750 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 20    "/tmp",.      
25760 20 22 2e 22 2c 0a 20 20 20 20 20 20 20 30 20 20   ".",.       0  
25770 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65        /* List te
25780 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 20 20  rminator */.    
25790 7d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  };.    unsigned 
257a0 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74  int i;.    const
257b0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
257c0 0a 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ..    if( !azDir
257d0 73 5b 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d  s[0] ) azDirs[0]
257e0 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
257f0 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20  E_TMPDIR");.    
25800 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
25810 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
25820 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
25830 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32     if( !azDirs[2
25840 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20  ] ) azDirs[2] = 
25850 67 65 74 65 6e 76 28 22 54 4d 50 22 29 3b 0a 20  getenv("TMP");. 
25860 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 33     if( !azDirs[3
25870 5d 20 29 20 61 7a 44 69 72 73 5b 33 5d 20 3d 20  ] ) azDirs[3] = 
25880 67 65 74 65 6e 76 28 22 54 45 4d 50 22 29 3b 0a  getenv("TEMP");.
25890 20 20 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b      if( !azDirs[
258a0 34 5d 20 29 20 61 7a 44 69 72 73 5b 34 5d 20 3d  4] ) azDirs[4] =
258b0 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52 4f   getenv("USERPRO
258c0 46 49 4c 45 22 29 3b 0a 20 20 20 20 66 6f 72 28  FILE");.    for(
258d0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
258e0 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
258f0 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a  irs[0]); zDir=az
25900 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20  Dirs[i++]){.    
25910 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
25920 65 64 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44  ed;.      if( zD
25930 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
25940 3b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  ;.      /* If th
25950 65 20 70 61 74 68 20 73 74 61 72 74 73 20 77 69  e path starts wi
25960 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
25970 72 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 68  r followed by th
25980 65 20 63 6f 6c 6f 6e 0a 20 20 20 20 20 20 2a 2a  e colon.      **
25990 20 63 68 61 72 61 63 74 65 72 2c 20 61 73 73 75   character, assu
259a0 6d 65 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  me it is already
259b0 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32 20   a native Win32 
259c0 70 61 74 68 3b 20 6f 74 68 65 72 77 69 73 65 2c  path; otherwise,
259d0 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6d 75 73  .      ** it mus
259e0 74 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20 74  t be converted t
259f0 6f 20 61 20 6e 61 74 69 76 65 20 57 69 6e 33 32  o a native Win32
25a00 20 70 61 74 68 20 76 69 61 20 74 68 65 20 43 79   path via the Cy
25a10 67 77 69 6e 20 41 50 49 0a 20 20 20 20 20 20 2a  gwin API.      *
25a20 2a 20 70 72 69 6f 72 20 74 6f 20 75 73 69 6e 67  * prior to using
25a30 20 69 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20   it..      */.  
25a40 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 72 69      if( winIsDri
25a50 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e  veLetterAndColon
25a60 28 7a 44 69 72 29 20 29 7b 0a 20 20 20 20 20 20  (zDir) ){.      
25a70 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
25a80 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
25a90 38 46 69 6c 65 6e 61 6d 65 28 7a 44 69 72 29 3b  8Filename(zDir);
25aa0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 43  .        if( !zC
25ab0 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20  onverted ){.    
25ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25ad0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
25ae0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
25af0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
25b00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25b10 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20  M\n"));.        
25b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25b30 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
25b40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
25b50 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69 72      if( winIsDir
25b60 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a  (zConverted) ){.
25b70 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25b80 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
25b90 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44 69   zBuf, "%s", zDi
25ba0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
25bb0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
25bc0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
25bd0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25be0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
25bf0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
25c00 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ed);.      }else
25c10 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
25c20 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 61  rted = sqlite3Ma
25c30 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b 31  llocZero( nMax+1
25c40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
25c50 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20  !zConverted ){. 
25c60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25c70 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
25c80 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
25c90 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
25ca0 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  c=SQLITE_IOERR_N
25cb0 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20  OMEM\n"));.     
25cc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25cd0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
25ce0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
25cf0 20 20 20 20 20 20 20 69 66 28 20 63 79 67 77 69         if( cygwi
25d00 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 49               osI
25d20 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
25d30 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
25d40 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c  _POSIX_TO_WIN_A,
25d50 20 7a 44 69 72 2c 0a 20 20 20 20 20 20 20 20 20   zDir,.         
25d60 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65         zConverte
25d70 64 2c 20 6e 4d 61 78 2b 31 29 3c 30 20 29 7b 0a  d, nMax+1)<0 ){.
25d80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25d90 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
25da0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
25db0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
25dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
25dd0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
25de0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
25df0 45 52 52 5f 43 4f 4e 56 50 41 54 48 5c 6e 22 29  ERR_CONVPATH\n")
25e00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
25e10 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
25e20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
25e30 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
25e40 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
25e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e60 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
25e70 65 32 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  e2", zDir);.    
25e80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
25e90 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
25ea0 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20  erted) ){.      
25eb0 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
25ec0 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
25ed0 65 20 63 61 6e 64 69 64 61 74 65 20 64 69 72 65  e candidate dire
25ee0 63 74 6f 72 79 20 65 78 69 73 74 73 20 61 6e 64  ctory exists and
25ef0 20 73 68 6f 75 6c 64 0a 20 20 20 20 20 20 20 20   should.        
25f00 20 20 2a 2a 20 62 65 20 75 73 65 64 2e 20 20 48    ** be used.  H
25f10 6f 77 65 76 65 72 2c 20 77 65 20 6d 61 79 20 6e  owever, we may n
25f20 65 65 64 20 74 6f 20 63 6f 6e 76 65 72 74 20 74  eed to convert t
25f30 68 65 20 73 74 72 69 6e 67 20 63 6f 6e 74 61 69  he string contai
25f40 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
25f50 2a 20 69 74 73 20 6e 61 6d 65 20 69 6e 74 6f 20  * its name into 
25f60 55 54 46 2d 38 20 28 69 2e 65 2e 20 69 66 20 69  UTF-8 (i.e. if i
25f70 74 20 69 73 20 55 54 46 2d 31 36 20 72 69 67 68  t is UTF-16 righ
25f80 74 20 6e 6f 77 29 2e 0a 20 20 20 20 20 20 20 20  t now)..        
25f90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63    */.          c
25fa0 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
25fb0 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
25fc0 65 6e 61 6d 65 28 7a 43 6f 6e 76 65 72 74 65 64  ename(zConverted
25fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
25fe0 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
25ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26000 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26010 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26020 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b  ite3_free(zBuf);
26030 0a 20 20 20 20 20 20 20 20 20 20 20 20 4f 53 54  .            OST
26040 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
26050 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
26060 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b  OERR_NOMEM\n"));
26070 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
26080 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26090 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
260a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
260b0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
260c0 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20  ntf(nMax, zBuf, 
260d0 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20  "%s", zUtf8);.  
260e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
260f0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
26100 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
26110 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26120 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
26130 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
26140 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26150 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
26160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26170 23 65 6c 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  #elif !SQLITE_OS
26180 5f 57 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e  _WINRT && !defin
26190 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20  ed(__CYGWIN__). 
261a0 20 65 6c 73 65 20 69 66 28 20 6f 73 49 73 4e 54   else if( osIsNT
261b0 28 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  () ){.    char *
261c0 7a 4d 75 6c 74 69 3b 0a 20 20 20 20 4c 50 57 53  zMulti;.    LPWS
261d0 54 52 20 7a 57 69 64 65 50 61 74 68 20 3d 20 73  TR zWidePath = s
261e0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
261f0 28 20 6e 4d 61 78 2a 73 69 7a 65 6f 66 28 57 43  ( nMax*sizeof(WC
26200 48 41 52 29 20 29 3b 0a 20 20 20 20 69 66 28 20  HAR) );.    if( 
26210 21 7a 57 69 64 65 50 61 74 68 20 29 7b 0a 20 20  !zWidePath ){.  
26220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26230 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
26240 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
26250 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
26260 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
26270 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
26280 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
26290 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
262a0 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50    if( osGetTempP
262b0 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69 64 65  athW(nMax, zWide
262c0 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Path)==0 ){.    
262d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
262e0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
262f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
26300 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
26310 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
26320 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
26330 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e  RR_GETTEMPPATH\n
26340 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
26350 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
26360 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
26370 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  MPPATH, osGetLas
26380 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
26390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263a0 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61     "winGetTempna
263b0 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  me2", 0);.    }.
263c0 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77 69 6e      zMulti = win
263d0 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57  UnicodeToUtf8(zW
263e0 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 69 66  idePath);.    if
263f0 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20 20 20  ( zMulti ){.    
26400 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
26410 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
26420 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a 20 20  %s", zMulti);.  
26430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
26440 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20  (zMulti);.      
26450 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
26460 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d 65 6c  dePath);.    }el
26470 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
26480 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
26490 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
264a0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
264b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
264c0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
264d0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
264e0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
264f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
26500 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
26510 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51   }.  }.#ifdef SQ
26520 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
26530 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
26540 63 68 61 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20  char *zUtf8;.   
26550 20 63 68 61 72 20 2a 7a 4d 62 63 73 50 61 74 68   char *zMbcsPath
26560 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
26570 5a 65 72 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20  Zero( nMax );.  
26580 20 20 69 66 28 20 21 7a 4d 62 63 73 50 61 74 68    if( !zMbcsPath
26590 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
265a0 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
265b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
265c0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
265d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
265e0 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65  M\n"));.      re
265f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
26600 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
26610 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73 47 65    }.    if( osGe
26620 74 54 65 6d 70 50 61 74 68 41 28 6e 4d 61 78 2c  tTempPathA(nMax,
26630 20 7a 4d 62 63 73 50 61 74 68 29 3d 3d 30 20 29   zMbcsPath)==0 )
26640 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26650 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
26660 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
26670 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
26680 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
26690 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20  PPATH\n"));.    
266a0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
266b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
266c0 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20 6f  R_GETTEMPPATH, o
266d0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
266e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
266f0 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
26700 74 54 65 6d 70 6e 61 6d 65 33 22 2c 20 30 29 3b  tTempname3", 0);
26710 0a 20 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38  .    }.    zUtf8
26720 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38   = winMbcsToUtf8
26730 28 7a 4d 62 63 73 50 61 74 68 2c 20 6f 73 41 72  (zMbcsPath, osAr
26740 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
26750 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
26760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
26770 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
26780 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
26790 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
267a0 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
267b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
267c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
267d0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
267e0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
267f0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
26800 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
26810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26820 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
26830 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  PT;.    }.  }.#e
26840 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
26850 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
26860 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
26870 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
26880 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
26890 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
268a0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
268b0 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
268c0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
268d0 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
268e0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
268f0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
26900 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
26910 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
26920 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
26930 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
26940 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
26950 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
26960 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26970 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
26980 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
26990 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
269a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
269b0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
269c0 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
269d0 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
269e0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
269f0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
26a00 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
26a10 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
26a20 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
26a30 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e  ile.  ** name in
26a40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
26a50 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ormat:.  **.  **
26a60 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64     "<temporary_d
26a70 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73  irectory>/etilqs
26a80 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  _XXXXXXXXXXXXXXX
26a90 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  \0\0".  **.  ** 
26aa0 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  If not, return S
26ab0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68  QLITE_ERROR.  Th
26ac0 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75  e number 17 is u
26ad0 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65  sed here in orde
26ae0 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e  r to.  ** accoun
26af0 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20  t for the space 
26b00 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63  used by the 15 c
26b10 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20  haracter random 
26b20 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20  suffix and the. 
26b30 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67   ** two trailing
26b40 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e   NUL characters.
26b50 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65    The final dire
26b60 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
26b70 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68  character.  ** h
26b80 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64  as already added
26b90 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
26ba0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
26bb0 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71    */.  nLen = sq
26bc0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
26bd0 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e  uf);.  if( (nLen
26be0 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20   + nPre + 17) > 
26bf0 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  nBuf ){.    sqli
26c00 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
26c10 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
26c20 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
26c30 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
26c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
26c50 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
26c60 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
26c70 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b  tTempname5", 0);
26c80 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
26c90 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36  snprintf(nBuf-16
26ca0 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e  -nLen, zBuf+nLen
26cb0 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  , SQLITE_TEMP_FI
26cc0 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a  LE_PREFIX);..  j
26cd0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
26ce0 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
26cf0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
26d00 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
26d10 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
26d20 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
26d30 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
26d40 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
26d50 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
26d60 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
26d70 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
26d80 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
26d90 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75  +1] = 0;.  *pzBu
26da0 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54  f = zBuf;..  OST
26db0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
26dc0 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
26dd0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
26de0 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
26df0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
26e00 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
26e10 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
26e20 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
26e30 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
26e40 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
26e50 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
26e60 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
26e70 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
26e80 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
26e90 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
26ea0 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
26eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
26ec0 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
26ed0 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
26ee0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
26ef0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
26f00 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
26f10 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
26f20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
26f30 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
26f40 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
26f50 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
26f60 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
26f70 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
26f80 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
26f90 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
26fa0 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
26fb0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
26fc0 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fe0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
26ff0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
27000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27010 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
27020 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
27030 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
27040 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
27050 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
27060 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
27070 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
27080 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
27090 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
270a0 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
270b0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
270c0 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
270d0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
270e0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
270f0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
27100 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
27110 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
27120 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
27130 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
27140 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
27150 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 20 66 6f 72  TORY);.}../* for
27160 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
27170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
27180 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
27190 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
271a0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
271b0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63   on win32 */.  c
271c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
271d0 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  name,     /* Nam
271e0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65  e of file to che
271f0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ck */.  int flag
27200 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
27210 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65     /* Type of te
27220 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68  st to make on th
27230 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
27240 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
27250 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27260 52 65 73 75 6c 74 20 2a 2f 0a 29 3b 0a 0a 2f 2a  Result */.);../*
27270 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 2e  .** Open a file.
27280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
27290 69 6e 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  inOpen(.  sqlite
272a0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
272b0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 67      /* Used to g
272c0 65 74 20 6d 61 78 69 6d 75 6d 20 70 61 74 68 20  et maximum path 
272d0 6c 65 6e 67 74 68 20 61 6e 64 20 41 70 70 44 61  length and AppDa
272e0 74 61 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ta */.  const ch
272f0 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
27300 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
27310 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
27320 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
27330 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
27340 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
27350 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
27360 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
27370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27380 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
27390 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
273a0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
273b0 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
273c0 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
273d0 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
273e0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
273f0 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  0;.  DWORD dwDes
27400 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
27410 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
27420 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
27430 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
27440 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
27450 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
27460 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
27470 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
27480 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
27490 20 77 69 6e 56 66 73 41 70 70 44 61 74 61 20 2a   winVfsAppData *
274a0 70 41 70 70 44 61 74 61 3b 0a 20 20 77 69 6e 46  pAppData;.  winF
274b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
274c0 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76 6f 69  nFile*)id;.  voi
274d0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 20 20  d *zConverted;  
274e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
274f0 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20 65 6e  ilename in OS en
27500 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f 6e 73  coding */.  cons
27510 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e 61 6d  t char *zUtf8Nam
27520 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20 46 69  e = zName; /* Fi
27530 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d 38 20  lename in UTF-8 
27540 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e  encoding */.  in
27550 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  t cnt = 0;..  /*
27560 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
27570 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
27580 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
27590 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
275a0 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
275b0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
275c0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
275d0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
275e0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
275f0 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d 65 20   char *zTmpname 
27600 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65 6d 70  = 0; /* For temp
27610 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 2c 20  orary filename, 
27620 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 2a 2f  if necessary. */
27630 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ..  int rc = SQL
27640 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
27650 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52     /* Function R
27660 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 23 69  eturn Code */.#i
27670 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
27680 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  G) || SQLITE_OS_
27690 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54 79 70  WINCE.  int eTyp
276a0 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46  e = flags&0xFFFF
276b0 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f  FF00;  /* Type o
276c0 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  f file to open *
276d0 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e 74 20  /.#endif..  int 
276e0 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28  isExclusive  = (
276f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27700 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a  PEN_EXCLUSIVE);.
27710 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20    int isDelete  
27720 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
27730 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
27740 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20  ONCLOSE);.  int 
27750 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28  isCreate     = (
27760 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
27770 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69  PEN_CREATE);.  i
27780 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20  nt isReadonly   
27790 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
277a0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
277b0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72  ;.  int isReadWr
277c0 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ite  = (flags & 
277d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
277e0 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64 65 66  WRITE);..#ifndef
277f0 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 69 73   NDEBUG.  int is
27800 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 69  OpenJournal = (i
27810 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
27820 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
27830 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
27840 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65  OURNAL.     || e
27850 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
27860 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 0a 20  N_MAIN_JOURNAL. 
27870 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
27880 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
27890 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53  ));.#endif..  OS
278a0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d  TRACE(("OPEN nam
278b0 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70 2c 20  e=%s, pFile=%p, 
278c0 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74 46 6c  flags=%x, pOutFl
278d0 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20  ags=%p\n",.     
278e0 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 2c        zUtf8Name,
278f0 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74   id, flags, pOut
27900 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a 20 43  Flags));..  /* C
27910 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69  heck the followi
27920 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  ng statements ar
27930 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a  e true:.  **.  *
27940 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
27950 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
27960 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
27970 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
27980 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
27990 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
279a0 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
279b0 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
279c0 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
279d0 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
279e0 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
279f0 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
27a00 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
27a10 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
27a20 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
27a30 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
27a40 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
27a50 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
27a60 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
27a70 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
27a80 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
27a90 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
27aa0 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
27ab0 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
27ac0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
27ad0 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
27ae0 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
27af0 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
27b00 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
27b10 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
27b20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
27b30 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
27b40 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
27b50 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63  r.  ** automatic
27b60 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f  ally deleted. No
27b70 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20  r are they ever 
27b80 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e  temporary files.
27b90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
27ba0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
27bb0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
27bc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
27bd0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  B );.  assert( (
27be0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
27bf0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
27c00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
27c10 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65  OURNAL );.  asse
27c20 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
27c30 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
27c40 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
27c50 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b  ASTER_JOURNAL );
27c60 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
27c70 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
27c80 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
27c90 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20  _OPEN_WAL );..  
27ca0 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
27cb0 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68  he upper layer h
27cc0 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68  as set one of th
27cd0 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c  e "file-type" fl
27ce0 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ags. */.  assert
27cf0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
27d00 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20  OPEN_MAIN_DB    
27d10 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
27d20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 0a  TE_OPEN_TEMP_DB.
27d30 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
27d40 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
27d50 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
27d60 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
27d70 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20  TEMP_JOURNAL.   
27d80 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
27d90 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
27da0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
27db0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
27dc0 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  TER_JOURNAL.    
27dd0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
27de0 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
27df0 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d  NT_DB || eType==
27e00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
27e10 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20    );..  assert( 
27e20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 6d 65  pFile!=0 );.  me
27e30 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73  mset(pFile, 0, s
27e40 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 29 3b  izeof(winFile));
27e50 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 49 4e  .  pFile->h = IN
27e60 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
27e70 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  UE;..#if SQLITE_
27e80 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 21  OS_WINRT.  if( !
27e90 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21 73 71  zUtf8Name && !sq
27ea0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
27eb0 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69  tory ){.    sqli
27ec0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
27ed0 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20 22 73  RROR,.        "s
27ee0 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
27ef0 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65 20 73  ctory variable s
27f00 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66 6f 72  hould be set for
27f10 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a 23 65   WinRT");.  }.#e
27f20 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ndif..  /* If th
27f30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
27f40 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
27f50 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65 6e 65  on is NULL, gene
27f60 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65 6d 70  rate a.  ** temp
27f70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
27f80 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20 69 66  to use.  */.  if
27f90 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29 7b 0a  ( !zUtf8Name ){.
27fa0 20 20 20 20 61 73 73 65 72 74 28 20 69 73 44 65      assert( isDe
27fb0 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65 6e 4a  lete && !isOpenJ
27fc0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 72 63  ournal );.    rc
27fd0 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d   = winGetTempnam
27fe0 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e 61 6d  e(pVfs, &zTmpnam
27ff0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
28000 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28010 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
28020 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  N name=%s, rc=%s
28030 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 73 71  ", zUtf8Name, sq
28040 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
28050 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
28060 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   rc;.    }.    z
28070 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e  Utf8Name = zTmpn
28080 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
28090 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
280a0 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
280b0 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
280c0 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 2a  they are not.  *
280d0 2a 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61  * URIs with para
280e0 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20  meters.  Hence, 
280f0 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20  they can always 
28100 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  be passed into. 
28110 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69 5f   ** sqlite3_uri_
28120 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20 20 2a  parameter()..  *
28130 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65 54 79  /.  assert( (eTy
28140 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
28150 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66 6c 61  MAIN_DB) || (fla
28160 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
28170 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20 20 20  _URI) ||.       
28180 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69 74 65  zUtf8Name[sqlite
28190 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66 38 4e  3Strlen30(zUtf8N
281a0 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
281b0 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20   /* Convert the 
281c0 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68 65 20  filename to the 
281d0 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e 67 2e  system encoding.
281e0 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64   */.  zConverted
281f0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
28200 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 55  mUtf8Filename(zU
28210 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  tf8Name);.  if( 
28220 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
28230 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28240 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
28250 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
28260 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
28270 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 2c  TE_IOERR_NOMEM",
28280 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20   zUtf8Name));.  
28290 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
282a0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
282b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
282c0 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
282d0 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
282e0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
282f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28300 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
28310 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
28320 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
28330 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
28340 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  DIR", zUtf8Name)
28350 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28360 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
28370 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
28380 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
28390 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
283a0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
283b0 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
283c0 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
283d0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
283e0 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
283f0 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
28400 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
28410 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
28420 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
28430 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65  file is.  ** cre
28440 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65  ated. SQLite doe
28450 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69  sn't use it to i
28460 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69  ndicate "exclusi
28470 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20  ve access".  ** 
28480 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
28490 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
284a0 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
284b0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
284c0 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
284d0 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
284e0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
284f0 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
28500 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
28510 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
28520 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
28530 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
28540 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
28550 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
28560 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
28570 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
28580 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
28590 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
285a0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
285b0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
285c0 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
285d0 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
285e0 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
285f0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
28600 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
28610 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
28620 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
28630 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
28640 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
28650 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
28660 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
28670 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
28680 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
28690 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
286a0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
286b0 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
286c0 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
286d0 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
286e0 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
286f0 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
28720 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
28730 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
28740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28750 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
28760 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
28770 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
28780 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
28790 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
287a0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
287b0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
287c0 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
287d0 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
287e0 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
287f0 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
28800 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
28810 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
28820 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
28830 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
28840 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
28850 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
28860 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
28870 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
28880 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73  #endif..  if( os
28890 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
288a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
288b0 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
288c0 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
288d0 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
288e0 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
288f0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
28900 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
28910 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
28920 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
28930 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
28940 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
28950 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
28960 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
28970 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
28980 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
28990 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
289a0 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
289b0 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
289c0 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
289d0 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
289e0 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
289f0 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
28a00 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
28a10 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
28a20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
28a30 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
28a40 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
28a50 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
28a60 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
28a70 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
28a80 20 20 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20    do{.      h = 
28a90 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c  osCreateFile2((L
28aa0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
28ab0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
28ac0 20 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73             dwDes
28ad0 69 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20  iredAccess,.    
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
28b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28b10 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
28b20 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b40 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65          &extende
28b50 64 50 61 72 61 6d 65 74 65 72 73 29 3b 0a 20 20  dParameters);.  
28b60 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41 4c      if( h!=INVAL
28b70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
28b80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
28b90 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
28ba0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63  {.        int rc
28bb0 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20 20  2, isRO = 0;.   
28bc0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
28bd0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
28be0 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 77  .        rc2 = w
28bf0 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  inAccess(pVfs, z
28c00 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43 43  Name, SQLITE_ACC
28c10 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f 29  ESS_READ, &isRO)
28c20 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
28c30 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
28c40 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
28c50 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  rc2==SQLITE_OK &
28c60 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b 0a  & isRO ) break;.
28c70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
28c80 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72  le( winRetryIoer
28c90 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
28ca0 6e 6f 29 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20  no) );.#else.   
28cb0 20 64 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f   do{.      h = o
28cc0 73 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50  sCreateFileW((LP
28cd0 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
28ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28cf0 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
28d00 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
28d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
28d30 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
28d50 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
28d60 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46               dwF
28d80 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
28d90 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s,.             
28da0 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29             NULL)
28db0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 21 3d 49  ;.      if( h!=I
28dc0 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
28dd0 4c 55 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LUE ) break;.   
28de0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
28df0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  te ){.        in
28e00 74 20 72 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b  t rc2, isRO = 0;
28e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
28e20 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
28e30 63 28 29 3b 0a 20 20 20 20 20 20 20 20 72 63 32  c();.        rc2
28e40 20 3d 20 77 69 6e 41 63 63 65 73 73 28 70 56 66   = winAccess(pVf
28e50 73 2c 20 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45  s, zName, SQLITE
28e60 5f 41 43 43 45 53 53 5f 52 45 41 44 2c 20 26 69  _ACCESS_READ, &i
28e70 73 52 4f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  sRO);.        sq
28e80 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
28e90 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
28ea0 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
28eb0 4f 4b 20 26 26 20 69 73 52 4f 20 29 20 62 72 65  OK && isRO ) bre
28ec0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
28ed0 7d 77 68 69 6c 65 28 20 77 69 6e 52 65 74 72 79  }while( winRetry
28ee0 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
28ef0 74 45 72 72 6e 6f 29 20 29 3b 0a 23 65 6e 64 69  tErrno) );.#endi
28f00 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
28f10 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
28f20 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64  SI.  else{.    d
28f30 6f 7b 0a 20 20 20 20 20 20 68 20 3d 20 6f 73 43  o{.      h = osC
28f40 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50 43 53  reateFileA((LPCS
28f50 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20  TR)zConverted,. 
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f70 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
28f80 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fa0 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
28fb0 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
28fc0 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
28fd0 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
28fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28ff0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
29000 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 3b 0a 20          NULL);. 
29030 20 20 20 20 20 69 66 28 20 68 21 3d 49 4e 56 41       if( h!=INVA
29040 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
29050 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29060 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
29070 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
29080 63 32 2c 20 69 73 52 4f 20 3d 20 30 3b 0a 20 20  c2, isRO = 0;.  
29090 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
290a0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
290b0 3b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20  ;.        rc2 = 
290c0 77 69 6e 41 63 63 65 73 73 28 70 56 66 73 2c 20  winAccess(pVfs, 
290d0 7a 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 41 43  zName, SQLITE_AC
290e0 43 45 53 53 5f 52 45 41 44 2c 20 26 69 73 52 4f  CESS_READ, &isRO
290f0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
29100 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
29110 63 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c();.        if(
29120 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
29130 26 26 20 69 73 52 4f 20 29 20 62 72 65 61 6b 3b  && isRO ) break;
29140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
29150 69 6c 65 28 20 77 69 6e 52 65 74 72 79 49 6f 65  ile( winRetryIoe
29160 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
29170 72 6e 6f 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  rno) );.  }.#end
29180 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72  if.  winLogIoerr
29190 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  (cnt, __LINE__);
291a0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
291b0 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65  EN file=%p, name
291c0 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c  =%s, access=%lx,
291d0 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55   rc=%s\n", h, zU
291e0 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  tf8Name,.       
291f0 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
29200 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49 44  ess, (h==INVALID
29210 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20 3f  _HANDLE_VALUE) ?
29220 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b 22   "failed" : "ok"
29230 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49 4e  ));..  if( h==IN
29240 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
29250 55 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  UE ){.    sqlite
29260 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
29270 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  d);.    sqlite3_
29280 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a  free(zTmpname);.
29290 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72      if( isReadWr
292a0 69 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73  ite && !isExclus
292b0 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ive ){.      ret
292c0 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73  urn winOpen(pVfs
292d0 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20  , zName, id,.   
292e0 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51        ((flags|SQ
292f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
29300 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20  LY) &.          
29310 20 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c             ~(SQL
29320 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c  ITE_OPEN_CREATE|
29330 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
29340 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20  WRITE)),.       
29350 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20    pOutFlags);.  
29360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
29370 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
29380 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
29390 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53     winLogError(S
293a0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20  QLITE_CANTOPEN, 
293b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
293c0 2c 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74  , "winOpen", zUt
293d0 66 38 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  f8Name);.      r
293e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
293f0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
29400 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75  }.  }..  if( pOu
29410 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66  tFlags ){.    if
29420 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
29430 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  .      *pOutFlag
29440 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
29450 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d  READWRITE;.    }
29460 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75  else{.      *pOu
29470 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  tFlags = SQLITE_
29480 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
29490 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52     }.  }..  OSTR
294a0 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d  ACE(("OPEN file=
294b0 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63  %p, name=%s, acc
294c0 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61  ess=%lx, pOutFla
294d0 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67  gs=%p, *pOutFlag
294e0 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20  s=%d, ".        
294f0 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c     "rc=%s\n", h,
29500 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65   zUtf8Name, dwDe
29510 73 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75  siredAccess, pOu
29520 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67  tFlags, pOutFlag
29530 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a  s ?.           *
29540 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28  pOutFlags : 0, (
29550 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  h==INVALID_HANDL
29560 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c  E_VALUE) ? "fail
29570 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20  ed" : "ok"));.. 
29580 20 70 41 70 70 44 61 74 61 20 3d 20 28 77 69 6e   pAppData = (win
29590 56 66 73 41 70 70 44 61 74 61 2a 29 70 56 66 73  VfsAppData*)pVfs
295a0 2d 3e 70 41 70 70 44 61 74 61 3b 0a 0a 23 69 66  ->pAppData;..#if
295b0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
295c0 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 69 73 52  .  {.    if( isR
295d0 65 61 64 57 72 69 74 65 20 26 26 20 65 54 79 70  eadWrite && eTyp
295e0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
295f0 41 49 4e 5f 44 42 0a 20 20 20 20 20 20 20 20 20  AIN_DB.         
29600 26 26 20 28 28 70 41 70 70 44 61 74 61 3d 3d 4e  && ((pAppData==N
29610 55 4c 4c 29 20 7c 7c 20 21 70 41 70 70 44 61 74  ULL) || !pAppDat
29620 61 2d 3e 62 4e 6f 4c 6f 63 6b 29 0a 20 20 20 20  a->bNoLock).    
29630 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 77 69       && (rc = wi
29640 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28 7a 4e  nceCreateLock(zN
29650 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d 53 51  ame, pFile))!=SQ
29660 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 29 7b 0a 20  LITE_OK.    ){. 
29670 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
29680 6c 65 28 68 29 3b 0a 20 20 20 20 20 20 73 71 6c  le(h);.      sql
29690 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
296a0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c  rted);.      sql
296b0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
296c0 6d 65 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  me);.      OSTRA
296d0 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43  CE(("OPEN-CE-LOC
296e0 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  K name=%s, rc=%s
296f0 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69  \n", zName, sqli
29700 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
29710 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
29720 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  c;.    }.  }.  i
29730 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
29740 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
29750 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
29760 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
29770 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
29780 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29790 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ted);.  }..  sql
297a0 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
297b0 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  me);.  pFile->pM
297c0 65 74 68 6f 64 20 3d 20 70 41 70 70 44 61 74 61  ethod = pAppData
297d0 20 3f 20 70 41 70 70 44 61 74 61 2d 3e 70 4d 65   ? pAppData->pMe
297e0 74 68 6f 64 20 3a 20 26 77 69 6e 49 6f 4d 65 74  thod : &winIoMet
297f0 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 56  hod;.  pFile->pV
29800 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46 69  fs = pVfs;.  pFi
29810 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66 28  le->h = h;.  if(
29820 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20   isReadonly ){. 
29830 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
29840 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 52  ags |= WINFILE_R
29850 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
29860 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
29870 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73 6f  lean(zName, "pso
29880 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
29890 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
298a0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
298b0 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49  rlFlags |= WINFI
298c0 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 70  LE_PSOW;.  }.  p
298d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
298e0 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70 46  = NO_ERROR;.  pF
298f0 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e 61  ile->zPath = zNa
29900 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  me;.#if SQLITE_M
29910 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
29920 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20 4e   pFile->hMap = N
29930 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  ULL;.  pFile->pM
29940 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
29950 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
29960 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
29970 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
29980 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  ;.  pFile->mmapS
29990 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33  izeMax = sqlite3
299a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d  GlobalConfig.szM
299b0 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 4f  map;.#endif..  O
299c0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
299d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
299e0 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
299f0 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a 0a   named file..**.
29a00 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69 6e  ** Note that Win
29a10 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61 6c  dows does not al
29a20 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62 65  low a file to be
29a30 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d 65   deleted if some
29a40 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
29a50 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20 20  s has it open.  
29a60 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72 75  Sometimes a viru
29a70 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e 64  s scanner or ind
29a80 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a 2a  exing program.**
29a90 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f 75   will open a jou
29aa0 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74 6c  rnal file shortl
29ab0 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63 72  y after it is cr
29ac0 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20 74  eated in order t
29ad0 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65 72  o do.** whatever
29ae0 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c 65   it does.  While
29af0 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f 63   this other proc
29b00 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
29b10 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e 2c  he.** file open,
29b20 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61 62   we will be unab
29b30 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74 2e  le to delete it.
29b40 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
29b50 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65 6d   this.** problem
29b60 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20 6d  , we delay 100 m
29b70 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64 20  illiseconds and 
29b80 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61 67  try to delete ag
29b90 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20 4d  ain.  Up.** to M
29ba0 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d  X_DELETION_ATTEM
29bb0 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74 74  PTs deletion att
29bc0 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62 65  empts are run be
29bd0 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20 75  fore giving.** u
29be0 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  p and returning 
29bf0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61  an error..*/.sta
29c00 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
29c10 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
29c20 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
29c30 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
29c40 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
29c50 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
29c60 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ,      /* Name o
29c70 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65  f file to delete
29c80 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
29c90 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
29ca0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
29cb0 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20 69   win32 */.){.  i
29cc0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  nt cnt = 0;.  in
29cd0 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61 74  t rc;.  DWORD at
29ce0 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  tr;.  DWORD last
29cf0 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69  Errno = 0;.  voi
29d00 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
29d10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
29d20 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53 45  R(pVfs);.  UNUSE
29d30 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e 63  D_PARAMETER(sync
29d40 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Dir);..  Simulat
29d50 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
29d60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
29d70 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ETE);.  OSTRACE(
29d80 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73  ("DELETE name=%s
29d90 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22 2c  , syncDir=%d\n",
29da0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e 63   zFilename, sync
29db0 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65  Dir));..  zConve
29dc0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
29dd0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
29de0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
29df0 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
29e00 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
29e10 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
29e20 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
29e30 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69  RR_NOMEM\n", zFi
29e40 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65  lename));.    re
29e50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
29e60 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
29e70 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  }.  if( osIsNT()
29e80 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 23 69 66   ){.    do {.#if
29e90 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
29ea0 0a 20 20 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  .      WIN32_FIL
29eb0 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
29ec0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
29ed0 20 20 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44    memset(&sAttrD
29ee0 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ata, 0, sizeof(s
29ef0 41 74 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20  AttrData));.    
29f00 20 20 69 66 20 28 20 6f 73 47 65 74 46 69 6c 65    if ( osGetFile
29f10 41 74 74 72 69 62 75 74 65 73 45 78 57 28 7a 43  AttributesExW(zC
29f20 6f 6e 76 65 72 74 65 64 2c 20 47 65 74 46 69 6c  onverted, GetFil
29f30 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
29f40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f60 20 20 20 26 73 41 74 74 72 44 61 74 61 29 20 29     &sAttrData) )
29f70 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
29f80 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c   sAttrData.dwFil
29f90 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20  eAttributes;.   
29fa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29fb0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
29fc0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
29fd0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
29fe0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
29ff0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
2a000 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
2a010 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
2a020 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
2a030 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a040 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
2a050 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
2a060 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
2a070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2a080 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2a090 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
2a0a0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2a0b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
2a0c0 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69    attr = osGetFi
2a0d0 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 43  leAttributesW(zC
2a0e0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
2a0f0 66 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  f.      if ( att
2a100 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
2a110 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
2a120 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
2a130 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
2a140 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
2a150 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
2a160 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
2a170 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
2a180 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
2a190 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
2a1a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2a1b0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
2a1c0 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
2a1d0 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
2a1e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a1f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a200 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
2a210 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
2a220 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a230 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
2a240 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
2a250 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
2a260 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
2a270 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
2a280 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
2a290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2a2a0 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
2a2b0 65 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eW(zConverted) )
2a2c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2a2d0 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
2a2e0 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
2a2f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a300 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
2a310 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
2a320 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
2a330 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2a340 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
2a350 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
2a360 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
2a370 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
2a380 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
2a390 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2a3a0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2a3b0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
2a3c0 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46     attr = osGetF
2a3d0 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a  ileAttributesA(z
2a3e0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a3f0 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e 56    if ( attr==INV
2a400 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2a410 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20 20  UTES ){.        
2a420 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
2a430 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
2a440 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
2a450 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno==ERROR_FILE_
2a460 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20  NOT_FOUND.      
2a470 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d     || lastErrno=
2a480 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f  =ERROR_PATH_NOT_
2a490 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  FOUND ){.       
2a4a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2a4b0 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
2a4c0 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f  T; /* Already go
2a4d0 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ne? */.        }
2a4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2a4f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
2a500 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2a510 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a520 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 61    }.      if ( a
2a530 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
2a540 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b 0a  TE_DIRECTORY ){.
2a550 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2a560 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46 69  ITE_ERROR; /* Fi
2a570 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20  les only. */.   
2a580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a590 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 6f    }.      if ( o
2a5a0 73 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 43 6f  sDeleteFileA(zCo
2a5b0 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20  nverted) ){.    
2a5c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a5d0 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20 4f  OK; /* Deleted O
2a5e0 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  K. */.        br
2a5f0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a600 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74 72     if ( !winRetr
2a610 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
2a620 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20  stErrno) ){.    
2a630 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2a640 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72  ERROR; /* No mor
2a650 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20 20  e retries. */.  
2a660 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2a670 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65     }.    } while
2a680 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  (1);.  }.#endif.
2a690 20 20 69 66 28 20 72 63 20 26 26 20 72 63 21 3d    if( rc && rc!=
2a6a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
2a6b0 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a 20 20 20  ETE_NOENT ){.   
2a6c0 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
2a6d0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
2a6e0 45 4c 45 54 45 2c 20 6c 61 73 74 45 72 72 6e 6f  ELETE, lastErrno
2a6f0 2c 20 22 77 69 6e 44 65 6c 65 74 65 22 2c 20 7a  , "winDelete", z
2a700 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c  Filename);.  }el
2a710 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
2a720 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
2a730 5f 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  _);.  }.  sqlite
2a740 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2a750 64 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  d);.  OSTRACE(("
2a760 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20  DELETE name=%s, 
2a770 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e  rc=%s\n", zFilen
2a780 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  ame, sqlite3ErrN
2a790 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74  ame(rc)));.  ret
2a7a0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2a7b0 20 43 68 65 63 6b 20 74 68 65 20 65 78 69 73 74   Check the exist
2a7c0 65 6e 63 65 20 61 6e 64 20 73 74 61 74 75 73 20  ence and status 
2a7d0 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  of a file..*/.st
2a7e0 61 74 69 63 20 69 6e 74 20 77 69 6e 41 63 63 65  atic int winAcce
2a7f0 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ss(.  sqlite3_vf
2a800 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
2a810 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20   /* Not used on 
2a820 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73 74  win32 */.  const
2a830 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2a840 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ,     /* Name of
2a850 20 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a   file to check *
2a860 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a880 2a 20 54 79 70 65 20 6f 66 20 74 65 73 74 20 74  * Type of test t
2a890 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69 73 20 66  o make on this f
2a8a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  ile */.  int *pR
2a8b0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
2a8c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 73 75      /* OUT: Resu
2a8d0 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57 4f 52 44  lt */.){.  DWORD
2a8e0 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
2a8f0 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
2a900 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
2a910 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
2a920 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2a930 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 53 69 6d  ER(pVfs);..  Sim
2a940 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2a950 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2a960 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 4f  R_ACCESS; );.  O
2a970 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
2a980 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67 73 3d 25  name=%s, flags=%
2a990 78 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c 6e 22  x, pResOut=%p\n"
2a9a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
2a9b0 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73 2c 20 70  lename, flags, p
2a9c0 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 7a 43 6f  ResOut));..  zCo
2a9d0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
2a9e0 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
2a9f0 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
2aa00 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
2aa10 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
2aa20 41 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d  ACE(("ACCESS nam
2aa30 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
2aa40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
2aa50 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
2aa60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2aa70 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2aa80 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
2aa90 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 63  T() ){.    int c
2aaa0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e 33  nt = 0;.    WIN3
2aab0 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  2_FILE_ATTRIBUTE
2aac0 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61 3b  _DATA sAttrData;
2aad0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74  .    memset(&sAt
2aae0 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
2aaf0 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
2ab00 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20 3d     while( !(rc =
2ab10 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
2ab20 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54 52  utesExW((LPCWSTR
2ab30 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20  )zConverted,.   
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab50 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69 6c            GetFil
2ab60 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64 2c  eExInfoStandard,
2ab70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
2ab90 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77 69  AttrData)) && wi
2aba0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
2abb0 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
2abc0 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  }.    if( rc ){.
2abd0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20        /* For an 
2abe0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
2abf0 49 53 54 53 20 71 75 65 72 79 2c 20 74 72 65 61  ISTS query, trea
2ac00 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  t a zero-length 
2ac10 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 73  file.      ** as
2ac20 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
2ac30 65 78 69 73 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  exist..      */.
2ac40 20 20 20 20 20 20 69 66 28 20 20 20 20 66 6c 61        if(    fla
2ac50 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
2ac60 53 5f 45 58 49 53 54 53 0a 20 20 20 20 20 20 20  S_EXISTS.       
2ac70 20 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e     && sAttrData.
2ac80 6e 46 69 6c 65 53 69 7a 65 48 69 67 68 3d 3d 30  nFileSizeHigh==0
2ac90 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41  .          && sA
2aca0 74 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a  ttrData.nFileSiz
2acb0 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  eLow==0 ){.     
2acc0 20 20 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49     attr = INVALI
2acd0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
2ace0 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
2acf0 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20 73          attr = s
2ad00 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
2ad10 74 74 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20  ttributes;.     
2ad20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2ad30 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
2ad40 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
2ad50 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45 72        if( lastEr
2ad60 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49 4c 45 5f  rno!=ERROR_FILE_
2ad70 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20 6c 61 73  NOT_FOUND && las
2ad80 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 50 41  tErrno!=ERROR_PA
2ad90 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a  TH_NOT_FOUND ){.
2ada0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2adb0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2adc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2add0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
2ade0 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53  ITE_IOERR_ACCESS
2adf0 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
2ae00 6e 41 63 63 65 73 73 22 2c 0a 20 20 20 20 20 20  nAccess",.      
2ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 29 3b       zFilename);
2ae30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ae40 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
2ae50 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
2ae60 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 0a 20 20  UTES;.      }.  
2ae70 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53    }.  }.#ifdef S
2ae80 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2ae90 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2aea0 20 61 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c   attr = osGetFil
2aeb0 65 41 74 74 72 69 62 75 74 65 73 41 28 28 63 68  eAttributesA((ch
2aec0 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ar*)zConverted);
2aed0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
2aee0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2aef0 65 72 74 65 64 29 3b 0a 20 20 73 77 69 74 63 68  erted);.  switch
2af00 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
2af10 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
2af20 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
2af30 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
2af40 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
2af50 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
2af60 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
2af70 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2af80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
2af90 43 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 0a  CESS_READWRITE:.
2afa0 20 20 20 20 20 20 72 63 20 3d 20 61 74 74 72 21        rc = attr!
2afb0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2afc0 54 52 49 42 55 54 45 53 20 26 26 0a 20 20 20 20  TRIBUTES &&.    
2afd0 20 20 20 20 20 20 20 20 20 28 61 74 74 72 20 26           (attr &
2afe0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2aff0 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b 0a 20 20  READONLY)==0;.  
2b000 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64      break;.    d
2b010 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73  efault:.      as
2b020 73 65 72 74 28 21 22 49 6e 76 61 6c 69 64 20 66  sert(!"Invalid f
2b030 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 22 29 3b  lags argument");
2b040 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
2b050 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41 43 45 28  = rc;.  OSTRACE(
2b060 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
2b070 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70  , pResOut=%p, *p
2b080 52 65 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51  ResOut=%d, rc=SQ
2b090 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
2b0a0 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65         zFilename
2b0b0 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70 52 65 73  , pResOut, *pRes
2b0c0 4f 75 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Out));.  return 
2b0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2b0e0 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d  .** Returns non-
2b0f0 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63  zero if the spec
2b100 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65 20  ified path name 
2b110 73 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72  starts with a dr
2b120 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a 20 66 6f  ive letter.** fo
2b130 6c 6c 6f 77 65 64 20 62 79 20 61 20 63 6f 6c 6f  llowed by a colo
2b140 6e 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  n character..*/.
2b150 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
2b160 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
2b170 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  olon(.  const ch
2b180 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
2b190 0a 20 20 72 65 74 75 72 6e 20 28 20 73 71 6c 69  .  return ( sqli
2b1a0 74 65 33 49 73 61 6c 70 68 61 28 7a 50 61 74 68  te3Isalpha(zPath
2b1b0 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 50 61 74  name[0]) && zPat
2b1c0 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27 20 29 3b  hname[1]==':' );
2b1d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2b1e0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2b1f0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2b200 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 62 65 20   name should be 
2b210 75 73 65 64 20 76 65 72 62 61 74 69 6d 2e 20 20  used verbatim.  
2b220 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69  If.** non-zero i
2b230 73 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  s returned from 
2b240 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 74  this function, t
2b250 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
2b260 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70 6c 79 0a  ion must simply.
2b270 2a 2a 20 75 73 65 20 74 68 65 20 70 72 6f 76 69  ** use the provi
2b280 64 65 64 20 70 61 74 68 20 6e 61 6d 65 20 76 65  ded path name ve
2b290 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72 65 73 6f  rbatim -OR- reso
2b2a0 6c 76 65 20 69 74 20 69 6e 74 6f 20 61 20 66 75  lve it into a fu
2b2b0 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a 2a 2a 20  ll path name.** 
2b2c0 75 73 69 6e 67 20 74 68 65 20 47 65 74 46 75 6c  using the GetFul
2b2d0 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e 33 32 20  lPathName Win32 
2b2e0 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 28 69 66  API function (if
2b2f0 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a   available)..*/.
2b300 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 49  static BOOL winI
2b310 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d  sVerbatimPathnam
2b320 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2b330 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20  *zPathname.){.  
2b340 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 70  /*.  ** If the p
2b350 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20  ath name starts 
2b360 77 69 74 68 20 61 20 66 6f 72 77 61 72 64 20 73  with a forward s
2b370 6c 61 73 68 20 6f 72 20 61 20 62 61 63 6b 73 6c  lash or a backsl
2b380 61 73 68 2c 20 69 74 20 69 73 20 65 69 74 68 65  ash, it is eithe
2b390 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61 6c 20 55  r.  ** a legal U
2b3a0 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f 6c 75 6d  NC name, a volum
2b3b0 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 2c  e relative path,
2b3c0 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   or an absolute 
2b3d0 70 61 74 68 20 6e 61 6d 65 20 69 6e 20 74 68 65  path name in the
2b3e0 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20 66 6f 72  .  ** "Unix" for
2b3f0 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77 73 2e 20  mat on Windows. 
2b400 20 54 68 65 72 65 20 69 73 20 6e 6f 20 65 61 73   There is no eas
2b410 79 20 77 61 79 20 74 6f 20 64 69 66 66 65 72 65  y way to differe
2b420 6e 74 69 61 74 65 20 62 65 74 77 65 65 6e 0a 20  ntiate between. 
2b430 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 74 77   ** the final tw
2b440 6f 20 63 61 73 65 73 3b 20 74 68 65 72 65 66 6f  o cases; therefo
2b450 72 65 2c 20 77 65 20 72 65 74 75 72 6e 20 74 68  re, we return th
2b460 65 20 73 61 66 65 72 20 72 65 74 75 72 6e 20 76  e safer return v
2b470 61 6c 75 65 20 6f 66 20 54 52 55 45 0a 20 20 2a  alue of TRUE.  *
2b480 2a 20 73 6f 20 74 68 61 74 20 63 61 6c 6c 65 72  * so that caller
2b490 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
2b4a0 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c 79 20 75  on will simply u
2b4b0 73 65 20 69 74 20 76 65 72 62 61 74 69 6d 2e 0a  se it verbatim..
2b4c0 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
2b4d0 73 44 69 72 53 65 70 28 7a 50 61 74 68 6e 61 6d  sDirSep(zPathnam
2b4e0 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20 72 65 74  e[0]) ){.    ret
2b4f0 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20  urn TRUE;.  }.. 
2b500 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   /*.  ** If the 
2b510 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74 73  path name starts
2b520 20 77 69 74 68 20 61 20 6c 65 74 74 65 72 20 61   with a letter a
2b530 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74 20 69 73  nd a colon it is
2b540 20 65 69 74 68 65 72 20 61 20 76 6f 6c 75 6d 65   either a volume
2b550 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 70  .  ** relative p
2b560 61 74 68 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  ath or an absolu
2b570 74 65 20 70 61 74 68 2e 20 20 43 61 6c 6c 65 72  te path.  Caller
2b580 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
2b590 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20 20 2a 2a  on must not.  **
2b5a0 20 61 74 74 65 6d 70 74 20 74 6f 20 74 72 65 61   attempt to trea
2b5b0 74 20 69 74 20 61 73 20 61 20 72 65 6c 61 74 69  t it as a relati
2b5c0 76 65 20 70 61 74 68 20 6e 61 6d 65 20 28 69 2e  ve path name (i.
2b5d0 65 2e 20 74 68 65 79 20 73 68 6f 75 6c 64 20 73  e. they should s
2b5e0 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a 2a 20 69  imply use.  ** i
2b5f0 74 20 76 65 72 62 61 74 69 6d 29 2e 0a 20 20 2a  t verbatim)..  *
2b600 2f 0a 20 20 69 66 20 28 20 77 69 6e 49 73 44 72  /.  if ( winIsDr
2b610 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f  iveLetterAndColo
2b620 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20 29 7b 0a  n(zPathname) ){.
2b630 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
2b640 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
2b650 49 66 20 77 65 20 67 65 74 20 74 6f 20 74 68 69  If we get to thi
2b660 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 70 61 74  s point, the pat
2b670 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20 61 6c  h name should al
2b680 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c 79 20 62  most certainly b
2b690 65 20 61 20 70 75 72 65 6c 79 0a 20 20 2a 2a 20  e a purely.  ** 
2b6a0 72 65 6c 61 74 69 76 65 20 6f 6e 65 20 28 69 2e  relative one (i.
2b6b0 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20 6e 61 6d  e. not a UNC nam
2b6c0 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75 74 65 2c  e, not absolute,
2b6d0 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75 6d 65 20   and not volume 
2b6e0 72 65 6c 61 74 69 76 65 29 2e 0a 20 20 2a 2f 0a  relative)..  */.
2b6f0 20 20 72 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a    return FALSE;.
2b700 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20  }../*.** Turn a 
2b710 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
2b720 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  e into a full pa
2b730 74 68 6e 61 6d 65 2e 20 20 57 72 69 74 65 20 74  thname.  Write t
2b740 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61 74 68 6e  he full.** pathn
2b750 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74 5b 5d 2e  ame into zOut[].
2b760 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c 20 62 65    zOut[] will be
2b770 20 61 74 20 6c 65 61 73 74 20 70 56 66 73 2d 3e   at least pVfs->
2b780 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a 20 62 79  mxPathname.** by
2b790 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a  tes in size..*/.
2b7a0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 75  static int winFu
2b7b0 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
2b7c0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2b7e0 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
2b7f0 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
2b800 63 68 61 72 20 2a 7a 52 65 6c 61 74 69 76 65 2c  char *zRelative,
2b810 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
2b820 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
2b830 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
2b840 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20 20 20 20   nFull,         
2b850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2b860 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
2b870 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
2b880 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 20 20    char *zFull   
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
2b8b0 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49   */.){.#if !SQLI
2b8c0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
2b8d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
2b8e0 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
2b8f0 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20  GWIN__).  DWORD 
2b900 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a  nByte;.  void *z
2b910 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61  Converted;.  cha
2b920 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64 69 66 0a  r *zOut;.#endif.
2b930 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
2b940 74 68 20 6e 61 6d 65 20 62 65 67 69 6e 73 20 77  th name begins w
2b950 69 74 68 20 22 2f 58 3a 22 2c 20 77 68 65 72 65  ith "/X:", where
2b960 20 22 58 22 20 69 73 20 61 6e 79 20 61 6c 70 68   "X" is any alph
2b970 61 62 65 74 69 63 0a 20 20 2a 2a 20 63 68 61 72  abetic.  ** char
2b980 61 63 74 65 72 2c 20 64 69 73 63 61 72 64 20 74  acter, discard t
2b990 68 65 20 69 6e 69 74 69 61 6c 20 22 2f 22 20 66  he initial "/" f
2b9a0 72 6f 6d 20 74 68 65 20 70 61 74 68 6e 61 6d 65  rom the pathname
2b9b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65  ..  */.  if( zRe
2b9c0 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26  lative[0]=='/' &
2b9d0 26 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  & winIsDriveLett
2b9e0 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61  erAndColon(zRela
2b9f0 74 69 76 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a  tive+1) ){.    z
2ba00 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a  Relative++;.  }.
2ba10 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
2ba20 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c  YGWIN__).  Simul
2ba30 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
2ba40 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
2ba50 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2ba60 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20  METER(nFull);.  
2ba70 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70  assert( nFull>=p
2ba80 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2ba90 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  );.  if ( sqlite
2baa0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2bab0 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
2bac0 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
2bad0 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
2bae0 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
2baf0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2bb00 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2bb10 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
2bb20 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
2bb30 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2bb40 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
2bb50 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
2bb60 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
2bb70 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
2bb80 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
2bb90 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
2bba0 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
2bbb0 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
2bbc0 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
2bbd0 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
2bbe0 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  a slash..    */.
2bbf0 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
2bc00 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
2bc10 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
2bc20 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
2bc30 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
2bc40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2bc50 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2bc60 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
2bc70 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28  ygwin_conv_path(
2bc80 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73  .            (os
2bc90 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53  IsNT() ? CCP_POS
2bca0 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43  IX_TO_WIN_W : CC
2bcb0 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41  P_POSIX_TO_WIN_A
2bcc0 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) |.            
2bcd0 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52  CCP_RELATIVE, zR
2bce0 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
2bcf0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2bd00 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
2bd10 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2bd20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
2bd30 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2bd40 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
2bd50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
2bd60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2bd70 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2bd80 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
2bd90 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2bda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2bdb0 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
2bdc0 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
2bdd0 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
2bde0 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
2bdf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2be00 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2be10 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2be20 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2be30 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2be40 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2be50 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2be60 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2be70 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2be80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2be90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2bea0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20  data_directory, 
2beb0 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20  winGetDirSep(), 
2bec0 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71  zUtf8);.      sq
2bed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66 38  lite3_free(zUtf8
2bee0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2bef0 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
2bf00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2bf10 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c  char *zOut = sql
2bf20 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2bf30 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2bf40 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  +1 );.    if( !z
2bf50 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Out ){.      ret
2bf60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2bf70 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
2bf80 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69   }.    if( cygwi
2bf90 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20  n_conv_path(.   
2bfa0 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54           (osIsNT
2bfb0 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54  () ? CCP_POSIX_T
2bfc0 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f  O_WIN_W : CCP_PO
2bfd0 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20  SIX_TO_WIN_A),. 
2bfe0 20 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61             zRela
2bff0 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
2c000 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
2c010 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2c020 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2c030 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2c040 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2c050 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
2c060 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
2c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c080 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
2c090 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65  lPathname2", zRe
2c0a0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
2c0b0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
2c0c0 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
2c0d0 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
2c0e0 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
2c0f0 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
2c100 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c110 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
2c120 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2c130 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2c140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2c150 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2c160 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2c170 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2c180 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66 38 29  ll, "%s", zUtf8)
2c190 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c1a0 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20 20 20  free(zUtf8);.   
2c1b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c1c0 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zOut);.    }.  }
2c1d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c1e0 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  _OK;.#endif..#if
2c1f0 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   (SQLITE_OS_WINC
2c200 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57  E || SQLITE_OS_W
2c210 49 4e 52 54 29 20 26 26 20 21 64 65 66 69 6e 65  INRT) && !define
2c220 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2c230 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
2c240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2c250 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e  RROR );.  /* Win
2c260 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70  CE has no concep
2c270 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76 65 20  t of a relative 
2c280 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20  pathname, or so 
2c290 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20  I am told. */.  
2c2a0 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e 6f 20  /* WinRT has no 
2c2b0 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74 20 61  way to convert a
2c2c0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 74   relative path t
2c2d0 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e  o an absolute on
2c2e0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c  e. */.  if ( sql
2c2f0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
2c300 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
2c310 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
2c320 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
2c330 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
2c340 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
2c350 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
2c360 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
2c370 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
2c380 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
2c390 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
2c3a0 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
2c3b0 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
2c3c0 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
2c3d0 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
2c3e0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
2c3f0 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
2c400 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
2c410 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
2c420 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
2c430 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a  nd a backslash..
2c440 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
2c450 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
2c460 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
2c470 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
2c480 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20 20 20   "%s%c%s",.     
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2c4b0 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74 44 69  ectory, winGetDi
2c4c0 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74 69 76  rSep(), zRelativ
2c4d0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
2c4e0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c4f0 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2c500 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2c510 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65  zFull, "%s", zRe
2c520 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72  lative);.  }.  r
2c530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2c540 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51  .#endif..#if !SQ
2c550 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2c560 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2c570 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
2c580 43 59 47 57 49 4e 5f 5f 29 0a 20 20 2f 2a 20 49  CYGWIN__).  /* I
2c590 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
2c5a0 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
2c5b0 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
2c5c0 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
2c5d0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
2c5e0 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
2c5f0 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
2c600 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
2c610 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
2c620 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69  ion failing. Thi
2c630 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64  s function could
2c640 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78   fail if, for ex
2c650 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20  ample, the.  ** 
2c660 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20  current working 
2c670 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2c680 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a  en unlinked..  *
2c690 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  /.  SimulateIOEr
2c6a0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2c6b0 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66  TE_ERROR );.  if
2c6c0 20 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f   ( sqlite3_data_
2c6d0 64 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69  directory && !wi
2c6e0 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e  nIsVerbatimPathn
2c6f0 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29  ame(zRelative) )
2c700 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
2c710 4e 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61  NOTE: We are dea
2c720 6c 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61  ling with a rela
2c730 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61  tive path name a
2c740 6e 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20  nd the data.    
2c750 2a 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f  **       directo
2c760 72 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  ry has been set.
2c770 20 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65    Therefore, use
2c780 20 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73   it as the basis
2c790 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f  .    **       fo
2c7a0 72 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65  r converting the
2c7b0 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
2c7c0 61 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75  ame to an absolu
2c7d0 74 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  te.    **       
2c7e0 6f 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e  one by prependin
2c7f0 67 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63  g the data direc
2c800 74 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73  tory and a backs
2c810 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
2c820 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c830 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2c840 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2c850 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c  zFull, "%s%c%s",
2c860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c870 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61        sqlite3_da
2c880 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69  ta_directory, wi
2c890 6e 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52  nGetDirSep(), zR
2c8a0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65  elative);.    re
2c8b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c8c0 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64    }.  zConverted
2c8d0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2c8e0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52  mUtf8Filename(zR
2c8f0 65 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20  elative);.  if( 
2c900 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b  zConverted==0 ){
2c910 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2c920 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2c930 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  KPT;.  }.  if( o
2c940 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c  sIsNT() ){.    L
2c950 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20  PWSTR zTemp;.   
2c960 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
2c970 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43  llPathNameW((LPC
2c980 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2c990 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69   0, 0, 0);.    i
2c9a0 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2c9b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c9c0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2c9d0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
2c9e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
2c9f0 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
2ca00 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
2ca10 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
2ca30 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c  nFullPathname1",
2ca40 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2ca50 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20   }.    nByte += 
2ca60 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73  3;.    zTemp = s
2ca70 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
2ca80 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
2ca90 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20  Temp[0]) );.    
2caa0 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a  if( zTemp==0 ){.
2cab0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2cac0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2cad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2cae0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2caf0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
2cb00 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2cb10 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2cb20 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2cb30 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29  nByte, zTemp, 0)
2cb40 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
2cb50 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
2cb60 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2cb70 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ted);.      sqli
2cb80 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b  te3_free(zTemp);
2cb90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
2cba0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
2cbb0 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
2cbc0 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72  TH, osGetLastErr
2cbd0 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or(),.          
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2cbf0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32  winFullPathname2
2cc00 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
2cc10 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2cc20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2cc30 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  );.    zOut = wi
2cc40 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
2cc50 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
2cc60 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2cc70 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
2cc80 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
2cc90 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
2cca0 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42  r *zTemp;.    nB
2ccb0 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2ccc0 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
2ccd0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30  zConverted, 0, 0
2cce0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2ccf0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2cd00 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2cd10 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2cd20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2cd30 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2cd40 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2cd50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd70 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2cd80 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c  Pathname3", zRel
2cd90 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2cda0 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20    nByte += 3;.  
2cdb0 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65    zTemp = sqlite
2cdc0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79  3MallocZero( nBy
2cdd0 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b  te*sizeof(zTemp[
2cde0 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  0]) );.    if( z
2cdf0 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Temp==0 ){.     
2ce00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2ce10 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
2ce20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ce30 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
2ce40 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
2ce50 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68   = osGetFullPath
2ce60 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f  NameA((char*)zCo
2ce70 6e 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20  nverted, nByte, 
2ce80 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69  zTemp, 0);.    i
2ce90 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20  f( nByte==0 ){. 
2cea0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ceb0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2cec0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2ced0 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  e(zTemp);.      
2cee0 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
2cef0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
2cf00 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47  EN_FULLPATH, osG
2cf10 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
2cf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf30 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
2cf40 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c  Pathname4", zRel
2cf50 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ative);.    }.  
2cf60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2cf70 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2cf80 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f  zOut = winMbcsTo
2cf90 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72  Utf8(zTemp, osAr
2cfa0 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29  eFileApisANSI())
2cfb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2cfc0 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23  ee(zTemp);.  }.#
2cfd0 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74  endif.  if( zOut
2cfe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2cff0 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2d000 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2d010 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2d020 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73  s", zOut);.    s
2d030 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74  qlite3_free(zOut
2d040 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2d050 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2d060 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d070 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
2d080 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BKPT;.  }.#endif
2d090 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2d0a0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2d0b0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2d0c0 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2d0d0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2d0e0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2d0f0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2d100 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2d110 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2d120 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2d130 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
2d140 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
2d150 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2d160 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
2d170 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
2d180 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
2d190 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2d1a0 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
2d1b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2d1c0 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
2d1d0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2d1e0 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
2d1f0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2d200 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
2d210 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
2d220 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2d230 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2d240 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2d250 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2d260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2d270 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
2d280 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2d290 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
2d2a0 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
2d2b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2d2c0 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
2d2d0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2d2e0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2d2f0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2d300 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
2d310 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2d320 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2d330 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2d340 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
2d350 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2d360 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
2d370 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2d380 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
2d390 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
2d3a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
2d3b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2d3c0 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
2d3d0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
2d3e0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2d3f0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2d400 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2d410 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2d420 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2d430 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
2d440 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
2d450 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2d460 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
2d470 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
2d480 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2d490 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
2d4a0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
2d4b0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
2d4c0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
2d4d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2d4e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2d4f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
2d500 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
2d510 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2d520 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2d530 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2d540 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2d550 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2d560 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
2d570 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2d580 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
2d590 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
2d5a0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
2d5b0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
2d5c0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2d5d0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
2d5e0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2d5f0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2d600 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
2d610 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
2d620 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
2d630 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
2d640 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
2d650 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2d660 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
2d670 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
2d680 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
2d690 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
2d6a0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
2d6b0 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
2d6c0 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
2d6d0 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
2d6e0 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
2d6f0 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
2d700 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
2d710 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
2d720 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
2d730 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
2d740 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
2d750 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
2d760 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
2d770 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2d780 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
2d790 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
2d7a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2d7b0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
2d7c0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
2d7d0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
2d7e0 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
2d7f0 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
2d800 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
2d810 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
2d820 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
2d830 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
2d840 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
2d850 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
2d860 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
2d870 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
2d880 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
2d890 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
2d8a0 66 0a 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f  f../* State info
2d8b0 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
2d8c0 72 61 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65  randomness gathe
2d8d0 72 65 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20  rer. */.typedef 
2d8e0 73 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61  struct EntropyGa
2d8f0 74 68 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61  therer EntropyGa
2d900 74 68 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45  therer;.struct E
2d910 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b  ntropyGatherer {
2d920 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2d930 20 2a 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72   *a;   /* Gather
2d940 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68   entropy into th
2d950 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
2d960 6e 74 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20  nt na;          
2d970 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b     /* Size of a[
2d980 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  ] in bytes */.  
2d990 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2d9a0 20 20 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20      /* XOR next 
2d9b0 69 6e 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20  input into a[i] 
2d9c0 2a 2f 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20  */.  int nXor;  
2d9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d9e0 65 72 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74  er of XOR operat
2d9f0 69 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a  ions done */.};.
2da00 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2da10 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64  LITE_TEST) && !d
2da20 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2da30 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f  IT_RANDOMNESS)./
2da40 2a 20 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f  * Mix sz bytes o
2da50 66 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70  f entropy into p
2da60 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  . */.static void
2da70 20 78 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f   xorMemory(Entro
2da80 70 79 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75  pyGatherer *p, u
2da90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c  nsigned char *x,
2daa0 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20   int sz){.  int 
2dab0 6a 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c  j, k;.  for(j=0,
2dac0 20 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a   k=p->i; j<sz; j
2dad0 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b  ++){.    p->a[k+
2dae0 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20  +] ^= x[j];.    
2daf0 69 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b  if( k>=p->na ) k
2db00 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69   = 0;.  }.  p->i
2db10 20 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20   = k;.  p->nXor 
2db20 2b 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  += sz;.}.#endif 
2db30 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
2db40 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66  TE_TEST) && !def
2db50 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2db60 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a  _RANDOMNESS) */.
2db70 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20  ./*.** Write up 
2db80 74 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  to nBuf bytes of
2db90 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f   randomness into
2dba0 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63   zBuf..*/.static
2dbb0 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65   int winRandomne
2dbc0 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
2dbd0 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2dbe0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66  char *zBuf){.#if
2dbf0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2dc00 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2dc10 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
2dc20 44 4f 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45  DOMNESS).  UNUSE
2dc30 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2dc40 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  );.  memset(zBuf
2dc50 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65  , 0, nBuf);.  re
2dc60 74 75 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65  turn nBuf;.#else
2dc70 0a 20 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  .  EntropyGather
2dc80 65 72 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50  er e;.  UNUSED_P
2dc90 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2dca0 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
2dcb0 2c 20 6e 42 75 66 29 3b 0a 20 20 65 2e 61 20 3d  , nBuf);.  e.a =
2dcc0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2dcd0 29 7a 42 75 66 3b 0a 20 20 65 2e 6e 61 20 3d 20  )zBuf;.  e.na = 
2dce0 6e 42 75 66 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d  nBuf;.  e.nXor =
2dcf0 20 30 3b 0a 20 20 65 2e 69 20 3d 20 30 3b 0a 20   0;.  e.i = 0;. 
2dd00 20 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d   {.    SYSTEMTIM
2dd10 45 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79  E x;.    osGetSy
2dd20 73 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20  stemTime(&x);.  
2dd30 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2dd40 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2dd50 26 78 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45  &x, sizeof(SYSTE
2dd60 4d 54 49 4d 45 29 29 3b 0a 20 20 7d 0a 20 20 7b  MTIME));.  }.  {
2dd70 0a 20 20 20 20 44 57 4f 52 44 20 70 69 64 20 3d  .    DWORD pid =
2dd80 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
2dd90 63 65 73 73 49 64 28 29 3b 0a 20 20 20 20 78 6f  cessId();.    xo
2dda0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2ddb0 69 67 6e 65 64 20 63 68 61 72 2a 29 26 70 69 64  igned char*)&pid
2ddc0 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29  , sizeof(DWORD))
2ddd0 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45  ;.  }.#if SQLITE
2dde0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20  _OS_WINRT.  {.  
2ddf0 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20    ULONGLONG cnt 
2de00 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74  = osGetTickCount
2de10 36 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d  64();.    xorMem
2de20 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65  ory(&e, (unsigne
2de30 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73 69  d char*)&cnt, si
2de40 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29 29  zeof(ULONGLONG))
2de50 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a  ;.  }.#else.  {.
2de60 20 20 20 20 44 57 4f 52 44 20 63 6e 74 20 3d 20      DWORD cnt = 
2de70 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 28 29  osGetTickCount()
2de80 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28  ;.    xorMemory(
2de90 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  &e, (unsigned ch
2dea0 61 72 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66  ar*)&cnt, sizeof
2deb0 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 65  (DWORD));.  }.#e
2dec0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2ded0 53 5f 57 49 4e 52 54 20 2a 2f 0a 20 20 7b 0a 20  S_WINRT */.  {. 
2dee0 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
2def0 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
2df00 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
2df10 72 28 26 69 29 3b 0a 20 20 20 20 78 6f 72 4d 65  r(&i);.    xorMe
2df20 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2df30 65 64 20 63 68 61 72 2a 29 26 69 2c 20 73 69 7a  ed char*)&i, siz
2df40 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47 45  eof(LARGE_INTEGE
2df50 52 29 29 3b 0a 20 20 7d 0a 23 69 66 20 21 53 51  R));.  }.#if !SQ
2df60 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
2df70 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
2df80 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
2df90 32 5f 55 53 45 5f 55 55 49 44 0a 20 20 7b 0a 20  2_USE_UUID.  {. 
2dfa0 20 20 20 55 55 49 44 20 69 64 3b 0a 20 20 20 20     UUID id;.    
2dfb0 6d 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73  memset(&id, 0, s
2dfc0 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2dfd0 20 20 6f 73 55 75 69 64 43 72 65 61 74 65 28 26    osUuidCreate(&
2dfe0 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  id);.    xorMemo
2dff0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2e000 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65   char*)&id, size
2e010 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6d  of(UUID));.    m
2e020 65 6d 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69  emset(&id, 0, si
2e030 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20  zeof(UUID));.   
2e040 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
2e050 75 65 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20  uential(&id);.  
2e060 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20    xorMemory(&e, 
2e070 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
2e080 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  &id, sizeof(UUID
2e090 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ));.  }.#endif /
2e0a0 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  * !SQLITE_OS_WIN
2e0b0 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
2e0c0 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45  _WINRT && SQLITE
2e0d0 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 20  _WIN32_USE_UUID 
2e0e0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 2e 6e 58  */.  return e.nX
2e0f0 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75 66 20 3a  or>nBuf ? nBuf :
2e100 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64 69 66 20   e.nXor;.#endif 
2e110 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
2e120 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
2e130 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2e140 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 7d 0a  ANDOMNESS) */.}.
2e150 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
2e160 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
2e170 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
2e180 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
2e190 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
2e1a0 74 20 77 69 6e 53 6c 65 65 70 28 73 71 6c 69 74  t winSleep(sqlit
2e1b0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2e1c0 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a 20 20 73  t microsec){.  s
2e1d0 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
2e1e0 65 70 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  ep((microsec+999
2e1f0 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e 55 53 45  )/1000);.  UNUSE
2e200 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2e210 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6d 69  );.  return ((mi
2e220 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
2e230 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )*1000;.}../*.**
2e240 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2e250 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
2e260 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
2e270 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
2e280 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
2e290 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
2e2a0 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
2e2b0 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
2e2c0 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
2e2d0 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
2e2e0 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
2e2f0 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
2e300 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
2e310 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
2e320 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
2e330 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
2e340 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
2e350 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
2e360 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2e370 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
2e380 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
2e390 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
2e3a0 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
2e3b0 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
2e3c0 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
2e3d0 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
2e3e0 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
2e3f0 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
2e400 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
2e410 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
2e420 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
2e430 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
2e440 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
2e450 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
2e460 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
2e470 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
2e480 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
2e490 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
2e4a0 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
2e4b0 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
2e4c0 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
2e4d0 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
2e4e0 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
2e4f0 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 0a  e time and date.
2e500 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  ** cannot be fou
2e510 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
2e520 74 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65  t winCurrentTime
2e530 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66  Int64(sqlite3_vf
2e540 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33  s *pVfs, sqlite3
2e550 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
2e560 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74    /* FILETIME st
2e570 72 75 63 74 75 72 65 20 69 73 20 61 20 36 34 2d  ructure is a 64-
2e580 62 69 74 20 76 61 6c 75 65 20 72 65 70 72 65 73  bit value repres
2e590 65 6e 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  enting the numbe
2e5a0 72 20 6f 66 0a 20 20 20 20 20 31 30 30 2d 6e 61  r of.     100-na
2e5b0 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61  nosecond interva
2e5c0 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79  ls since January
2e5d0 20 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32   1, 1601 (= JD 2
2e5e0 33 30 35 38 31 33 2e 35 29 2e 0a 20 20 2a 2f 0a  305813.5)..  */.
2e5f0 20 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20    FILETIME ft;. 
2e600 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
2e610 6c 69 74 65 33 5f 69 6e 74 36 34 20 77 69 6e 46  lite3_int64 winF
2e620 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 3d 20 32  iletimeEpoch = 2
2e630 33 30 35 38 31 33 35 2a 28 73 71 6c 69 74 65 33  3058135*(sqlite3
2e640 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2e650 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e660 53 54 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ST.  static cons
2e670 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2e680 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30  unixEpoch = 2440
2e690 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e  5875*(sqlite3_in
2e6a0 74 36 34 29 38 36 34 30 30 30 30 3b 0a 23 65 6e  t64)8640000;.#en
2e6b0 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32 20 2d 20  dif.  /* 2^32 - 
2e6c0 74 6f 20 61 76 6f 69 64 20 75 73 65 20 6f 66 20  to avoid use of 
2e6d0 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e 67 73 20  LL and warnings 
2e6e0 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73 74 61 74  in gcc */.  stat
2e6f0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2e700 5f 69 6e 74 36 34 20 6d 61 78 33 32 42 69 74 56  _int64 max32BitV
2e710 61 6c 75 65 20 3d 0a 20 20 20 20 20 20 28 73 71  alue =.      (sq
2e720 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30  lite3_int64)2000
2e730 30 30 30 30 30 30 20 2b 20 28 73 71 6c 69 74 65  000000 + (sqlite
2e740 33 5f 69 6e 74 36 34 29 32 30 30 30 30 30 30 30  3_int64)20000000
2e750 30 30 20 2b 0a 20 20 20 20 20 20 28 73 71 6c 69  00 +.      (sqli
2e760 74 65 33 5f 69 6e 74 36 34 29 32 39 34 39 36 37  te3_int64)294967
2e770 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  296;..#if SQLITE
2e780 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54  _OS_WINCE.  SYST
2e790 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 6f  EMTIME time;.  o
2e7a0 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2e7b0 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69 66 20 53  time);.  /* if S
2e7c0 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
2e7d0 69 6d 65 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ime() fails, it 
2e7e0 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20 2a 2f  returns zero. */
2e7f0 0a 20 20 69 66 20 28 21 6f 73 53 79 73 74 65 6d  .  if (!osSystem
2e800 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 26  TimeToFileTime(&
2e810 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20 20 20 20  time,&ft)){.    
2e820 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2e830 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  ROR;.  }.#else. 
2e840 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65   osGetSystemTime
2e850 41 73 46 69 6c 65 54 69 6d 65 28 20 26 66 74 20  AsFileTime( &ft 
2e860 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2a 70 69  );.#endif..  *pi
2e870 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65 74 69 6d  Now = winFiletim
2e880 65 45 70 6f 63 68 20 2b 0a 20 20 20 20 20 20 20  eEpoch +.       
2e890 20 20 20 20 20 28 28 28 28 73 71 6c 69 74 65 33       ((((sqlite3
2e8a0 5f 69 6e 74 36 34 29 66 74 2e 64 77 48 69 67 68  _int64)ft.dwHigh
2e8b0 44 61 74 65 54 69 6d 65 29 2a 6d 61 78 33 32 42  DateTime)*max32B
2e8c0 69 74 56 61 6c 75 65 29 20 2b 0a 20 20 20 20 20  itValue) +.     
2e8d0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
2e8e0 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 4c 6f  e3_int64)ft.dwLo
2e8f0 77 44 61 74 65 54 69 6d 65 29 2f 28 73 71 6c 69  wDateTime)/(sqli
2e900 74 65 33 5f 69 6e 74 36 34 29 31 30 30 30 30 3b  te3_int64)10000;
2e910 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e920 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69 74  TEST.  if( sqlit
2e930 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
2e940 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20  ){.    *piNow = 
2e950 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e  1000*(sqlite3_in
2e960 74 36 34 29 73 71 6c 69 74 65 33 5f 63 75 72 72  t64)sqlite3_curr
2e970 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45  ent_time + unixE
2e980 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  poch;.  }.#endif
2e990 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2e9a0 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74  TER(pVfs);.  ret
2e9b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e9c0 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
2e9d0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
2e9e0 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
2e9f0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
2ea00 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72  Write the.** cur
2ea10 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61  rent time and da
2ea20 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  te as a Julian D
2ea30 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a  ay number into *
2ea40 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74  prNow and.** ret
2ea50 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31  urn 0.  Return 1
2ea60 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2ea70 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   date cannot be 
2ea80 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2ea90 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2eaa0 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
2eab0 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
2eac0 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rNow){.  int rc;
2ead0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
2eae0 20 69 3b 0a 20 20 72 63 20 3d 20 77 69 6e 43 75   i;.  rc = winCu
2eaf0 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70  rrentTimeInt64(p
2eb00 56 66 73 2c 20 26 69 29 3b 0a 20 20 69 66 28 20  Vfs, &i);.  if( 
2eb10 21 72 63 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f  !rc ){.    *prNo
2eb20 77 20 3d 20 69 2f 38 36 34 30 30 30 30 30 2e 30  w = i/86400000.0
2eb30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2eb40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
2eb50 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68 69  idea is that thi
2eb60 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73  s function works
2eb70 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69 6e 61 74   like a combinat
2eb80 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74 4c 61 73  ion of.** GetLas
2eb90 74 45 72 72 6f 72 28 29 20 61 6e 64 20 46 6f 72  tError() and For
2eba0 6d 61 74 4d 65 73 73 61 67 65 28 29 20 6f 6e 20  matMessage() on 
2ebb0 57 69 6e 64 6f 77 73 20 28 6f 72 20 65 72 72 6e  Windows (or errn
2ebc0 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65 72 72 6f  o and.** strerro
2ebd0 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78 29 2e 20  r_r() on Unix). 
2ebe0 41 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 69  After an error i
2ebf0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e  s returned by an
2ec00 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c   OS.** function,
2ec10 20 53 51 4c 69 74 65 20 63 61 6c 6c 73 20 74 68   SQLite calls th
2ec20 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  is function with
2ec30 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e 67 20 74   zBuf pointing t
2ec40 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 66  o.** a buffer of
2ec50 20 6e 42 75 66 20 62 79 74 65 73 2e 20 54 68 65   nBuf bytes. The
2ec60 20 4f 53 20 6c 61 79 65 72 20 73 68 6f 75 6c 64   OS layer should
2ec70 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 2a 2a   populate the.**
2ec80 20 62 75 66 66 65 72 20 77 69 74 68 20 61 20 6e   buffer with a n
2ec90 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55 54  ul-terminated UT
2eca0 46 2d 38 20 65 6e 63 6f 64 65 64 20 65 72 72 6f  F-8 encoded erro
2ecb0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 64 65 73  r message.** des
2ecc0 63 72 69 62 69 6e 67 20 74 68 65 20 6c 61 73 74  cribing the last
2ecd0 20 49 4f 20 65 72 72 6f 72 20 74 6f 20 68 61 76   IO error to hav
2ece0 65 20 6f 63 63 75 72 72 65 64 20 77 69 74 68 69  e occurred withi
2ecf0 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a  n the calling.**
2ed00 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49   thread..**.** I
2ed10 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
2ed20 61 67 65 20 69 73 20 74 6f 6f 20 6c 61 72 67 65  age is too large
2ed30 20 66 6f 72 20 74 68 65 20 73 75 70 70 6c 69 65   for the supplie
2ed40 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20 69 74 20  d buffer,.** it 
2ed50 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
2ed60 74 65 64 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ted. The return 
2ed70 76 61 6c 75 65 20 6f 66 20 78 47 65 74 4c 61 73  value of xGetLas
2ed80 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20 7a 65 72  tError.** is zer
2ed90 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 6d  o if the error m
2eda0 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20 74  essage fits in t
2edb0 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e 6f  he buffer, or no
2edc0 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72 77  n-zero.** otherw
2edd0 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73 73  ise (if the mess
2ede0 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74 65  age was truncate
2edf0 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20  d). If non-zero 
2ee00 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20  is returned,.** 
2ee10 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74 20 6e  then it is not n
2ee20 65 63 65 73 73 61 72 79 20 74 6f 20 69 6e 63 6c  ecessary to incl
2ee30 75 64 65 20 74 68 65 20 6e 75 6c 2d 74 65 72 6d  ude the nul-term
2ee40 69 6e 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  inator character
2ee50 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75 74 70 75  .** in the outpu
2ee60 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  t buffer..**.** 
2ee70 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67 20 61 6e  Not supplying an
2ee80 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77   error message w
2ee90 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61 64 76 65  ill have no adve
2eea0 72 73 65 20 65 66 66 65 63 74 0a 2a 2a 20 6f 6e  rse effect.** on
2eeb0 20 53 51 4c 69 74 65 2e 20 49 74 20 69 73 20 66   SQLite. It is f
2eec0 69 6e 65 20 74 6f 20 68 61 76 65 20 61 6e 20 69  ine to have an i
2eed0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
2eee0 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72 65 74 75  at never.** retu
2eef0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  rns an error mes
2ef00 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 6e  sage:.**.**   in
2ef10 74 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  t xGetLastError(
2ef20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ef30 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  s, int nBuf, cha
2ef40 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20 20 20 20  r *zBuf){.**    
2ef50 20 61 73 73 65 72 74 28 7a 42 75 66 5b 30 5d 3d   assert(zBuf[0]=
2ef60 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20 20 20 72  ='\0');.**     r
2ef70 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20 20 7d 0a  eturn 0;.**   }.
2ef80 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72 20 69 66  **.** However if
2ef90 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2efa0 65 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 69  e is supplied, i
2efb0 74 20 77 69 6c 6c 20 62 65 20 69 6e 63 6f 72 70  t will be incorp
2efc0 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  orated.** by sql
2efd0 69 74 65 20 69 6e 74 6f 20 74 68 65 20 65 72 72  ite into the err
2efe0 6f 72 20 6d 65 73 73 61 67 65 20 61 76 61 69 6c  or message avail
2eff0 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73 65 72  able to the user
2f000 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
2f010 33 5f 65 72 72 6d 73 67 28 29 2c 20 70 6f 73 73  3_errmsg(), poss
2f020 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49 4f 20 65  ibly making IO e
2f030 72 72 6f 72 73 20 65 61 73 69 65 72 20 74 6f 20  rrors easier to 
2f040 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  debug..*/.static
2f050 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45   int winGetLastE
2f060 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
2f070 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66   *pVfs, int nBuf
2f080 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
2f090 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
2f0a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 55  LastError();.  U
2f0b0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2f0c0 70 56 66 73 29 3b 0a 20 20 69 66 28 20 6e 42 75  pVfs);.  if( nBu
2f0d0 66 3e 30 20 29 20 77 69 6e 47 65 74 4c 61 73 74  f>0 ) winGetLast
2f0e0 45 72 72 6f 72 4d 73 67 28 65 2c 20 6e 42 75 66  ErrorMsg(e, nBuf
2f0f0 2c 20 7a 42 75 66 29 3b 0a 20 20 72 65 74 75 72  , zBuf);.  retur
2f100 6e 20 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  n e;.}../*.** In
2f110 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64 65 69  itialize and dei
2f120 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 70  nitialize the op
2f130 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
2f140 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69 6e 74  nterface..*/.int
2f150 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74   sqlite3_os_init
2f160 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
2f170 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e   sqlite3_vfs win
2f180 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20  Vfs = {.    3,  
2f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f1a0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2f1b0 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2f1c0 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a 20  File),       /* 
2f1d0 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20  szOsFile */.    
2f1e0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
2f1f0 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20  _PATH_BYTES, /* 
2f200 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  mxPathname */.  
2f210 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2f220 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2f230 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2f240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f250 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2f260 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20 20  &winAppData,    
2f270 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2f280 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2f290 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2f2a0 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20   /* xOpen */.   
2f2b0 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20   winDelete,     
2f2c0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
2f2d0 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63  te */.    winAcc
2f2e0 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
2f2f0 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20   /* xAccess */. 
2f300 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61     winFullPathna
2f310 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46 75  me,       /* xFu
2f320 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2f330 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2f340 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f           /* xDlO
2f350 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  pen */.    winDl
2f360 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
2f370 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2f380 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2f390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f3a0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2f3b0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2f3c0 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2f3d0 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2f3e0 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a  ness,         /*
2f3f0 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a   xRandomness */.
2f400 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20      winSleep,   
2f410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2f420 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43  leep */.    winC
2f430 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
2f440 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69     /* xCurrentTi
2f450 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74  me */.    winGet
2f460 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 20  LastError,      
2f470 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2f480 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2f490 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20  entTimeInt64,   
2f4a0 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49  /* xCurrentTimeI
2f4b0 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53  nt64 */.    winS
2f4c0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2f4d0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2f4e0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2f4f0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2f500 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2f510 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2f520 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2f530 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2f540 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2f550 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f560 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2f570 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2f580 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2f590 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5b0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
2f5c0 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69  */.    sizeof(wi
2f5d0 6e 46 69 6c 65 29 2c 20 20 20 20 20 20 20 2f 2a  nFile),       /*
2f5e0 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20   szOsFile */.   
2f5f0 20 53 51 4c 49 54 45 5f 57 49 4e 4e 54 5f 4d 41   SQLITE_WINNT_MA
2f600 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a  X_PATH_BYTES, /*
2f610 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
2f620 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20     0,           
2f630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
2f640 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32  xt */.    "win32
2f650 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20 20 20  -longpath",     
2f660 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2f670 20 26 77 69 6e 41 70 70 44 61 74 61 2c 20 20 20   &winAppData,   
2f680 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44          /* pAppD
2f690 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70  ata */.    winOp
2f6a0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
2f6b0 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2f6c0 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2f6d0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2f6e0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2f6f0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2f700 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2f710 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2f720 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a 20 78 46  ame,       /* xF
2f730 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20  ullPathname */. 
2f740 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20     winDlOpen,   
2f750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2f760 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2f770 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20  lError,         
2f780 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a     /* xDlError *
2f790 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20  /.    winDlSym, 
2f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f7b0 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2f7c0 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2f7d0 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65       /* xDlClose
2f7e0 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f   */.    winRando
2f7f0 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f  mness,         /
2f800 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2f810 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2f820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2f830 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2f840 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2f850 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2f860 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2f870 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2f880 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72    /* xGetLastErr
2f890 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72  or */.    winCur
2f8a0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20  rentTimeInt64,  
2f8b0 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
2f8c0 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e  Int64 */.    win
2f8d0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  SetSystemCall,  
2f8e0 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65      /* xSetSyste
2f8f0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2f900 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  GetSystemCall,  
2f910 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2f920 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2f930 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2f940 20 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74      /* xNextSyst
2f950 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23  emCall */.  };.#
2f960 65 6e 64 69 66 0a 20 20 73 74 61 74 69 63 20 73  endif.  static s
2f970 71 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4e 6f  qlite3_vfs winNo
2f980 6c 6f 63 6b 56 66 73 20 3d 20 7b 0a 20 20 20 20  lockVfs = {.    
2f990 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3,              
2f9a0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2f9b0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2f9c0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 20  (winFile),      
2f9d0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2f9e0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2f9f0 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2fa00 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2fa10 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fa30 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2fa40 6e 33 32 2d 6e 6f 6e 65 22 2c 20 20 20 20 20 20  n32-none",      
2fa50 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a      /* zName */.
2fa60 20 20 20 20 26 77 69 6e 4e 6f 6c 6f 63 6b 41 70      &winNolockAp
2fa70 70 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 70 41  pData,     /* pA
2fa80 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69  ppData */.    wi
2fa90 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  nOpen,          
2faa0 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
2fab0 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20  .    winDelete, 
2fac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fad0 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2fae0 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2faf0 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20       /* xAccess 
2fb00 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61  */.    winFullPa
2fb10 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 2f 2a  thname,       /*
2fb20 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2fb30 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fb50 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2fb60 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2fb70 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2fb80 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2fb90 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
2fba0 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20  /* xDlSym */.   
2fbb0 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20   winDlClose,    
2fbc0 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c          /* xDlCl
2fbd0 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61  ose */.    winRa
2fbe0 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
2fbf0 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
2fc00 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70   */.    winSleep
2fc10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2fc20 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2fc30 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2fc40 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65         /* xCurre
2fc50 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69  ntTime */.    wi
2fc60 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20  nGetLastError,  
2fc70 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2fc80 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2fc90 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2fca0 2c 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  ,   /* xCurrentT
2fcb0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2fcc0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2fcd0 2c 20 20 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ,      /* xSetSy
2fce0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2fcf0 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2fd00 2c 20 20 20 20 20 20 2f 2a 20 78 47 65 74 53 79  ,      /* xGetSy
2fd10 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2fd20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  winNextSystemCal
2fd30 6c 2c 20 20 20 20 20 2f 2a 20 78 4e 65 78 74 53  l,     /* xNextS
2fd40 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d  ystemCall */.  }
2fd50 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
2fd60 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
2fd70 49 44 45 29 0a 20 20 73 74 61 74 69 63 20 73 71  IDE).  static sq
2fd80 6c 69 74 65 33 5f 76 66 73 20 77 69 6e 4c 6f 6e  lite3_vfs winLon
2fd90 67 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 20 3d  gPathNolockVfs =
2fda0 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20   {.    3,       
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fdc0 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2fdd0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2fde0 2c 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  ,       /* szOsF
2fdf0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2fe00 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
2fe10 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2fe20 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe40 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2fe50 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
2fe60 61 74 68 2d 6e 6f 6e 65 22 2c 20 2f 2a 20 7a 4e  ath-none", /* zN
2fe70 61 6d 65 20 2a 2f 0a 20 20 20 20 26 77 69 6e 4e  ame */.    &winN
2fe80 6f 6c 6f 63 6b 41 70 70 44 61 74 61 2c 20 20 20  olockAppData,   
2fe90 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
2fea0 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20  .    winOpen,   
2feb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2fec0 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44  Open */.    winD
2fed0 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20  elete,          
2fee0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
2fef0 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
2ff00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ff10 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  Access */.    wi
2ff20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  nFullPathname,  
2ff30 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2ff40 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2ff50 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2ff60 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2ff70 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2ff80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2ff90 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2ffa0 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2ffb0 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d         /* xDlSym
2ffc0 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f   */.    winDlClo
2ffd0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  se,            /
2ffe0 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
2fff0 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c    winRandomness,
30000 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
30010 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77  domness */.    w
30020 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20  inSleep,        
30030 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
30040 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
30050 74 54 69 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  tTime,        /*
30060 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f   xCurrentTime */
30070 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45  .    winGetLastE
30080 72 72 6f 72 2c 20 20 20 20 20 20 20 2f 2a 20 78  rror,       /* x
30090 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
300a0 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
300b0 6d 65 49 6e 74 36 34 2c 20 20 20 2f 2a 20 78 43  meInt64,   /* xC
300c0 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
300d0 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
300e0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
300f0 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
30100 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
30110 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 20 2f 2a  temCall,      /*
30120 20 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xGetSystemCall 
30130 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79  */.    winNextSy
30140 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 20 2f 2a  stemCall,     /*
30150 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c   xNextSystemCall
30160 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e 64 69 66 0a   */.  };.#endif.
30170 0a 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 63 68 65  .  /* Double-che
30180 63 6b 20 74 68 61 74 20 74 68 65 20 61 53 79 73  ck that the aSys
30190 63 61 6c 6c 5b 5d 20 61 72 72 61 79 20 68 61 73  call[] array has
301a0 20 62 65 65 6e 20 63 6f 6e 73 74 72 75 63 74 65   been constructe
301b0 64 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79  d.  ** correctly
301c0 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 5b 62  .  See ticket [b
301d0 62 33 61 38 36 65 38 39 30 63 38 65 39 36 61 62  b3a86e890c8e96ab
301e0 5d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 41  ] */.  assert( A
301f0 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c  rraySize(aSyscal
30200 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20 20 2f 2a 20  l)==80 );..  /* 
30210 67 65 74 20 6d 65 6d 6f 72 79 20 6d 61 70 20 61  get memory map a
30220 6c 6c 6f 63 61 74 69 6f 6e 20 67 72 61 6e 75 6c  llocation granul
30230 61 72 69 74 79 20 2a 2f 0a 20 20 6d 65 6d 73 65  arity */.  memse
30240 74 28 26 77 69 6e 53 79 73 49 6e 66 6f 2c 20 30  t(&winSysInfo, 0
30250 2c 20 73 69 7a 65 6f 66 28 53 59 53 54 45 4d 5f  , sizeof(SYSTEM_
30260 49 4e 46 4f 29 29 3b 0a 23 69 66 20 53 51 4c 49  INFO));.#if SQLI
30270 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 6f 73  TE_OS_WINRT.  os
30280 47 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49  GetNativeSystemI
30290 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
302a0 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  ;.#else.  osGetS
302b0 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79  ystemInfo(&winSy
302c0 73 49 6e 66 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  sInfo);.#endif. 
302d0 20 61 73 73 65 72 74 28 20 77 69 6e 53 79 73 49   assert( winSysI
302e0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
302f0 47 72 61 6e 75 6c 61 72 69 74 79 3e 30 20 29 3b  Granularity>0 );
30300 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 79  .  assert( winSy
30310 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69 7a 65  sInfo.dwPageSize
30320 3e 30 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >0 );..  sqlite3
30330 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
30340 69 6e 56 66 73 2c 20 31 29 3b 0a 0a 23 69 66 20  inVfs, 1);..#if 
30350 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
30360 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
30370 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
30380 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67 50 61  ister(&winLongPa
30390 74 68 56 66 73 2c 20 30 29 3b 0a 23 65 6e 64 69  thVfs, 0);.#endi
303a0 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  f..  sqlite3_vfs
303b0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4e 6f  _register(&winNo
303c0 6c 6f 63 6b 56 66 73 2c 20 30 29 3b 0a 0a 23 69  lockVfs, 0);..#i
303d0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
303e0 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
303f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
30400 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f 6e 67  egister(&winLong
30410 50 61 74 68 4e 6f 6c 6f 63 6b 56 66 73 2c 20 30  PathNolockVfs, 0
30420 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  );.#endif..#ifnd
30430 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
30440 41 4c 0a 20 20 77 69 6e 42 69 67 4c 6f 63 6b 20  AL.  winBigLock 
30450 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
30460 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
30470 5f 53 54 41 54 49 43 5f 56 46 53 31 29 3b 0a 23  _STATIC_VFS1);.#
30480 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
30490 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
304a0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
304b0 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49  (void){.#if SQLI
304c0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
304d0 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
304e0 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
304f0 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b  andle(sleepObj);
30500 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
30510 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  NULL;.  }.#endif
30520 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
30530 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 77 69 6e 42  _OMIT_WAL.  winB
30540 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a 23 65 6e 64  igLock = 0;.#end
30550 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
30560 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
30570 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
30580 49 4e 20 2a 2f 0a                                IN */.