/ Hex Artifact Content
Login

Artifact 1a781c2362ce07bcb6b3cd4b0c51c833eff70189:


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 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
23f0: 20 66 6f 72 20 77 69 6e 46 69 6c 65 2e 63 74 72   for winFile.ctr
2400: 6c 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  lFlags.*/.#defin
2410: 65 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  e WINFILE_RDONLY
2420: 20 20 20 20 20 20 20 20 20 20 30 78 30 32 20 20            0x02  
2430: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
2440: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
2450: 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f 50  define WINFILE_P
2460: 45 52 53 49 53 54 5f 57 41 4c 20 20 20 20 20 30  ERSIST_WAL     0
2470: 78 30 34 20 20 20 2f 2a 20 50 65 72 73 69 73 74  x04   /* Persist
2480: 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  ent WAL mode */.
2490: 23 64 65 66 69 6e 65 20 57 49 4e 46 49 4c 45 5f  #define WINFILE_
24a0: 50 53 4f 57 20 20 20 20 20 20 20 20 20 20 20 20  PSOW            
24b0: 30 78 31 30 20 20 20 2f 2a 20 53 51 4c 49 54 45  0x10   /* SQLITE
24c0: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
24d0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 0a 2f  _OVERWRITE */../
24e0: 2a 0a 20 2a 20 54 68 65 20 73 69 7a 65 20 6f 66  *. * The size of
24f0: 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65 64   the buffer used
2500: 20 62 79 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   by sqlite3_win3
2510: 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 29 2e  2_write_debug().
2520: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2530: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
2540: 46 5f 53 49 5a 45 0a 23 20 20 64 65 66 69 6e 65  F_SIZE.#  define
2550: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
2560: 47 5f 42 55 46 5f 53 49 5a 45 20 20 20 28 28 69  G_BUF_SIZE   ((i
2570: 6e 74 29 28 34 30 39 36 2d 73 69 7a 65 6f 66 28  nt)(4096-sizeof(
2580: 44 57 4f 52 44 29 29 29 0a 23 65 6e 64 69 66 0a  DWORD))).#endif.
2590: 0a 2f 2a 0a 20 2a 20 54 68 65 20 76 61 6c 75 65  ./*. * The value
25a0: 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
25b0: 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72  e3_win32_set_dir
25c0: 65 63 74 6f 72 79 28 29 20 74 6f 20 73 70 65 63  ectory() to spec
25d0: 69 66 79 20 74 68 61 74 0a 20 2a 20 74 68 65 20  ify that. * the 
25e0: 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 73  data directory s
25f0: 68 6f 75 6c 64 20 62 65 20 63 68 61 6e 67 65 64  hould be changed
2600: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2610: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f  LITE_WIN32_DATA_
2620: 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 23  DIRECTORY_TYPE.#
2630: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
2640: 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43  WIN32_DATA_DIREC
2650: 54 4f 52 59 5f 54 59 50 45 20 28 31 29 0a 23 65  TORY_TYPE (1).#e
2660: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2670: 76 61 6c 75 65 20 75 73 65 64 20 77 69 74 68 20  value used with 
2680: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65  sqlite3_win32_se
2690: 74 5f 64 69 72 65 63 74 6f 72 79 28 29 20 74 6f  t_directory() to
26a0: 20 73 70 65 63 69 66 79 20 74 68 61 74 0a 20 2a   specify that. *
26b0: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 64   the temporary d
26c0: 69 72 65 63 74 6f 72 79 20 73 68 6f 75 6c 64 20  irectory should 
26d0: 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 2a 2f 0a  be changed.. */.
26e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57  #ifndef SQLITE_W
26f0: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
2700: 4f 52 59 5f 54 59 50 45 0a 23 20 20 64 65 66 69  ORY_TYPE.#  defi
2710: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2720: 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59 5f 54  TEMP_DIRECTORY_T
2730: 59 50 45 20 28 32 29 0a 23 65 6e 64 69 66 0a 0a  YPE (2).#endif..
2740: 2f 2a 0a 20 2a 20 49 66 20 63 6f 6d 70 69 6c 65  /*. * If compile
2750: 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 57 49  d with SQLITE_WI
2760: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 6f 6e 20 57 69  N32_MALLOC on Wi
2770: 6e 64 6f 77 73 2c 20 77 65 20 77 69 6c 6c 20 75  ndows, we will u
2780: 73 65 20 74 68 65 0a 20 2a 20 76 61 72 69 6f 75  se the. * variou
2790: 73 20 57 69 6e 33 32 20 41 50 49 20 68 65 61 70  s Win32 API heap
27a0: 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 73 74 65   functions inste
27b0: 61 64 20 6f 66 20 6f 75 72 20 6f 77 6e 2e 0a 20  ad of our own.. 
27c0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
27d0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a 0a 2f  _WIN32_MALLOC../
27e0: 2a 0a 20 2a 20 49 66 20 74 68 69 73 20 69 73 20  *. * If this is 
27f0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 6e 20 69 73 6f  non-zero, an iso
2800: 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c 6c 20  lated heap will 
2810: 62 65 20 63 72 65 61 74 65 64 20 62 79 20 74 68  be created by th
2820: 65 20 6e 61 74 69 76 65 20 57 69 6e 33 32 0a 20  e native Win32. 
2830: 2a 20 61 6c 6c 6f 63 61 74 6f 72 20 73 75 62 73  * allocator subs
2840: 79 73 74 65 6d 3b 20 6f 74 68 65 72 77 69 73 65  ystem; otherwise
2850: 2c 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 72  , the default pr
2860: 6f 63 65 73 73 20 68 65 61 70 20 77 69 6c 6c 20  ocess heap will 
2870: 62 65 20 75 73 65 64 2e 20 20 54 68 69 73 0a 20  be used.  This. 
2880: 2a 20 73 65 74 74 69 6e 67 20 68 61 73 20 6e 6f  * setting has no
2890: 20 65 66 66 65 63 74 20 77 68 65 6e 20 63 6f 6d   effect when com
28a0: 70 69 6c 69 6e 67 20 66 6f 72 20 57 69 6e 52 54  piling for WinRT
28b0: 2e 20 20 42 79 20 64 65 66 61 75 6c 74 2c 20 74  .  By default, t
28c0: 68 69 73 20 69 73 20 65 6e 61 62 6c 65 64 0a 20  his is enabled. 
28d0: 2a 20 61 6e 64 20 61 6e 20 69 73 6f 6c 61 74 65  * and an isolate
28e0: 64 20 68 65 61 70 20 77 69 6c 6c 20 62 65 20 63  d heap will be c
28f0: 72 65 61 74 65 64 20 74 6f 20 73 74 6f 72 65 20  reated to store 
2900: 61 6c 6c 20 61 6c 6c 6f 63 61 74 65 64 20 64 61  all allocated da
2910: 74 61 2e 0a 20 2a 0a 20 2a 2a 2a 2a 2a 2a 2a 2a  ta.. *. ********
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2960: 2a 2a 2a 2a 2a 2a 0a 20 2a 20 57 41 52 4e 49 4e  ******. * WARNIN
2970: 47 3a 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61  G: It is importa
2980: 6e 74 20 74 6f 20 6e 6f 74 65 20 74 68 61 74 20  nt to note that 
2990: 77 68 65 6e 20 74 68 69 73 20 73 65 74 74 69 6e  when this settin
29a0: 67 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e  g is non-zero an
29b0: 64 20 74 68 65 0a 20 2a 20 20 20 20 20 20 20 20  d the. *        
29c0: 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77 6e    winMemShutdown
29d0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
29e0: 6c 65 64 20 28 65 2e 67 2e 20 62 79 20 74 68 65  led (e.g. by the
29f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2a00: 6e 0a 20 2a 20 20 20 20 20 20 20 20 20 20 66 75  n. *          fu
2a10: 6e 63 74 69 6f 6e 29 2c 20 61 6c 6c 20 64 61 74  nction), all dat
2a20: 61 20 74 68 61 74 20 77 61 73 20 61 6c 6c 6f 63  a that was alloc
2a30: 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69  ated using the i
2a40: 73 6f 6c 61 74 65 64 20 68 65 61 70 20 77 69 6c  solated heap wil
2a50: 6c 0a 20 2a 20 20 20 20 20 20 20 20 20 20 62 65  l. *          be
2a60: 20 66 72 65 65 64 20 69 6d 6d 65 64 69 61 74 65   freed immediate
2a70: 6c 79 20 61 6e 64 20 61 6e 79 20 61 74 74 65 6d  ly and any attem
2a80: 70 74 20 74 6f 20 61 63 63 65 73 73 20 61 6e 79  pt to access any
2a90: 20 6f 66 20 74 68 61 74 20 66 72 65 65 64 0a 20   of that freed. 
2aa0: 2a 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20  *          data 
2ab0: 77 69 6c 6c 20 61 6c 6d 6f 73 74 20 63 65 72 74  will almost cert
2ac0: 61 69 6e 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ainly result in 
2ad0: 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 61 63 63  an immediate acc
2ae0: 65 73 73 20 76 69 6f 6c 61 74 69 6f 6e 2e 0a 20  ess violation.. 
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 2a 2a 2a 2a  ****************
2b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 20  **************. 
2b40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2b50: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45  E_WIN32_HEAP_CRE
2b60: 41 54 45 0a 23 20 20 64 65 66 69 6e 65 20 53 51  ATE.#  define SQ
2b70: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2b80: 43 52 45 41 54 45 20 20 20 20 28 54 52 55 45 29  CREATE    (TRUE)
2b90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2ba0: 68 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20  he initial size 
2bb0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
2bc0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
2bd0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2be0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2bf0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2c00: 41 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20  AP_INIT_SIZE.#  
2c10: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
2c20: 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49  N32_HEAP_INIT_SI
2c30: 5a 45 20 28 28 53 51 4c 49 54 45 5f 44 45 46 41  ZE ((SQLITE_DEFA
2c40: 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 20  ULT_CACHE_SIZE) 
2c50: 2a 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  * \.            
2c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c70: 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c 49             (SQLI
2c80: 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
2c90: 53 49 5a 45 29 20 2b 20 34 31 39 34 33 30 34 29  SIZE) + 4194304)
2ca0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54  .#endif../*. * T
2cb0: 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20  he maximum size 
2cc0: 6f 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  of the Win32-spe
2cd0: 63 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69  cific heap.  Thi
2ce0: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  s value may be z
2cf0: 65 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ero.. */.#ifndef
2d00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
2d10: 41 50 5f 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64  AP_MAX_SIZE.#  d
2d20: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2d30: 33 32 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45  32_HEAP_MAX_SIZE
2d40: 20 20 28 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a    (0).#endif../*
2d50: 0a 20 2a 20 54 68 65 20 65 78 74 72 61 20 66 6c  . * The extra fl
2d60: 61 67 73 20 74 6f 20 75 73 65 20 69 6e 20 63 61  ags to use in ca
2d70: 6c 6c 73 20 74 6f 20 74 68 65 20 57 69 6e 33 32  lls to the Win32
2d80: 20 68 65 61 70 20 41 50 49 73 2e 20 20 54 68 69   heap APIs.  Thi
2d90: 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 20  s value may be. 
2da0: 2a 20 7a 65 72 6f 20 66 6f 72 20 74 68 65 20 64  * zero for the d
2db0: 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72 2e  efault behavior.
2dc0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  . */.#ifndef SQL
2dd0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
2de0: 4c 41 47 53 0a 23 20 20 64 65 66 69 6e 65 20 53  LAGS.#  define S
2df0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
2e00: 5f 46 4c 41 47 53 20 20 20 20 20 28 30 29 0a 23  _FLAGS     (0).#
2e10: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
2e20: 65 20 77 69 6e 4d 65 6d 44 61 74 61 20 73 74 72  e winMemData str
2e30: 75 63 74 75 72 65 20 73 74 6f 72 65 73 20 69 6e  ucture stores in
2e40: 66 6f 72 6d 61 74 69 6f 6e 20 72 65 71 75 69 72  formation requir
2e50: 65 64 20 62 79 20 74 68 65 20 57 69 6e 33 32 2d  ed by the Win32-
2e60: 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69  specific.** sqli
2e70: 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20  te3_mem_methods 
2e80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a  implementation..
2e90: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
2ea0: 74 20 77 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e  t winMemData win
2eb0: 4d 65 6d 44 61 74 61 3b 0a 73 74 72 75 63 74 20  MemData;.struct 
2ec0: 77 69 6e 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66  winMemData {.#if
2ed0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33  ndef NDEBUG.  u3
2ee0: 32 20 6d 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d  2 magic1;   /* M
2ef0: 61 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64  agic number to d
2f00: 65 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20  etect structure 
2f10: 63 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23  corruption. */.#
2f20: 65 6e 64 69 66 0a 20 20 48 41 4e 44 4c 45 20 68  endif.  HANDLE h
2f30: 48 65 61 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e  Heap; /* The han
2f40: 64 6c 65 20 74 6f 20 6f 75 72 20 68 65 61 70 2e  dle to our heap.
2f50: 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65   */.  BOOL bOwne
2f60: 64 3b 20 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e  d;  /* Do we own
2f70: 20 74 68 65 20 68 65 61 70 20 28 69 2e 65 2e 20   the heap (i.e. 
2f80: 64 65 73 74 72 6f 79 20 69 74 20 6f 6e 20 73 68  destroy it on sh
2f90: 75 74 64 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e  utdown)? */.#ifn
2fa0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32  def NDEBUG.  u32
2fb0: 20 6d 61 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61   magic2;   /* Ma
2fc0: 67 69 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65  gic number to de
2fd0: 74 65 63 74 20 73 74 72 75 63 74 75 72 65 20 63  tect structure c
2fe0: 6f 72 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65  orruption. */.#e
2ff0: 6e 64 69 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66  ndif.};..#ifndef
3000: 20 4e 44 45 42 55 47 0a 23 64 65 66 69 6e 65 20   NDEBUG.#define 
3010: 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20  WINMEM_MAGIC1   
3020: 20 20 30 78 34 32 62 32 38 33 30 62 0a 23 64 65    0x42b2830b.#de
3030: 66 69 6e 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  fine WINMEM_MAGI
3040: 43 32 20 20 20 20 20 30 78 62 64 34 64 37 63 66  C2     0xbd4d7cf
3050: 34 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  4.#endif..static
3060: 20 73 74 72 75 63 74 20 77 69 6e 4d 65 6d 44 61   struct winMemDa
3070: 74 61 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20  ta win_mem_data 
3080: 3d 20 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  = {.#ifndef NDEB
3090: 55 47 0a 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49  UG.  WINMEM_MAGI
30a0: 43 31 2c 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c  C1,.#endif.  NUL
30b0: 4c 2c 20 46 41 4c 53 45 0a 23 69 66 6e 64 65 66  L, FALSE.#ifndef
30c0: 20 4e 44 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45   NDEBUG.  ,WINME
30d0: 4d 5f 4d 41 47 49 43 32 0a 23 65 6e 64 69 66 0a  M_MAGIC2.#endif.
30e0: 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  };..#ifndef NDEB
30f0: 55 47 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  UG.#define winMe
3100: 6d 41 73 73 65 72 74 4d 61 67 69 63 31 28 29 20  mAssertMagic1() 
3110: 61 73 73 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f  assert( win_mem_
3120: 64 61 74 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e  data.magic1==WIN
3130: 4d 45 4d 5f 4d 41 47 49 43 31 20 29 0a 23 64 65  MEM_MAGIC1 ).#de
3140: 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73 73 65 72  fine winMemAsser
3150: 74 4d 61 67 69 63 32 28 29 20 61 73 73 65 72 74  tMagic2() assert
3160: 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d  ( win_mem_data.m
3170: 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41  agic2==WINMEM_MA
3180: 47 49 43 32 20 29 0a 23 64 65 66 69 6e 65 20 77  GIC2 ).#define w
3190: 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63  inMemAssertMagic
31a0: 28 29 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74  ()  winMemAssert
31b0: 4d 61 67 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d  Magic1(); winMem
31c0: 41 73 73 65 72 74 4d 61 67 69 63 32 28 29 3b 0a  AssertMagic2();.
31d0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 77 69  #else.#define wi
31e0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
31f0: 29 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ).#endif..#defin
3200: 65 20 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  e winMemGetDataP
3210: 74 72 28 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64  tr()  &win_mem_d
3220: 61 74 61 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  ata.#define winM
3230: 65 6d 47 65 74 48 65 61 70 28 29 20 20 20 20 20  emGetHeap()     
3240: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65  win_mem_data.hHe
3250: 61 70 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  ap.#define winMe
3260: 6d 47 65 74 4f 77 6e 65 64 28 29 20 20 20 20 77  mGetOwned()    w
3270: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e  in_mem_data.bOwn
3280: 65 64 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ed..static void 
3290: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
32a0: 74 20 6e 42 79 74 65 73 29 3b 0a 73 74 61 74 69  t nBytes);.stati
32b0: 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65  c void winMemFre
32c0: 65 28 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b  e(void *pPrior);
32d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
32e0: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64  nMemRealloc(void
32f0: 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42   *pPrior, int nB
3300: 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 69 6e  ytes);.static in
3310: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
3320: 64 20 2a 70 29 3b 0a 73 74 61 74 69 63 20 69 6e  d *p);.static in
3330: 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28  t winMemRoundup(
3340: 69 6e 74 20 6e 29 3b 0a 73 74 61 74 69 63 20 69  int n);.static i
3350: 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f  nt winMemInit(vo
3360: 69 64 20 2a 70 41 70 70 44 61 74 61 29 3b 0a 73  id *pAppData);.s
3370: 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65  tatic void winMe
3380: 6d 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a  mShutdown(void *
3390: 70 41 70 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73  pAppData);..cons
33a0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
33b0: 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33 4d 65  thods *sqlite3Me
33c0: 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64 29 3b  mGetWin32(void);
33d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33e0: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a  E_WIN32_MALLOC *
33f0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
3400: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20  lowing variable 
3410: 69 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65  is (normally) se
3420: 74 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72  t once and never
3430: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72   changes.** ther
3440: 65 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f  eafter.  It reco
3450: 72 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20  rds whether the 
3460: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
3470: 20 69 73 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20   is Win9x.** or 
3480: 57 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20  WinNT..**.** 0: 
3490: 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74    Operating syst
34a0: 65 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31  em unknown..** 1
34b0: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
34c0: 73 74 65 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a  stem is Win9x..*
34d0: 2a 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67  * 2:   Operating
34e0: 20 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54   system is WinNT
34f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
3500: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74   to facilitate t
3510: 65 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e  esting on a WinN
3520: 54 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65  T system, the te
3530: 73 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61  st fixture.** ca
3540: 6e 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  n manually set t
3550: 68 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74  his value to 1 t
3560: 6f 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20  o emulate Win98 
3570: 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66  behavior..*/.#if
3580: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3590: 4c 4f 4e 47 20 53 51 4c 49 54 45 5f 57 49 4e 33  LONG SQLITE_WIN3
35a0: 32 5f 56 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74  2_VOLATILE sqlit
35b0: 65 33 5f 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a  e3_os_type = 0;.
35c0: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e  #else.static LON
35d0: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
35e0: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
35f0: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e  os_type = 0;.#en
3600: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 59 53  dif..#ifndef SYS
3610: 43 41 4c 4c 0a 23 20 20 64 65 66 69 6e 65 20 53  CALL.#  define S
3620: 59 53 43 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73  YSCALL sqlite3_s
3630: 79 73 63 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69  yscall_ptr.#endi
3640: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
3650: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76  nction is not av
3660: 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f  ailable on Windo
3670: 77 73 20 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a  ws CE or WinRT..
3680: 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   */..#if SQLITE_
3690: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49  OS_WINCE || SQLI
36a0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64  TE_OS_WINRT.#  d
36b0: 65 66 69 6e 65 20 6f 73 41 72 65 46 69 6c 65 41  efine osAreFileA
36c0: 70 69 73 41 4e 53 49 28 29 20 20 20 20 20 20 20  pisANSI()       
36d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
36e0: 4d 61 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  Many system call
36f0: 73 20 61 72 65 20 61 63 63 65 73 73 65 64 20 74  s are accessed t
3700: 68 72 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74  hrough pointer-t
3710: 6f 2d 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74  o-functions so t
3720: 68 61 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20  hat.** they may 
3730: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74  be overridden at
3740: 20 72 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69   runtime to faci
3750: 6c 69 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a  litate fault inj
3760: 65 63 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a  ection during.**
3770: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e   testing and san
3780: 64 62 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f  dboxing.  The fo
3790: 6c 6c 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f  llowing array ho
37a0: 6c 64 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e  lds the names an
37b0: 64 20 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f  d pointers.** to
37c0: 20 61 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c   all overrideabl
37d0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a  e system calls..
37e0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
37f0: 20 77 69 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20   win_syscall {. 
3800: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
3810: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  me;            /
3820: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  * Name of the sy
3830: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
3840: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3850: 74 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20  tr pCurrent; /* 
3860: 43 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  Current value of
3870: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
3880: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
3890: 73 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75  scall_ptr pDefau
38a0: 6c 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76  lt; /* Default v
38b0: 61 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61  alue */.} aSysca
38c0: 6c 6c 5b 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51  ll[] = {.#if !SQ
38d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
38e0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
38f0: 54 0a 20 20 7b 20 22 41 72 65 46 69 6c 65 41 70  T.  { "AreFileAp
3900: 69 73 41 4e 53 49 22 2c 20 20 20 20 20 20 20 20  isANSI",        
3910: 20 28 53 59 53 43 41 4c 4c 29 41 72 65 46 69 6c   (SYSCALL)AreFil
3920: 65 41 70 69 73 41 4e 53 49 2c 20 20 20 20 20 20  eApisANSI,      
3930: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3940: 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41 4e  { "AreFileApisAN
3950: 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  SI",         (SY
3960: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
3970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
3980: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e   },.#endif..#ifn
3990: 64 65 66 20 6f 73 41 72 65 46 69 6c 65 41 70 69  def osAreFileApi
39a0: 73 41 4e 53 49 0a 23 64 65 66 69 6e 65 20 6f 73  sANSI.#define os
39b0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 20  AreFileApisANSI 
39c0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
39d0: 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 30  VOID))aSyscall[0
39e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
39f0: 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  if..#if SQLITE_O
3a00: 53 5f 57 49 4e 43 45 20 26 26 20 64 65 66 69 6e  S_WINCE && defin
3a10: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
3a20: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43  HAS_WIDE).  { "C
3a30: 68 61 72 4c 6f 77 65 72 57 22 2c 20 20 20 20 20  harLowerW",     
3a40: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
3a50: 4c 29 43 68 61 72 4c 6f 77 65 72 57 2c 20 20 20  L)CharLowerW,   
3a60: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a70: 23 65 6c 73 65 0a 20 20 7b 20 22 43 68 61 72 4c  #else.  { "CharL
3a80: 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20 20  owerW",         
3a90: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
3aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ab0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
3ac0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 68  if..#define osCh
3ad0: 61 72 4c 6f 77 65 72 57 20 28 28 4c 50 57 53 54  arLowerW ((LPWST
3ae0: 52 28 57 49 4e 41 50 49 2a 29 28 4c 50 57 53 54  R(WINAPI*)(LPWST
3af0: 52 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  R))aSyscall[1].p
3b00: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
3b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
3b20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3b30: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
3b40: 20 20 7b 20 22 43 68 61 72 55 70 70 65 72 57 22    { "CharUpperW"
3b50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
3b60: 53 59 53 43 41 4c 4c 29 43 68 61 72 55 70 70 65  SYSCALL)CharUppe
3b70: 72 57 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rW,             
3b80: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
3b90: 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20 20  "CharUpperW",   
3ba0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3bb0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3bd0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
3be0: 65 20 6f 73 43 68 61 72 55 70 70 65 72 57 20 28  e osCharUpperW (
3bf0: 28 4c 50 57 53 54 52 28 57 49 4e 41 50 49 2a 29  (LPWSTR(WINAPI*)
3c00: 28 4c 50 57 53 54 52 29 29 61 53 79 73 63 61 6c  (LPWSTR))aSyscal
3c10: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
3c20: 20 20 7b 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65    { "CloseHandle
3c30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3c40: 53 59 53 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e  SYSCALL)CloseHan
3c50: 64 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  dle,            
3c60: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
3c70: 73 43 6c 6f 73 65 48 61 6e 64 6c 65 20 28 28 42  sCloseHandle ((B
3c80: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
3c90: 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d  DLE))aSyscall[3]
3ca0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
3cc0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20  IN32_HAS_ANSI). 
3cd0: 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 41 22   { "CreateFileA"
3ce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
3cf0: 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c  YSCALL)CreateFil
3d00: 65 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  eA,             
3d10: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3d20: 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20 20  CreateFileA",   
3d30: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
3d40: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3d50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3d60: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
3d70: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 20 28   osCreateFileA (
3d80: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
3d90: 28 4c 50 43 53 54 52 2c 44 57 4f 52 44 2c 44 57  (LPCSTR,DWORD,DW
3da0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
3db0: 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42  PSECURITY_ATTRIB
3dc0: 55 54 45 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44  UTES,DWORD,DWORD
3dd0: 2c 48 41 4e 44 4c 45 29 29 61 53 79 73 63 61 6c  ,HANDLE))aSyscal
3de0: 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[4].pCurrent)..
3df0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
3e00: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
3e10: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3e20: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65 61  _WIDE).  { "Crea
3e30: 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20  teFileW",       
3e40: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3e50: 72 65 61 74 65 46 69 6c 65 57 2c 20 20 20 20 20  reateFileW,     
3e60: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3e70: 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69  se.  { "CreateFi
3e80: 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  leW",           
3e90: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3eb0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3ec0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74  .#define osCreat
3ed0: 65 46 69 6c 65 57 20 28 28 48 41 4e 44 4c 45 28  eFileW ((HANDLE(
3ee0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
3ef0: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
3f00: 20 20 20 20 20 20 20 20 4c 50 53 45 43 55 52 49          LPSECURI
3f10: 54 59 5f 41 54 54 52 49 42 55 54 45 53 2c 44 57  TY_ATTRIBUTES,DW
3f20: 4f 52 44 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45  ORD,DWORD,HANDLE
3f30: 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43  ))aSyscall[5].pC
3f40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
3f50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
3f60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3f70: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20  WIN32_HAS_ANSI) 
3f80: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64  && \.        (!d
3f90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3fa0: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
3fb0: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
3fc0: 30 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20  0) && \.        
3fd0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45  SQLITE_WIN32_CRE
3fe0: 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a  ATEFILEMAPPINGA.
3ff0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d    { "CreateFileM
4000: 61 70 70 69 6e 67 41 22 2c 20 20 20 20 20 20 28  appingA",      (
4010: 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69  SYSCALL)CreateFi
4020: 6c 65 4d 61 70 70 69 6e 67 41 2c 20 20 20 20 20  leMappingA,     
4030: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4040: 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  "CreateFileMappi
4050: 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43  ngA",      (SYSC
4060: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4080: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4090: 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  e osCreateFileMa
40a0: 70 70 69 6e 67 41 20 28 28 48 41 4e 44 4c 45 28  ppingA ((HANDLE(
40b0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
40c0: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
40d0: 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20  BUTES, \.       
40e0: 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f   DWORD,DWORD,DWO
40f0: 52 44 2c 4c 50 43 53 54 52 29 29 61 53 79 73 63  RD,LPCSTR))aSysc
4100: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
4110: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
4120: 57 49 4e 43 45 20 7c 7c 20 28 21 53 51 4c 49 54  WINCE || (!SQLIT
4130: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
4140: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
4150: 33 32 5f 48 41 53 5f 57 49 44 45 29 20 26 26 20  32_HAS_WIDE) && 
4160: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
4170: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4180: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4190: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29  AX_MMAP_SIZE>0))
41a0: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
41b0: 4d 61 70 70 69 6e 67 57 22 2c 20 20 20 20 20 20  MappingW",      
41c0: 28 53 59 53 43 41 4c 4c 29 43 72 65 61 74 65 46  (SYSCALL)CreateF
41d0: 69 6c 65 4d 61 70 70 69 6e 67 57 2c 20 20 20 20  ileMappingW,    
41e0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
41f0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
4200: 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59 53  ingW",      (SYS
4210: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
4220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
4230: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
4240: 6e 65 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d  ne osCreateFileM
4250: 61 70 70 69 6e 67 57 20 28 28 48 41 4e 44 4c 45  appingW ((HANDLE
4260: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
4270: 2c 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  ,LPSECURITY_ATTR
4280: 49 42 55 54 45 53 2c 20 5c 0a 20 20 20 20 20 20  IBUTES, \.      
4290: 20 20 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57    DWORD,DWORD,DW
42a0: 4f 52 44 2c 4c 50 43 57 53 54 52 29 29 61 53 79  ORD,LPCWSTR))aSy
42b0: 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e  scall[7].pCurren
42c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
42d0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69  OS_WINRT && defi
42e0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
42f0: 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22  _HAS_WIDE).  { "
4300: 43 72 65 61 74 65 4d 75 74 65 78 57 22 2c 20 20  CreateMutexW",  
4310: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
4320: 4c 4c 29 43 72 65 61 74 65 4d 75 74 65 78 57 2c  LL)CreateMutexW,
4330: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4340: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61  .#else.  { "Crea
4350: 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20 20  teMutexW",      
4360: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
4370: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4380: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4390: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43  dif..#define osC
43a0: 72 65 61 74 65 4d 75 74 65 78 57 20 28 28 48 41  reateMutexW ((HA
43b0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
43c0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
43d0: 54 45 53 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20  TES,BOOL, \.    
43e0: 20 20 20 20 4c 50 43 57 53 54 52 29 29 61 53 79      LPCWSTR))aSy
43f0: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
4400: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
4420: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 44 65 6c 65  _ANSI).  { "Dele
4430: 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20 20  teFileA",       
4440: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44        (SYSCALL)D
4450: 65 6c 65 74 65 46 69 6c 65 41 2c 20 20 20 20 20  eleteFileA,     
4460: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4470: 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69  se.  { "DeleteFi
4480: 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20 20  leA",           
4490: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
44a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
44c0: 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74  .#define osDelet
44d0: 65 46 69 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49  eFileA ((BOOL(WI
44e0: 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61  NAPI*)(LPCSTR))a
44f0: 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72  Syscall[9].pCurr
4500: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4510: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4520: 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 44 65  AS_WIDE).  { "De
4530: 6c 65 74 65 46 69 6c 65 57 22 2c 20 20 20 20 20  leteFileW",     
4540: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4550: 29 44 65 6c 65 74 65 46 69 6c 65 57 2c 20 20 20  )DeleteFileW,   
4560: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4570: 65 6c 73 65 0a 20 20 7b 20 22 44 65 6c 65 74 65  else.  { "Delete
4580: 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20  FileW",         
4590: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
45b0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
45c0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 44 65 6c  f..#define osDel
45d0: 65 74 65 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28  eteFileW ((BOOL(
45e0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
45f0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
4600: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
4610: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
4620: 7b 20 22 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  { "FileTimeToLoc
4630: 61 6c 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  alFileTime", (SY
4640: 53 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f  SCALL)FileTimeTo
4650: 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30  LocalFileTime, 0
4660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46   },.#else.  { "F
4670: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4680: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
4690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
46a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
46b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
46c0: 6f 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61  osFileTimeToLoca
46d0: 6c 46 69 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c  lFileTime ((BOOL
46e0: 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20  (WINAPI*)(CONST 
46f0: 46 49 4c 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20  FILETIME*, \.   
4700: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
4710: 29 61 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43  )aSyscall[11].pC
4720: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
4730: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
4740: 20 22 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74   "FileTimeToSyst
4750: 65 6d 54 69 6d 65 22 2c 20 20 20 20 28 53 59 53  emTime",    (SYS
4760: 43 41 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53  CALL)FileTimeToS
4770: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 30 20  ystemTime,    0 
4780: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69  },.#else.  { "Fi
4790: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
47a0: 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  me",    (SYSCALL
47b0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
47c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
47d0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
47e0: 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65  sFileTimeToSyste
47f0: 6d 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e  mTime ((BOOL(WIN
4800: 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45  API*)(CONST FILE
4810: 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20  TIME*, \.       
4820: 20 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61   LPSYSTEMTIME))a
4830: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
4840: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73  rent)..  { "Flus
4850: 68 46 69 6c 65 42 75 66 66 65 72 73 22 2c 20 20  hFileBuffers",  
4860: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4870: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 2c  lushFileBuffers,
4880: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64          0 },..#d
4890: 65 66 69 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c  efine osFlushFil
48a0: 65 42 75 66 66 65 72 73 20 28 28 42 4f 4f 4c 28  eBuffers ((BOOL(
48b0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29  WINAPI*)(HANDLE)
48c0: 29 61 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43  )aSyscall[13].pC
48d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
48e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
48f0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
4900: 22 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 22  "FormatMessageA"
4910: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
4920: 41 4c 4c 29 46 6f 72 6d 61 74 4d 65 73 73 61 67  ALL)FormatMessag
4930: 65 41 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  eA,          0 }
4940: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72  ,.#else.  { "For
4950: 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20 20  matMessageA",   
4960: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4970: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
4980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4990: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
49a0: 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 20 28  FormatMessageA (
49b0: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
49c0: 44 57 4f 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57  DWORD,LPCVOID,DW
49d0: 4f 52 44 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  ORD,DWORD,LPSTR,
49e0: 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44   \.        DWORD
49f0: 2c 76 61 5f 6c 69 73 74 2a 29 29 61 53 79 73 63  ,va_list*))aSysc
4a00: 61 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74  all[14].pCurrent
4a10: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4a20: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4a30: 57 49 44 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61  WIDE).  { "Forma
4a40: 74 4d 65 73 73 61 67 65 57 22 2c 20 20 20 20 20  tMessageW",     
4a50: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6f       (SYSCALL)Fo
4a60: 72 6d 61 74 4d 65 73 73 61 67 65 57 2c 20 20 20  rmatMessageW,   
4a70: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
4a80: 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73  e.  { "FormatMes
4a90: 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20 20  sageW",         
4aa0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ac0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4ad0: 23 64 65 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74  #define osFormat
4ae0: 4d 65 73 73 61 67 65 57 20 28 28 44 57 4f 52 44  MessageW ((DWORD
4af0: 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c  (WINAPI*)(DWORD,
4b00: 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57  LPCVOID,DWORD,DW
4b10: 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  ORD,LPWSTR, \.  
4b20: 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c        DWORD,va_l
4b30: 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31  ist*))aSyscall[1
4b40: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  5].pCurrent)..#i
4b50: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
4b60: 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
4b70: 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65  NSION).  { "Free
4b80: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 20 20  Library",       
4b90: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46        (SYSCALL)F
4ba0: 72 65 65 4c 69 62 72 61 72 79 2c 20 20 20 20 20  reeLibrary,     
4bb0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
4bc0: 73 65 0a 20 20 7b 20 22 46 72 65 65 4c 69 62 72  se.  { "FreeLibr
4bd0: 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ary",           
4be0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
4c10: 0a 23 64 65 66 69 6e 65 20 6f 73 46 72 65 65 4c  .#define osFreeL
4c20: 69 62 72 61 72 79 20 28 28 42 4f 4f 4c 28 57 49  ibrary ((BOOL(WI
4c30: 4e 41 50 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29  NAPI*)(HMODULE))
4c40: 61 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75  aSyscall[16].pCu
4c50: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74  rrent)..  { "Get
4c60: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4c70: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
4c80: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
4c90: 73 49 64 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  sId,     0 },..#
4ca0: 64 65 66 69 6e 65 20 6f 73 47 65 74 43 75 72 72  define osGetCurr
4cb0: 65 6e 74 50 72 6f 63 65 73 73 49 64 20 28 28 44  entProcessId ((D
4cc0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f  WORD(WINAPI*)(VO
4cd0: 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d  ID))aSyscall[17]
4ce0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4cf0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
4d00: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
4d10: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
4d20: 49 29 0a 20 20 7b 20 22 47 65 74 44 69 73 6b 46  I).  { "GetDiskF
4d30: 72 65 65 53 70 61 63 65 41 22 2c 20 20 20 20 20  reeSpaceA",     
4d40: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 44 69    (SYSCALL)GetDi
4d50: 73 6b 46 72 65 65 53 70 61 63 65 41 2c 20 20 20  skFreeSpaceA,   
4d60: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4d70: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4d80: 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28 53  paceA",       (S
4d90: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4db0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4dc0: 66 69 6e 65 20 6f 73 47 65 74 44 69 73 6b 46 72  fine osGetDiskFr
4dd0: 65 65 53 70 61 63 65 41 20 28 28 42 4f 4f 4c 28  eeSpaceA ((BOOL(
4de0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 2c  WINAPI*)(LPCSTR,
4df0: 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c  LPDWORD,LPDWORD,
4e00: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
4e10: 20 20 20 4c 50 44 57 4f 52 44 29 29 61 53 79 73     LPDWORD))aSys
4e20: 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65 6e  call[18].pCurren
4e30: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
4e40: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
4e50: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
4e60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
4e70: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
4e80: 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65 53   { "GetDiskFreeS
4e90: 70 61 63 65 57 22 2c 20 20 20 20 20 20 20 28 53  paceW",       (S
4ea0: 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46 72  YSCALL)GetDiskFr
4eb0: 65 65 53 70 61 63 65 57 2c 20 20 20 20 20 20 20  eeSpaceW,       
4ec0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
4ed0: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
4ee0: 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43 41  W",       (SYSCA
4ef0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
4f10: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
4f20: 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53 70   osGetDiskFreeSp
4f30: 61 63 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  aceW ((BOOL(WINA
4f40: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 4c 50 44  PI*)(LPCWSTR,LPD
4f50: 57 4f 52 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44  WORD,LPDWORD,LPD
4f60: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
4f70: 4c 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c  LPDWORD))aSyscal
4f80: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
4f90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4fa0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4fb0: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  SI).  { "GetFile
4fc0: 41 74 74 72 69 62 75 74 65 73 41 22 2c 20 20 20  AttributesA",   
4fd0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
4fe0: 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 2c 20  ileAttributesA, 
4ff0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5000: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5010: 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20 28  ibutesA",      (
5020: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5040: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5050: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41  efine osGetFileA
5060: 74 74 72 69 62 75 74 65 73 41 20 28 28 44 57 4f  ttributesA ((DWO
5070: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53  RD(WINAPI*)(LPCS
5080: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d  TR))aSyscall[20]
5090: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
50a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
50b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
50c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
50d0: 45 29 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41  E).  { "GetFileA
50e0: 74 74 72 69 62 75 74 65 73 57 22 2c 20 20 20 20  ttributesW",    
50f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69    (SYSCALL)GetFi
5100: 6c 65 41 74 74 72 69 62 75 74 65 73 57 2c 20 20  leAttributesW,  
5110: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5120: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
5130: 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28 53  butesW",      (S
5140: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5170: 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74  fine osGetFileAt
5180: 74 72 69 62 75 74 65 73 57 20 28 28 44 57 4f 52  tributesW ((DWOR
5190: 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53  D(WINAPI*)(LPCWS
51a0: 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d  TR))aSyscall[21]
51b0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
51c0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
51d0: 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
51e0: 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72 69   { "GetFileAttri
51f0: 62 75 74 65 73 45 78 57 22 2c 20 20 20 20 28 53  butesExW",    (S
5200: 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41 74  YSCALL)GetFileAt
5210: 74 72 69 62 75 74 65 73 45 78 57 2c 20 20 20 20  tributesExW,    
5220: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
5230: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
5240: 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43 41  sExW",    (SYSCA
5250: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
5270: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
5280: 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
5290: 75 74 65 73 45 78 57 20 28 28 42 4f 4f 4c 28 57  utesExW ((BOOL(W
52a0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c  INAPI*)(LPCWSTR,
52b0: 47 45 54 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f  GET_FILEEX_INFO_
52c0: 4c 45 56 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20  LEVELS, \.      
52d0: 20 20 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61    LPVOID))aSysca
52e0: 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[22].pCurrent)
52f0: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5300: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 46  _WINRT.  { "GetF
5310: 69 6c 65 53 69 7a 65 22 2c 20 20 20 20 20 20 20  ileSize",       
5320: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5330: 65 74 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  etFileSize,     
5340: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5350: 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 53  se.  { "GetFileS
5360: 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ize",           
5370: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5390: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
53a0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69  .#define osGetFi
53b0: 6c 65 53 69 7a 65 20 28 28 44 57 4f 52 44 28 57  leSize ((DWORD(W
53c0: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c  INAPI*)(HANDLE,L
53d0: 50 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  PDWORD))aSyscall
53e0: 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [23].pCurrent)..
53f0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5400: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
5410: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5420: 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65 74 46  _ANSI).  { "GetF
5430: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 22 2c 20 20  ullPathNameA",  
5440: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5450: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c  etFullPathNameA,
5460: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5470: 73 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  se.  { "GetFullP
5480: 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20 20  athNameA",      
5490: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
54c0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75  .#define osGetFu
54d0: 6c 6c 50 61 74 68 4e 61 6d 65 41 20 28 28 44 57  llPathNameA ((DW
54e0: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43  ORD(WINAPI*)(LPC
54f0: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c  STR,DWORD,LPSTR,
5500: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 54 52   \.        LPSTR
5510: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e  *))aSyscall[24].
5520: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
5530: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
5540: 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
5550: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
5560: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
5570: 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 46 75  WIDE).  { "GetFu
5580: 6c 6c 50 61 74 68 4e 61 6d 65 57 22 2c 20 20 20  llPathNameW",   
5590: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65       (SYSCALL)Ge
55a0: 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20  tFullPathNameW, 
55b0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
55c0: 65 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61  e.  { "GetFullPa
55d0: 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20 20  thNameW",       
55e0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
5610: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c  #define osGetFul
5620: 6c 50 61 74 68 4e 61 6d 65 57 20 28 28 44 57 4f  lPathNameW ((DWO
5630: 52 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  RD(WINAPI*)(LPCW
5640: 53 54 52 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52  STR,DWORD,LPWSTR
5650: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 57 53  , \.        LPWS
5660: 54 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 35  TR*))aSyscall[25
5670: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5680: 20 22 47 65 74 4c 61 73 74 45 72 72 6f 72 22 2c   "GetLastError",
5690: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
56a0: 43 41 4c 4c 29 47 65 74 4c 61 73 74 45 72 72 6f  CALL)GetLastErro
56b0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  r,            0 
56c0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
56d0: 74 4c 61 73 74 45 72 72 6f 72 20 28 28 44 57 4f  tLastError ((DWO
56e0: 52 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  RD(WINAPI*)(VOID
56f0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70  ))aSyscall[26].p
5700: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
5710: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
5720: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
5730: 4e 29 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  N).#if SQLITE_OS
5740: 5f 57 49 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20  _WINCE.  /* The 
5750: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 28  GetProcAddressA(
5760: 29 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  ) routine is onl
5770: 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57  y available on W
5780: 69 6e 64 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20  indows CE. */.  
5790: 7b 20 22 47 65 74 50 72 6f 63 41 64 64 72 65 73  { "GetProcAddres
57a0: 73 41 22 2c 20 20 20 20 20 20 20 20 20 28 53 59  sA",         (SY
57b0: 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 41 64 64  SCALL)GetProcAdd
57c0: 72 65 73 73 41 2c 20 20 20 20 20 20 20 20 20 30  ressA,         0
57d0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41   },.#else.  /* A
57e0: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73  ll other Windows
57f0: 20 70 6c 61 74 66 6f 72 6d 73 20 65 78 70 65 63   platforms expec
5800: 74 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  t GetProcAddress
5810: 28 29 20 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20  () to take.  ** 
5820: 61 6e 20 41 4e 53 49 20 73 74 72 69 6e 67 20 72  an ANSI string r
5830: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
5840: 20 5f 55 4e 49 43 4f 44 45 20 73 65 74 74 69 6e   _UNICODE settin
5850: 67 20 2a 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f  g */.  { "GetPro
5860: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5870: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
5880: 50 72 6f 63 41 64 64 72 65 73 73 2c 20 20 20 20  ProcAddress,    
5890: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
58a0: 66 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  f.#else.  { "Get
58b0: 50 72 6f 63 41 64 64 72 65 73 73 41 22 2c 20 20  ProcAddressA",  
58c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
58d0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
58e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
58f0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5900: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 20  GetProcAddressA 
5910: 28 28 46 41 52 50 52 4f 43 28 57 49 4e 41 50 49  ((FARPROC(WINAPI
5920: 2a 29 28 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20  *)(HMODULE, \.  
5930: 20 20 20 20 20 20 4c 50 43 53 54 52 29 29 61 53        LPCSTR))aS
5940: 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72  yscall[27].pCurr
5950: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5960: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
5970: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20  GetSystemInfo", 
5980: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
5990: 4c 4c 29 47 65 74 53 79 73 74 65 6d 49 6e 66 6f  LL)GetSystemInfo
59a0: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
59b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
59c0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
59d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
59e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
59f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5a00: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5a10: 65 74 53 79 73 74 65 6d 49 6e 66 6f 20 28 28 56  etSystemInfo ((V
5a20: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 53  OID(WINAPI*)(LPS
5a30: 59 53 54 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73  YSTEM_INFO))aSys
5a40: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
5a50: 74 29 0a 0a 20 20 7b 20 22 47 65 74 53 79 73 74  t)..  { "GetSyst
5a60: 65 6d 54 69 6d 65 22 2c 20 20 20 20 20 20 20 20  emTime",        
5a70: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 53     (SYSCALL)GetS
5a80: 79 73 74 65 6d 54 69 6d 65 2c 20 20 20 20 20 20  ystemTime,      
5a90: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
5aa0: 6e 65 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69  ne osGetSystemTi
5ab0: 6d 65 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49  me ((VOID(WINAPI
5ac0: 2a 29 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29  *)(LPSYSTEMTIME)
5ad0: 29 61 53 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43  )aSyscall[29].pC
5ae0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5af0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
5b00: 7b 20 22 47 65 74 53 79 73 74 65 6d 54 69 6d 65  { "GetSystemTime
5b10: 41 73 46 69 6c 65 54 69 6d 65 22 2c 20 28 53 59  AsFileTime", (SY
5b20: 53 43 41 4c 4c 29 47 65 74 53 79 73 74 65 6d 54  SCALL)GetSystemT
5b30: 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 2c 20 30  imeAsFileTime, 0
5b40: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
5b50: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5b60: 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41 4c  leTime", (SYSCAL
5b70: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
5b80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5b90: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
5ba0: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41  osGetSystemTimeA
5bb0: 73 46 69 6c 65 54 69 6d 65 20 28 28 56 4f 49 44  sFileTime ((VOID
5bc0: 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20  (WINAPI*)( \.   
5bd0: 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45 29       LPFILETIME)
5be0: 29 61 53 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43  )aSyscall[30].pC
5bf0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5c00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5c10: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
5c20: 22 47 65 74 54 65 6d 70 50 61 74 68 41 22 2c 20  "GetTempPathA", 
5c30: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
5c40: 41 4c 4c 29 47 65 74 54 65 6d 70 50 61 74 68 41  ALL)GetTempPathA
5c50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
5c60: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5c70: 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20 20  TempPathA",     
5c80: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5c90: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5ca0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5cb0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5cc0: 47 65 74 54 65 6d 70 50 61 74 68 41 20 28 28 44  GetTempPathA ((D
5cd0: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57  WORD(WINAPI*)(DW
5ce0: 4f 52 44 2c 4c 50 53 54 52 29 29 61 53 79 73 63  ORD,LPSTR))aSysc
5cf0: 61 6c 6c 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74  all[31].pCurrent
5d00: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5d10: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
5d20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5d30: 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 47  HAS_WIDE).  { "G
5d40: 65 74 54 65 6d 70 50 61 74 68 57 22 2c 20 20 20  etTempPathW",   
5d50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5d60: 4c 29 47 65 74 54 65 6d 70 50 61 74 68 57 2c 20  L)GetTempPathW, 
5d70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5d80: 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65  #else.  { "GetTe
5d90: 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20 20  mpPathW",       
5da0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
5db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5dc0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
5dd0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  if..#define osGe
5de0: 74 54 65 6d 70 50 61 74 68 57 20 28 28 44 57 4f  tTempPathW ((DWO
5df0: 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52  RD(WINAPI*)(DWOR
5e00: 44 2c 4c 50 57 53 54 52 29 29 61 53 79 73 63 61  D,LPWSTR))aSysca
5e10: 6c 6c 5b 33 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[32].pCurrent)
5e20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
5e30: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
5e40: 69 63 6b 43 6f 75 6e 74 22 2c 20 20 20 20 20 20  ickCount",      
5e50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5e60: 65 74 54 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20  etTickCount,    
5e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5e80: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
5e90: 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
5ea0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ec0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5ed0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
5ee0: 63 6b 43 6f 75 6e 74 20 28 28 44 57 4f 52 44 28  ckCount ((DWORD(
5ef0: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5f00: 53 79 73 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72  Syscall[33].pCur
5f10: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5f20: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
5f30: 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53 51 4c  HAS_ANSI) && SQL
5f40: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
5f50: 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65 74 56  SIONEX.  { "GetV
5f60: 65 72 73 69 6f 6e 45 78 41 22 2c 20 20 20 20 20  ersionExA",     
5f70: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5f80: 65 74 56 65 72 73 69 6f 6e 45 78 41 2c 20 20 20  etVersionExA,   
5f90: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5fa0: 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72 73 69  se.  { "GetVersi
5fb0: 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20 20  onExA",         
5fc0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fe0: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5ff0: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 56 65  .#define osGetVe
6000: 72 73 69 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28  rsionExA ((BOOL(
6010: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
6020: 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49      LPOSVERSIONI
6030: 4e 46 4f 41 29 29 61 53 79 73 63 61 6c 6c 5b 33  NFOA))aSyscall[3
6040: 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  4].pCurrent)..#i
6050: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
6060: 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  RT && defined(SQ
6070: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
6080: 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20 20  IDE) && \.      
6090: 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47    SQLITE_WIN32_G
60a0: 45 54 56 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20  ETVERSIONEX.  { 
60b0: 22 47 65 74 56 65 72 73 69 6f 6e 45 78 57 22 2c  "GetVersionExW",
60c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
60d0: 41 4c 4c 29 47 65 74 56 65 72 73 69 6f 6e 45 78  ALL)GetVersionEx
60e0: 57 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  W,           0 }
60f0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
6100: 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20 20  VersionExW",    
6110: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6120: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
6130: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6140: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
6150: 47 65 74 56 65 72 73 69 6f 6e 45 78 57 20 28 28  GetVersionExW ((
6160: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c  BOOL(WINAPI*)( \
6170: 0a 20 20 20 20 20 20 20 20 4c 50 4f 53 56 45 52  .        LPOSVER
6180: 53 49 4f 4e 49 4e 46 4f 57 29 29 61 53 79 73 63  SIONINFOW))aSysc
6190: 61 6c 6c 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74  all[35].pCurrent
61a0: 29 0a 0a 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f  )..  { "HeapAllo
61b0: 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  c",             
61c0: 20 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 41    (SYSCALL)HeapA
61d0: 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20  lloc,           
61e0: 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e      0 },..#defin
61f0: 65 20 6f 73 48 65 61 70 41 6c 6c 6f 63 20 28 28  e osHeapAlloc ((
6200: 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  LPVOID(WINAPI*)(
6210: 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a  HANDLE,DWORD, \.
6220: 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29          SIZE_T))
6230: 61 53 79 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75  aSyscall[36].pCu
6240: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
6250: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6260: 20 22 48 65 61 70 43 72 65 61 74 65 22 2c 20 20   "HeapCreate",  
6270: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6280: 43 41 4c 4c 29 48 65 61 70 43 72 65 61 74 65 2c  CALL)HeapCreate,
6290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
62a0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
62b0: 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  apCreate",      
62c0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
62d0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
62e0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
62f0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6300: 73 48 65 61 70 43 72 65 61 74 65 20 28 28 48 41  sHeapCreate ((HA
6310: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 44 57  NDLE(WINAPI*)(DW
6320: 4f 52 44 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20  ORD,SIZE_T, \.  
6330: 20 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53        SIZE_T))aS
6340: 79 73 63 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72  yscall[37].pCurr
6350: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
6360: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6370: 48 65 61 70 44 65 73 74 72 6f 79 22 2c 20 20 20  HeapDestroy",   
6380: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6390: 4c 4c 29 48 65 61 70 44 65 73 74 72 6f 79 2c 20  LL)HeapDestroy, 
63a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
63b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70  .#else.  { "Heap
63c0: 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20 20  Destroy",       
63d0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
63e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
63f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6400: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48  dif..#define osH
6410: 65 61 70 44 65 73 74 72 6f 79 20 28 28 42 4f 4f  eapDestroy ((BOO
6420: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6430: 45 29 29 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e  E))aSyscall[38].
6440: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6450: 48 65 61 70 46 72 65 65 22 2c 20 20 20 20 20 20  HeapFree",      
6460: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6470: 4c 4c 29 48 65 61 70 46 72 65 65 2c 20 20 20 20  LL)HeapFree,    
6480: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6490: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
64a0: 46 72 65 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41  Free ((BOOL(WINA
64b0: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52  PI*)(HANDLE,DWOR
64c0: 44 2c 4c 50 56 4f 49 44 29 29 61 53 79 73 63 61  D,LPVOID))aSysca
64d0: 6c 6c 5b 33 39 5d 2e 70 43 75 72 72 65 6e 74 29  ll[39].pCurrent)
64e0: 0a 0a 20 20 7b 20 22 48 65 61 70 52 65 41 6c 6c  ..  { "HeapReAll
64f0: 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
6500: 20 28 53 59 53 43 41 4c 4c 29 48 65 61 70 52 65   (SYSCALL)HeapRe
6510: 41 6c 6c 6f 63 2c 20 20 20 20 20 20 20 20 20 20  Alloc,          
6520: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
6530: 20 6f 73 48 65 61 70 52 65 41 6c 6c 6f 63 20 28   osHeapReAlloc (
6540: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
6550: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50  (HANDLE,DWORD,LP
6560: 56 4f 49 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  VOID, \.        
6570: 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c 6c  SIZE_T))aSyscall
6580: 5b 34 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [40].pCurrent)..
6590: 20 20 7b 20 22 48 65 61 70 53 69 7a 65 22 2c 20    { "HeapSize", 
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
65b0: 53 59 53 43 41 4c 4c 29 48 65 61 70 53 69 7a 65  SYSCALL)HeapSize
65c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
65d0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
65e0: 73 48 65 61 70 53 69 7a 65 20 28 28 53 49 5a 45  sHeapSize ((SIZE
65f0: 5f 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  _T(WINAPI*)(HAND
6600: 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20  LE,DWORD, \.    
6610: 20 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79      LPCVOID))aSy
6620: 73 63 61 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65  scall[41].pCurre
6630: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6640: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
6650: 65 61 70 56 61 6c 69 64 61 74 65 22 2c 20 20 20  eapValidate",   
6660: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6670: 4c 29 48 65 61 70 56 61 6c 69 64 61 74 65 2c 20  L)HeapValidate, 
6680: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6690: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 56  #else.  { "HeapV
66a0: 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20 20  alidate",       
66b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
66e0: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
66f0: 61 70 56 61 6c 69 64 61 74 65 20 28 28 42 4f 4f  apValidate ((BOO
6700: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6710: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
6720: 20 20 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73     LPCVOID))aSys
6730: 63 61 6c 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e  call[42].pCurren
6740: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
6750: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
6760: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b  ITE_OS_WINRT.  {
6770: 20 22 48 65 61 70 43 6f 6d 70 61 63 74 22 2c 20   "HeapCompact", 
6780: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6790: 43 41 4c 4c 29 48 65 61 70 43 6f 6d 70 61 63 74  CALL)HeapCompact
67a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
67b0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 48 65  },.#else.  { "He
67c0: 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20 20  apCompact",     
67d0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
67e0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
67f0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6800: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
6810: 73 48 65 61 70 43 6f 6d 70 61 63 74 20 28 28 55  sHeapCompact ((U
6820: 49 4e 54 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  INT(WINAPI*)(HAN
6830: 44 4c 45 2c 44 57 4f 52 44 29 29 61 53 79 73 63  DLE,DWORD))aSysc
6840: 61 6c 6c 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74  all[43].pCurrent
6850: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
6860: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6870: 41 4e 53 49 29 20 26 26 20 21 64 65 66 69 6e 65  ANSI) && !define
6880: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  d(SQLITE_OMIT_LO
6890: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20  AD_EXTENSION).  
68a0: 7b 20 22 4c 6f 61 64 4c 69 62 72 61 72 79 41 22  { "LoadLibraryA"
68b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ,            (SY
68c0: 53 43 41 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72  SCALL)LoadLibrar
68d0: 79 41 2c 20 20 20 20 20 20 20 20 20 20 20 20 30  yA,            0
68e0: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
68f0: 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20 20  oadLibraryA",   
6900: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6910: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6920: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6930: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
6940: 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 20 28  osLoadLibraryA (
6950: 28 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a  (HMODULE(WINAPI*
6960: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
6970: 6c 6c 5b 34 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[44].pCurrent)
6980: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6990: 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65  _WINRT && define
69a0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
69b0: 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20 20  AS_WIDE) && \.  
69c0: 20 20 20 20 20 20 21 64 65 66 69 6e 65 64 28 53        !defined(S
69d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
69e0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
69f0: 4c 6f 61 64 4c 69 62 72 61 72 79 57 22 2c 20 20  LoadLibraryW",  
6a00: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a10: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c  LL)LoadLibraryW,
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a30: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6a40: 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20 20  LibraryW",      
6a50: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a80: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6a90: 6f 61 64 4c 69 62 72 61 72 79 57 20 28 28 48 4d  oadLibraryW ((HM
6aa0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6ab0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
6ac0: 5b 34 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [45].pCurrent)..
6ad0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
6ae0: 49 4e 52 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46  INRT.  { "LocalF
6af0: 72 65 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ree",           
6b00: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63      (SYSCALL)Loc
6b10: 61 6c 46 72 65 65 2c 20 20 20 20 20 20 20 20 20  alFree,         
6b20: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6b30: 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22  .  { "LocalFree"
6b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6b50: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6b80: 64 65 66 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72  define osLocalFr
6b90: 65 65 20 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41  ee ((HLOCAL(WINA
6ba0: 50 49 2a 29 28 48 4c 4f 43 41 4c 29 29 61 53 79  PI*)(HLOCAL))aSy
6bb0: 73 63 61 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65  scall[46].pCurre
6bc0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
6bd0: 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51  _OS_WINCE && !SQ
6be0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
6bf0: 7b 20 22 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20  { "LockFile",   
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6c10: 53 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20  SCALL)LockFile, 
6c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6c30: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c   },.#else.  { "L
6c40: 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20  ockFile",       
6c50: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6c60: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
6c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6c80: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
6c90: 6f 73 4c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69  osLockFile.#defi
6ca0: 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28  ne osLockFile ((
6cb0: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6cc0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6cd0: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
6ce0: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
6cf0: 6c 5b 34 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[47].pCurrent).
6d00: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
6d10: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
6d20: 20 22 4c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20   "LockFileEx",  
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6d40: 43 41 4c 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c  CALL)LockFileEx,
6d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6d60: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f  },.#else.  { "Lo
6d70: 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20  ckFileEx",      
6d80: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6d90: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
6da0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6db0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f  endif..#ifndef o
6dc0: 73 4c 6f 63 6b 46 69 6c 65 45 78 0a 23 64 65 66  sLockFileEx.#def
6dd0: 69 6e 65 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78  ine osLockFileEx
6de0: 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29   ((BOOL(WINAPI*)
6df0: 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57  (HANDLE,DWORD,DW
6e00: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
6e10: 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 4f 56 45   \.        LPOVE
6e20: 52 4c 41 50 50 45 44 29 29 61 53 79 73 63 61 6c  RLAPPED))aSyscal
6e30: 6c 5b 34 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[48].pCurrent).
6e40: 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
6e50: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28  TE_OS_WINCE || (
6e60: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
6e70: 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 28 21   && \.        (!
6e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6e90: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
6ea0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
6eb0: 3e 30 29 29 0a 20 20 7b 20 22 4d 61 70 56 69 65  >0)).  { "MapVie
6ec0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
6ed0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61 70      (SYSCALL)Map
6ee0: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
6ef0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6f00: 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66 46  .  { "MapViewOfF
6f10: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
6f20: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
6f50: 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65 77  define osMapView
6f60: 4f 66 46 69 6c 65 20 28 28 4c 50 56 4f 49 44 28  OfFile ((LPVOID(
6f70: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6f80: 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52  DWORD,DWORD,DWOR
6f90: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
6fa0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 39  E_T))aSyscall[49
6fb0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6fc0: 20 22 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64   "MultiByteToWid
6fd0: 65 43 68 61 72 22 2c 20 20 20 20 20 28 53 59 53  eChar",     (SYS
6fe0: 43 41 4c 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f  CALL)MultiByteTo
6ff0: 57 69 64 65 43 68 61 72 2c 20 20 20 20 20 30 20  WideChar,     0 
7000: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75  },..#define osMu
7010: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
7020: 72 20 28 28 69 6e 74 28 57 49 4e 41 50 49 2a 29  r ((int(WINAPI*)
7030: 28 55 49 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53  (UINT,DWORD,LPCS
7040: 54 52 2c 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c  TR,int,LPWSTR, \
7050: 0a 20 20 20 20 20 20 20 20 69 6e 74 29 29 61 53  .        int))aS
7060: 79 73 63 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72  yscall[50].pCurr
7070: 65 6e 74 29 0a 0a 20 20 7b 20 22 51 75 65 72 79  ent)..  { "Query
7080: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
7090: 65 72 22 2c 20 28 53 59 53 43 41 4c 4c 29 51 75  er", (SYSCALL)Qu
70a0: 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f  eryPerformanceCo
70b0: 75 6e 74 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65  unter, 0 },..#de
70c0: 66 69 6e 65 20 6f 73 51 75 65 72 79 50 65 72 66  fine osQueryPerf
70d0: 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 20 28  ormanceCounter (
70e0: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20  (BOOL(WINAPI*)( 
70f0: 5c 0a 20 20 20 20 20 20 20 20 4c 41 52 47 45 5f  \.        LARGE_
7100: 49 4e 54 45 47 45 52 2a 29 29 61 53 79 73 63 61  INTEGER*))aSysca
7110: 6c 6c 5b 35 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[51].pCurrent)
7120: 0a 0a 20 20 7b 20 22 52 65 61 64 46 69 6c 65 22  ..  { "ReadFile"
7130: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7140: 20 28 53 59 53 43 41 4c 4c 29 52 65 61 64 46 69   (SYSCALL)ReadFi
7150: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
7160: 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65     0 },..#define
7170: 20 6f 73 52 65 61 64 46 69 6c 65 20 28 28 42 4f   osReadFile ((BO
7180: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44  OL(WINAPI*)(HAND
7190: 4c 45 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c  LE,LPVOID,DWORD,
71a0: 4c 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  LPDWORD, \.     
71b0: 20 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29     LPOVERLAPPED)
71c0: 29 61 53 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43  )aSyscall[52].pC
71d0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65  urrent)..  { "Se
71e0: 74 45 6e 64 4f 66 46 69 6c 65 22 2c 20 20 20 20  tEndOfFile",    
71f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7200: 29 53 65 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20  )SetEndOfFile,  
7210: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a            0 },..
7220: 23 64 65 66 69 6e 65 20 6f 73 53 65 74 45 6e 64  #define osSetEnd
7230: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
7240: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61  NAPI*)(HANDLE))a
7250: 53 79 73 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72  Syscall[53].pCur
7260: 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49  rent)..#if !SQLI
7270: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7280: 22 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 22  "SetFilePointer"
7290: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
72a0: 41 4c 4c 29 53 65 74 46 69 6c 65 50 6f 69 6e 74  ALL)SetFilePoint
72b0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  er,          0 }
72c0: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53 65 74  ,.#else.  { "Set
72d0: 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20 20  FilePointer",   
72e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
72f0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7300: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7310: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7320: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 20 28  SetFilePointer (
7330: 28 44 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28  (DWORD(WINAPI*)(
7340: 48 41 4e 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e  HANDLE,LONG,PLON
7350: 47 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f  G, \.        DWO
7360: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d  RD))aSyscall[54]
7370: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7380: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7390: 0a 20 20 7b 20 22 53 6c 65 65 70 22 2c 20 20 20  .  { "Sleep",   
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 28 53 59 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20  (SYSCALL)Sleep, 
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
73e0: 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20 20   "Sleep",       
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
7400: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7420: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7430: 6e 65 20 6f 73 53 6c 65 65 70 20 28 28 56 4f 49  ne osSleep ((VOI
7440: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
7450: 29 29 61 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70  ))aSyscall[55].p
7460: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53  Current)..  { "S
7470: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7480: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
7490: 4c 29 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  L)SystemTimeToFi
74a0: 6c 65 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  leTime,    0 },.
74b0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 79 73 74 65  .#define osSyste
74c0: 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20  mTimeToFileTime 
74d0: 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28  ((BOOL(WINAPI*)(
74e0: 43 4f 4e 53 54 20 53 59 53 54 45 4d 54 49 4d 45  CONST SYSTEMTIME
74f0: 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 46  *, \.        LPF
7500: 49 4c 45 54 49 4d 45 29 29 61 53 79 73 63 61 6c  ILETIME))aSyscal
7510: 6c 5b 35 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[56].pCurrent).
7520: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
7530: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
7540: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55  _OS_WINRT.  { "U
7550: 6e 6c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20  nlockFile",     
7560: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7570: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20  L)UnlockFile,   
7580: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7590: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
75a0: 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  kFile",         
75b0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75d0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
75e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e  if..#ifndef osUn
75f0: 6c 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65  lockFile.#define
7600: 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28   osUnlockFile ((
7610: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7620: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
7630: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7640: 20 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c    DWORD))aSyscal
7650: 6c 5b 35 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[57].pCurrent).
7660: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c  #endif..#if !SQL
7670: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b  ITE_OS_WINCE.  {
7680: 20 22 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c   "UnlockFileEx",
7690: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
76a0: 43 41 4c 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45  CALL)UnlockFileE
76b0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20  x,            0 
76c0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e  },.#else.  { "Un
76d0: 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20  lockFileEx",    
76e0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
76f0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
7700: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7710: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
7720: 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28  sUnlockFileEx ((
7730: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
7740: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
7750: 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  ,DWORD, \.      
7760: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7770: 61 53 79 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75  aSyscall[58].pCu
7780: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7790: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21  TE_OS_WINCE || !
77a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
77b0: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
77c0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
77d0: 3e 30 0a 20 20 7b 20 22 55 6e 6d 61 70 56 69 65  >0.  { "UnmapVie
77e0: 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  wOfFile",       
77f0: 20 20 28 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70    (SYSCALL)Unmap
7800: 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20  ViewOfFile,     
7810: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
7820: 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66 46   { "UnmapViewOfF
7830: 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28 53  ile",         (S
7840: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7870: 66 69 6e 65 20 6f 73 55 6e 6d 61 70 56 69 65 77  fine osUnmapView
7880: 4f 66 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  OfFile ((BOOL(WI
7890: 4e 41 50 49 2a 29 28 4c 50 43 56 4f 49 44 29 29  NAPI*)(LPCVOID))
78a0: 61 53 79 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75  aSyscall[59].pCu
78b0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64  rrent)..  { "Wid
78c0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
78d0: 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ",     (SYSCALL)
78e0: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
78f0: 79 74 65 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23  yte,     0 },..#
7900: 64 65 66 69 6e 65 20 6f 73 57 69 64 65 43 68 61  define osWideCha
7910: 72 54 6f 4d 75 6c 74 69 42 79 74 65 20 28 28 69  rToMultiByte ((i
7920: 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49 4e 54  nt(WINAPI*)(UINT
7930: 2c 44 57 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69  ,DWORD,LPCWSTR,i
7940: 6e 74 2c 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a  nt,LPSTR,int, \.
7950: 20 20 20 20 20 20 20 20 4c 50 43 53 54 52 2c 4c          LPCSTR,L
7960: 50 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b  PBOOL))aSyscall[
7970: 36 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  60].pCurrent).. 
7980: 20 7b 20 22 57 72 69 74 65 46 69 6c 65 22 2c 20   { "WriteFile", 
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
79a0: 59 53 43 41 4c 4c 29 57 72 69 74 65 46 69 6c 65  YSCALL)WriteFile
79b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
79c0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
79d0: 57 72 69 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c  WriteFile ((BOOL
79e0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
79f0: 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c  ,LPCVOID,DWORD,L
7a00: 50 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20  PDWORD, \.      
7a10: 20 20 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29    LPOVERLAPPED))
7a20: 61 53 79 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75  aSyscall[61].pCu
7a30: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
7a40: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
7a50: 22 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 22  "CreateEventExW"
7a60: 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ,          (SYSC
7a70: 41 4c 4c 29 43 72 65 61 74 65 45 76 65 6e 74 45  ALL)CreateEventE
7a80: 78 57 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  xW,          0 }
7a90: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
7aa0: 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20 20  ateEventExW",   
7ab0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7ac0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
7ad0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
7ae0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
7af0: 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 20 28  CreateEventExW (
7b00: 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29  (HANDLE(WINAPI*)
7b10: 28 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52  (LPSECURITY_ATTR
7b20: 49 42 55 54 45 53 2c 4c 50 43 57 53 54 52 2c 20  IBUTES,LPCWSTR, 
7b30: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c  \.        DWORD,
7b40: 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b  DWORD))aSyscall[
7b50: 36 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  62].pCurrent)..#
7b60: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
7b70: 4e 52 54 0a 20 20 7b 20 22 57 61 69 74 46 6f 72  NRT.  { "WaitFor
7b80: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20  SingleObject",  
7b90: 20 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74     (SYSCALL)Wait
7ba0: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c  ForSingleObject,
7bb0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
7bc0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7bd0: 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20 28  leObject",     (
7be0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
7bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c00: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
7c10: 65 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53  efine osWaitForS
7c20: 69 6e 67 6c 65 4f 62 6a 65 63 74 20 28 28 44 57  ingleObject ((DW
7c30: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
7c40: 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  DLE, \.        D
7c50: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36  WORD))aSyscall[6
7c60: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  3].pCurrent)..#i
7c70: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7c80: 43 45 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53  CE.  { "WaitForS
7c90: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20  ingleObjectEx", 
7ca0: 20 20 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46    (SYSCALL)WaitF
7cb0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
7cc0: 2c 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20  ,   0 },.#else. 
7cd0: 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c   { "WaitForSingl
7ce0: 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28 53  eObjectEx",   (S
7cf0: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d10: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
7d20: 66 69 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69  fine osWaitForSi
7d30: 6e 67 6c 65 4f 62 6a 65 63 74 45 78 20 28 28 44  ngleObjectEx ((D
7d40: 57 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41  WORD(WINAPI*)(HA
7d50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20  NDLE,DWORD, \.  
7d60: 20 20 20 20 20 20 42 4f 4f 4c 29 29 61 53 79 73        BOOL))aSys
7d70: 63 61 6c 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e  call[64].pCurren
7d80: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
7d90: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65 74  S_WINRT.  { "Set
7da0: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 22 2c 20  FilePointerEx", 
7db0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
7dc0: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78  SetFilePointerEx
7dd0: 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
7de0: 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c 65  lse.  { "SetFile
7df0: 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20 20  PointerEx",     
7e00: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
7e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7e20: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
7e30: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74 46  ..#define osSetF
7e40: 69 6c 65 50 6f 69 6e 74 65 72 45 78 20 28 28 42  ilePointerEx ((B
7e50: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OOL(WINAPI*)(HAN
7e60: 44 4c 45 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45  DLE,LARGE_INTEGE
7e70: 52 2c 20 5c 0a 20 20 20 20 20 20 20 20 50 4c 41  R, \.        PLA
7e80: 52 47 45 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52  RGE_INTEGER,DWOR
7e90: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e  D))aSyscall[65].
7ea0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53  pCurrent)..#if S
7eb0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
7ec0: 20 7b 20 22 47 65 74 46 69 6c 65 49 6e 66 6f 72   { "GetFileInfor
7ed0: 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
7ee0: 22 2c 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46  ", (SYSCALL)GetF
7ef0: 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79  ileInformationBy
7f00: 48 61 6e 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23  HandleEx, 0 },.#
7f10: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 46 69 6c  else.  { "GetFil
7f20: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
7f30: 6e 64 6c 65 45 78 22 2c 20 28 53 59 53 43 41 4c  ndleEx", (SYSCAL
7f40: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7f50: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7f60: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
7f70: 46 69 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42  FileInformationB
7f80: 79 48 61 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c  yHandleEx ((BOOL
7f90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7fa0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 46 49 4c 45  , \.        FILE
7fb0: 5f 49 4e 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f  _INFO_BY_HANDLE_
7fc0: 43 4c 41 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f  CLASS,LPVOID,DWO
7fd0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d  RD))aSyscall[66]
7fe0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7ff0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8000: 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c  && (!defined(SQL
8010: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
8020: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
8030: 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61  _SIZE>0).  { "Ma
8040: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
8050: 70 70 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c  pp",    (SYSCALL
8060: 29 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 46 72  )MapViewOfFileFr
8070: 6f 6d 41 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23  omApp,    0 },.#
8080: 65 6c 73 65 0a 20 20 7b 20 22 4d 61 70 56 69 65  else.  { "MapVie
8090: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c  wOfFileFromApp",
80a0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
80d0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4d 61 70  f..#define osMap
80e0: 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70  ViewOfFileFromAp
80f0: 70 20 28 28 4c 50 56 4f 49 44 28 57 49 4e 41 50  p ((LPVOID(WINAP
8100: 49 2a 29 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47  I*)(HANDLE,ULONG
8110: 2c 55 4c 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20  ,ULONG64, \.    
8120: 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73      SIZE_T))aSys
8130: 63 61 6c 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e  call[67].pCurren
8140: 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  t)..#if SQLITE_O
8150: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72 65  S_WINRT.  { "Cre
8160: 61 74 65 46 69 6c 65 32 22 2c 20 20 20 20 20 20  ateFile2",      
8170: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
8180: 43 72 65 61 74 65 46 69 6c 65 32 2c 20 20 20 20  CreateFile2,    
8190: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
81a0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 46  lse.  { "CreateF
81b0: 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20 20  ile2",          
81c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
81f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
8200: 74 65 46 69 6c 65 32 20 28 28 48 41 4e 44 4c 45  teFile2 ((HANDLE
8210: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54  (WINAPI*)(LPCWST
8220: 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  R,DWORD,DWORD,DW
8230: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
8240: 50 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54  PCREATEFILE2_EXT
8250: 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53  ENDED_PARAMETERS
8260: 29 29 61 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70  ))aSyscall[68].p
8270: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8280: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
8290: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
82a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
82b0: 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50  SION).  { "LoadP
82c0: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 22 2c  ackagedLibrary",
82d0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f       (SYSCALL)Lo
82e0: 61 64 50 61 63 6b 61 67 65 64 4c 69 62 72 61 72  adPackagedLibrar
82f0: 79 2c 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  y,     0 },.#els
8300: 65 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61  e.  { "LoadPacka
8310: 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20 20  gedLibrary",    
8320: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8340: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8350: 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61  #define osLoadPa
8360: 63 6b 61 67 65 64 4c 69 62 72 61 72 79 20 28 28  ckagedLibrary ((
8370: 48 4d 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29  HMODULE(WINAPI*)
8380: 28 4c 50 43 57 53 54 52 2c 20 5c 0a 20 20 20 20  (LPCWSTR, \.    
8390: 20 20 20 20 44 57 4f 52 44 29 29 61 53 79 73 63      DWORD))aSysc
83a0: 61 6c 6c 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74  all[69].pCurrent
83b0: 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  )..#if SQLITE_OS
83c0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74 54  _WINRT.  { "GetT
83d0: 69 63 6b 43 6f 75 6e 74 36 34 22 2c 20 20 20 20  ickCount64",    
83e0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
83f0: 65 74 54 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20  etTickCount64,  
8400: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
8410: 73 65 0a 20 20 7b 20 22 47 65 74 54 69 63 6b 43  se.  { "GetTickC
8420: 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  ount64",        
8430: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8450: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
8460: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 69  .#define osGetTi
8470: 63 6b 43 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e  ckCount64 ((ULON
8480: 47 4c 4f 4e 47 28 57 49 4e 41 50 49 2a 29 28 56  GLONG(WINAPI*)(V
8490: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 30  OID))aSyscall[70
84a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
84b0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
84c0: 0a 20 20 7b 20 22 47 65 74 4e 61 74 69 76 65 53  .  { "GetNativeS
84d0: 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20  ystemInfo",     
84e0: 28 53 59 53 43 41 4c 4c 29 47 65 74 4e 61 74 69  (SYSCALL)GetNati
84f0: 76 65 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20  veSystemInfo,   
8500: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
8510: 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74 65   "GetNativeSyste
8520: 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59 53  mInfo",     (SYS
8530: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8550: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
8560: 6e 65 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79  ne osGetNativeSy
8570: 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28  stemInfo ((VOID(
8580: 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20  WINAPI*)( \.    
8590: 20 20 20 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46      LPSYSTEM_INF
85a0: 4f 29 29 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e  O))aSyscall[71].
85b0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
85c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
85d0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20  N32_HAS_ANSI).  
85e0: 7b 20 22 4f 75 74 70 75 74 44 65 62 75 67 53 74  { "OutputDebugSt
85f0: 72 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59  ringA",      (SY
8600: 53 43 41 4c 4c 29 4f 75 74 70 75 74 44 65 62 75  SCALL)OutputDebu
8610: 67 53 74 72 69 6e 67 41 2c 20 20 20 20 20 20 30  gStringA,      0
8620: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f   },.#else.  { "O
8630: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
8640: 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  A",      (SYSCAL
8650: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
8660: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8670: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8680: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
8690: 69 6e 67 41 20 28 28 56 4f 49 44 28 57 49 4e 41  ingA ((VOID(WINA
86a0: 50 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79  PI*)(LPCSTR))aSy
86b0: 73 63 61 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65  scall[72].pCurre
86c0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
86d0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
86e0: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 4f 75 74  S_WIDE).  { "Out
86f0: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 22  putDebugStringW"
8700: 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29  ,      (SYSCALL)
8710: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8720: 67 57 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  gW,      0 },.#e
8730: 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70 75 74 44  lse.  { "OutputD
8740: 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20 20  ebugStringW",   
8750: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8770: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
8780: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f 75 74 70  ..#define osOutp
8790: 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 20 28  utDebugStringW (
87a0: 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 4c  (VOID(WINAPI*)(L
87b0: 50 43 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c  PCWSTR))aSyscall
87c0: 5b 37 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [73].pCurrent)..
87d0: 20 20 7b 20 22 47 65 74 50 72 6f 63 65 73 73 48    { "GetProcessH
87e0: 65 61 70 22 2c 20 20 20 20 20 20 20 20 20 20 28  eap",          (
87f0: 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f 63 65  SYSCALL)GetProce
8800: 73 73 48 65 61 70 2c 20 20 20 20 20 20 20 20 20  ssHeap,         
8810: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8820: 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70 20  sGetProcessHeap 
8830: 28 28 48 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a  ((HANDLE(WINAPI*
8840: 29 28 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c  )(VOID))aSyscall
8850: 5b 37 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [74].pCurrent)..
8860: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8870: 4e 52 54 20 26 26 20 28 21 64 65 66 69 6e 65 64  NRT && (!defined
8880: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
8890: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
88a0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b  MMAP_SIZE>0).  {
88b0: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
88c0: 69 6e 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59  ingFromApp", (SY
88d0: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
88e0: 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20  MappingFromApp, 
88f0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8900: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8910: 67 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43  gFromApp", (SYSC
8920: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8930: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8940: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8950: 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
8960: 70 69 6e 67 46 72 6f 6d 41 70 70 20 28 28 48 41  pingFromApp ((HA
8970: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 48 41  NDLE(WINAPI*)(HA
8980: 4e 44 4c 45 2c 20 5c 0a 20 20 20 20 20 20 20 20  NDLE, \.        
8990: 4c 50 53 45 43 55 52 49 54 59 5f 41 54 54 52 49  LPSECURITY_ATTRI
89a0: 42 55 54 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e  BUTES,ULONG,ULON
89b0: 47 36 34 2c 4c 50 43 57 53 54 52 29 29 61 53 79  G64,LPCWSTR))aSy
89c0: 73 63 61 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65  scall[75].pCurre
89d0: 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a  nt)../*.** NOTE:
89e0: 20 4f 6e 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61   On some sub-pla
89f0: 74 66 6f 72 6d 73 2c 20 74 68 65 20 49 6e 74 65  tforms, the Inte
8a00: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8a10: 63 68 61 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e  change "function
8a20: 22 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 72 65  ".**       is re
8a30: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6d 61 63 72  ally just a macr
8a40: 6f 20 74 68 61 74 20 75 73 65 73 20 61 20 63 6f  o that uses a co
8a50: 6d 70 69 6c 65 72 20 69 6e 74 72 69 6e 73 69 63  mpiler intrinsic
8a60: 20 28 65 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20   (e.g. x64)..** 
8a70: 20 20 20 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20        So do not 
8a80: 74 72 79 20 74 6f 20 6d 61 6b 65 20 74 68 69 73  try to make this
8a90: 20 69 73 20 69 6e 74 6f 20 61 20 72 65 64 65 66   is into a redef
8aa0: 69 6e 61 62 6c 65 20 69 6e 74 65 72 66 61 63 65  inable interface
8ab0: 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
8ac0: 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  (InterlockedComp
8ad0: 61 72 65 45 78 63 68 61 6e 67 65 29 0a 20 20 7b  areExchange).  {
8ae0: 20 22 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d   "InterlockedCom
8af0: 70 61 72 65 45 78 63 68 61 6e 67 65 22 2c 20 28  pareExchange", (
8b00: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
8b20: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8b30: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8b40: 45 78 63 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f  Exchange Interlo
8b50: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8b60: 6e 67 65 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49  nge.#else.  { "I
8b70: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8b80: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8b90: 43 41 4c 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64  CALL)Interlocked
8ba0: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 2c  CompareExchange,
8bb0: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
8bc0: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
8bd0: 61 72 65 45 78 63 68 61 6e 67 65 20 28 28 4c 4f  areExchange ((LO
8be0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47  NG(WINAPI*)(LONG
8bf0: 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   \.        SQLIT
8c00: 45 5f 57 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45  E_WIN32_VOLATILE
8c10: 2a 2c 20 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53  *, LONG,LONG))aS
8c20: 79 73 63 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72  yscall[76].pCurr
8c30: 65 6e 74 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64  ent).#endif /* d
8c40: 65 66 69 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b  efined(Interlock
8c50: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
8c60: 65 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  e) */..#if !SQLI
8c70: 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
8c80: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
8c90: 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  && SQLITE_WIN32_
8ca0: 55 53 45 5f 55 55 49 44 0a 20 20 7b 20 22 55 75  USE_UUID.  { "Uu
8cb0: 69 64 43 72 65 61 74 65 22 2c 20 20 20 20 20 20  idCreate",      
8cc0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
8cd0: 4c 29 55 75 69 64 43 72 65 61 74 65 2c 20 20 20  L)UuidCreate,   
8ce0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
8cf0: 65 6c 73 65 0a 20 20 7b 20 22 55 75 69 64 43 72  else.  { "UuidCr
8d00: 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  eate",          
8d10: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
8d40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 75 69  f..#define osUui
8d50: 64 43 72 65 61 74 65 20 28 28 52 50 43 5f 53 54  dCreate ((RPC_ST
8d60: 41 54 55 53 28 52 50 43 5f 45 4e 54 52 59 2a 29  ATUS(RPC_ENTRY*)
8d70: 28 55 55 49 44 2a 29 29 61 53 79 73 63 61 6c 6c  (UUID*))aSyscall
8d80: 5b 37 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [77].pCurrent)..
8d90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
8da0: 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
8db0: 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
8dc0: 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49  TE_WIN32_USE_UUI
8dd0: 44 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  D.  { "UuidCreat
8de0: 65 53 65 71 75 65 6e 74 69 61 6c 22 2c 20 20 20  eSequential",   
8df0: 20 20 28 53 59 53 43 41 4c 4c 29 55 75 69 64 43    (SYSCALL)UuidC
8e00: 72 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 2c  reateSequential,
8e10: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
8e20: 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65 71  { "UuidCreateSeq
8e30: 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28 53  uential",     (S
8e40: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
8e60: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
8e70: 69 6e 65 20 6f 73 55 75 69 64 43 72 65 61 74 65  ine osUuidCreate
8e80: 53 65 71 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20  Sequential \.   
8e90: 20 20 20 20 20 28 28 52 50 43 5f 53 54 41 54 55       ((RPC_STATU
8ea0: 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55  S(RPC_ENTRY*)(UU
8eb0: 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 38  ID*))aSyscall[78
8ec0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8ed0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8ee0: 5f 4e 4f 5f 53 59 4e 43 29 20 26 26 20 53 51 4c  _NO_SYNC) && SQL
8ef0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
8f00: 45 3e 30 0a 20 20 7b 20 22 46 6c 75 73 68 56 69  E>0.  { "FlushVi
8f10: 65 77 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20  ewOfFile",      
8f20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75      (SYSCALL)Flu
8f30: 73 68 56 69 65 77 4f 66 46 69 6c 65 2c 20 20 20  shViewOfFile,   
8f40: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8f50: 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f 66    { "FlushViewOf
8f60: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
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 46 6c 75 73 68 56 69 65  efine osFlushVie
8fb0: 77 4f 66 46 69 6c 65 20 5c 0a 20 20 20 20 20 20  wOfFile \.      
8fc0: 20 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a    ((BOOL(WINAPI*
8fd0: 29 28 4c 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54  )(LPCVOID,SIZE_T
8fe0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70  ))aSyscall[79].p
8ff0: 43 75 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20  Current)..}; /* 
9000: 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72  End of the overr
9010: 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63  ideable system c
9020: 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  alls */../*.** T
9030: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
9040: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
9050: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
9060: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
9070: 0a 2a 2a 20 22 77 69 6e 33 32 22 20 56 46 53 65  .** "win32" VFSe
9080: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
9090: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
90a0: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
90b0: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
90c0: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
90d0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
90e0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
90f0: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
9100: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
9110: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
9120: 20 69 6e 74 20 77 69 6e 53 65 74 53 79 73 74 65   int winSetSyste
9130: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
9140: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
9150: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
9160: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
9170: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
9180: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
9190: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
91a0: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
91b0: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
91c0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
91d0: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
91e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
91f0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
9200: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
9210: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
9220: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
9230: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
9240: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
9250: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
9260: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
9270: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
9280: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
9290: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
92a0: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
92b0: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
92c0: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
92d0: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
92e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
92f0: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
9300: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
9310: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
9320: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
9330: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9340: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
9350: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9360: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
9370: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
9380: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
9390: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
93a0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
93b0: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
93c0: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
93d0: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
93e0: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
93f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
9400: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
9410: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
9420: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
9430: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
9440: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
9450: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
9460: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
9470: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
9480: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
9490: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
94a0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
94b0: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
94c0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
94d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
94e0: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
94f0: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
9500: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
9510: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
9520: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
9530: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
9540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9550: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9560: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9570: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
9580: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
9590: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
95a0: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
95b0: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
95c0: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
95d0: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
95e0: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
95f0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
9600: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
9610: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
9620: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
9630: 63 61 6c 6c 5f 70 74 72 20 77 69 6e 47 65 74 53  call_ptr winGetS
9640: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
9650: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
9660: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
9670: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
9680: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
9690: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
96a0: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
96b0: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
96c0: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
96d0: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
96e0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
96f0: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9700: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9710: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
9720: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
9730: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9740: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9750: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9760: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
9770: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
9780: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
9790: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
97a0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
97b0: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
97c0: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
97d0: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
97e0: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
97f0: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
9800: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
9810: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
9820: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
9830: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 77  ic const char *w
9840: 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c  inNextSystemCall
9850: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c  (sqlite3_vfs *p,
9860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
9870: 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d  me){.  int i = -
9880: 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  1;..  UNUSED_PAR
9890: 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66 28  AMETER(p);.  if(
98a0: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f   zName ){.    fo
98b0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
98c0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20  ze(aSyscall)-1; 
98d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
98e0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
98f0: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
9900: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
9910: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b   }.  }.  for(i++
9920: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
9930: 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20  yscall); i++){. 
9940: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
9950: 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20 29  i].pCurrent!=0 )
9960: 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c   return aSyscall
9970: 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20  [i].zName;.  }. 
9980: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69   return 0;.}..#i
9990: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
99a0: 32 5f 4d 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49  2_MALLOC./*.** I
99b0: 66 20 61 20 57 69 6e 33 32 20 6e 61 74 69 76 65  f a Win32 native
99c0: 20 68 65 61 70 20 68 61 73 20 62 65 65 6e 20 63   heap has been c
99d0: 6f 6e 66 69 67 75 72 65 64 2c 20 74 68 69 73 20  onfigured, this 
99e0: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74  function will at
99f0: 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70  tempt to.** comp
9a00: 61 63 74 20 69 74 2e 20 20 55 70 6f 6e 20 73 75  act it.  Upon su
9a10: 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b  ccess, SQLITE_OK
9a20: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
9a30: 64 2e 20 20 55 70 6f 6e 20 66 61 69 6c 75 72 65  d.  Upon failure
9a40: 2c 20 6f 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49  , one.** of SQLI
9a50: 54 45 5f 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45  TE_NOMEM, SQLITE
9a60: 5f 45 52 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54  _ERROR, or SQLIT
9a70: 45 5f 4e 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20  E_NOTFOUND will 
9a80: 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68  be returned.  Th
9a90: 65 0a 2a 2a 20 22 70 6e 4c 61 72 67 65 73 74 22  e.** "pnLargest"
9aa0: 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f   argument, if no
9ab0: 6e 2d 7a 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20  n-zero, will be 
9ac0: 75 73 65 64 20 74 6f 20 72 65 74 75 72 6e 20 74  used to return t
9ad0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
9ae0: 2a 20 6c 61 72 67 65 73 74 20 63 6f 6d 6d 69 74  * largest commit
9af0: 74 65 64 20 66 72 65 65 20 62 6c 6f 63 6b 20 69  ted free block i
9b00: 6e 20 74 68 65 20 68 65 61 70 2c 20 69 6e 20 62  n the heap, in b
9b10: 79 74 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ytes..*/.int sql
9b20: 69 74 65 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61  ite3_win32_compa
9b30: 63 74 5f 68 65 61 70 28 4c 50 55 49 4e 54 20 70  ct_heap(LPUINT p
9b40: 6e 4c 61 72 67 65 73 74 29 7b 0a 20 20 69 6e 74  nLargest){.  int
9b50: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9b60: 0a 20 20 55 49 4e 54 20 6e 4c 61 72 67 65 73 74  .  UINT nLargest
9b70: 20 3d 20 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68   = 0;.  HANDLE h
9b80: 48 65 61 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  Heap;..  winMemA
9b90: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
9ba0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
9bb0: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
9bc0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
9bd0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
9be0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
9bf0: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
9c00: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
9c10: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
9c20: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
9c30: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
9c40: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
9c50: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
9c60: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
9c70: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23  ULL) );.#endif.#
9c80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
9c90: 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
9ca0: 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 28 6e  S_WINRT.  if( (n
9cb0: 4c 61 72 67 65 73 74 3d 6f 73 48 65 61 70 43 6f  Largest=osHeapCo
9cc0: 6d 70 61 63 74 28 68 48 65 61 70 2c 20 53 51 4c  mpact(hHeap, SQL
9cd0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
9ce0: 4c 41 47 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20  LAGS))==0 ){.   
9cf0: 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
9d00: 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
9d10: 72 28 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 73  r();.    if( las
9d20: 74 45 72 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52  tErrno==NO_ERROR
9d30: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9d40: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
9d50: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
9d60: 65 61 70 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73  eapCompact (no s
9d70: 70 61 63 65 29 2c 20 68 65 61 70 3d 25 70 22 2c  pace), heap=%p",
9d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9d90: 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29     (void*)hHeap)
9da0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
9db0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
9dc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9dd0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9de0: 49 54 45 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c  ITE_ERROR, "fail
9df0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
9e00: 74 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  t (%lu), heap=%p
9e10: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
9e20: 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72       osGetLastEr
9e30: 72 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 68 48  ror(), (void*)hH
9e40: 65 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  eap);.      rc =
9e50: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
9e60: 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
9e70: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
9e80: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66  ITE_NOTFOUND, "f
9e90: 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43 6f 6d  ailed to HeapCom
9ea0: 70 61 63 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a  pact, heap=%p",.
9eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76                (v
9ec0: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 72  oid*)hHeap);.  r
9ed0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
9ee0: 55 4e 44 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  UND;.#endif.  if
9ef0: 28 20 70 6e 4c 61 72 67 65 73 74 20 29 20 2a 70  ( pnLargest ) *p
9f00: 6e 4c 61 72 67 65 73 74 20 3d 20 6e 4c 61 72 67  nLargest = nLarg
9f10: 65 73 74 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  est;.  return rc
9f20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  ;.}../*.** If a 
9f30: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
9f40: 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66 69  p has been confi
9f50: 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  gured, this func
9f60: 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70  tion will attemp
9f70: 74 20 74 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20  t to.** destroy 
9f80: 61 6e 64 20 72 65 63 72 65 61 74 65 20 69 74 2e  and recreate it.
9f90: 20 20 49 66 20 74 68 65 20 57 69 6e 33 32 20 6e    If the Win32 n
9fa0: 61 74 69 76 65 20 68 65 61 70 20 69 73 20 6e 6f  ative heap is no
9fb0: 74 20 69 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f  t isolated and/o
9fc0: 72 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  r.** the sqlite3
9fd0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 20 66  _memory_used() f
9fe0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
9ff0: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51   return zero, SQ
a000: 4c 49 54 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a  LITE_BUSY will.*
a010: 2a 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 6e  * be returned an
a020: 64 20 6e 6f 20 63 68 61 6e 67 65 73 20 77 69 6c  d no changes wil
a030: 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 74 68 65  l be made to the
a040: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
a050: 61 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ap..*/.int sqlit
a060: 65 33 5f 77 69 6e 33 32 5f 72 65 73 65 74 5f 68  e3_win32_reset_h
a070: 65 61 70 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b  eap(){.  int rc;
a080: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a090: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a0a0: 4d 61 73 74 65 72 3b 20 29 20 2f 2a 20 54 68 65  Master; ) /* The
a0b0: 20 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74   main static mut
a0c0: 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  ex */.  MUTEX_LO
a0d0: 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
a0e0: 65 78 20 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f  ex *pMem; )    /
a0f0: 2a 20 54 68 65 20 6d 65 6d 73 79 73 20 73 74 61  * The memsys sta
a100: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d  tic mutex */.  M
a110: 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
a120: 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  ter = sqlite3_mu
a130: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
a140: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
a150: 53 54 45 52 29 3b 20 29 0a 20 20 4d 55 54 45 58  STER); ).  MUTEX
a160: 5f 4c 4f 47 49 43 28 20 70 4d 65 6d 20 3d 20 73  _LOGIC( pMem = s
a170: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
a180: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
a190: 53 54 41 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20  STATIC_MEM); ). 
a1a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a1b0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
a1c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a1d0: 6e 74 65 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69  nter(pMem);.  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 69 66 28 20 77 69 6e 4d 65 6d 47  );.  if( winMemG
a200: 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26  etHeap()!=NULL &
a210: 26 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64  & winMemGetOwned
a220: 28 29 20 26 26 20 73 71 6c 69 74 65 33 5f 6d 65  () && sqlite3_me
a230: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a240: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
a250: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
a260: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 6e  here should be n
a270: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6d 65  o outstanding me
a280: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73  mory allocations
a290: 20 6f 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 68   on.    ** the h
a2a0: 65 61 70 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63  eap.  Also, sinc
a2b0: 65 20 62 6f 74 68 20 74 68 65 20 6d 61 73 74 65  e both the maste
a2c0: 72 20 61 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63  r and memsys loc
a2d0: 6b 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ks are currently
a2e0: 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 68 65  .    ** being he
a2f0: 6c 64 20 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68  ld by us, no oth
a300: 65 72 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65  er function (i.e
a310: 2e 20 66 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74  . from another t
a320: 68 72 65 61 64 29 20 73 68 6f 75 6c 64 0a 20 20  hread) should.  
a330: 20 20 2a 2a 20 62 65 20 61 62 6c 65 20 74 6f 20    ** be able to 
a340: 65 76 65 6e 20 61 63 63 65 73 73 20 74 68 65 20  even access the 
a350: 68 65 61 70 2e 20 20 41 74 74 65 6d 70 74 20 74  heap.  Attempt t
a360: 6f 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72 65  o destroy and re
a370: 63 72 65 61 74 65 20 6f 75 72 0a 20 20 20 20 2a  create our.    *
a380: 2a 20 69 73 6f 6c 61 74 65 64 20 57 69 6e 33 32  * isolated Win32
a390: 20 6e 61 74 69 76 65 20 68 65 61 70 20 6e 6f 77   native heap now
a3a0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
a3b0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
a3c0: 61 70 28 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()!=NULL );.  
a3d0: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
a3e0: 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20  GetOwned() );.  
a3f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
a400: 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d  3_memory_used()=
a410: 3d 30 20 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d  =0 );.    winMem
a420: 53 68 75 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47  Shutdown(winMemG
a430: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
a440: 20 20 61 73 73 65 72 74 28 20 77 69 6e 4d 65 6d    assert( winMem
a450: 47 65 74 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20  GetHeap()==NULL 
a460: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
a470: 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29  winMemGetOwned()
a480: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a490: 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75  sqlite3_memory_u
a4a0: 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20  sed()==0 );.    
a4b0: 72 63 20 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28  rc = winMemInit(
a4c0: 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72  winMemGetDataPtr
a4d0: 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ());.    assert(
a4e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a4f0: 7c 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  | winMemGetHeap(
a500: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
a510: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a520: 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65  E_OK || winMemGe
a530: 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20  tOwned() );.    
a540: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
a550: 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33  TE_OK || sqlite3
a560: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a570: 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  0 );.  }else{.  
a580: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
a590: 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61  Win32 native hea
a5a0: 70 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  p cannot be modi
a5b0: 66 69 65 64 20 62 65 63 61 75 73 65 20 69 74 20  fied because it 
a5c0: 6d 61 79 20 62 65 20 69 6e 20 75 73 65 2e 0a 20  may be in use.. 
a5d0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
a5e0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
a5f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
a600: 6c 65 61 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73  leave(pMem);.  s
a610: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a620: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
a630: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
a640: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
a650: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
a660: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a670: 6e 20 6f 75 74 70 75 74 73 20 74 68 65 20 73 70  n outputs the sp
a680: 65 63 69 66 69 65 64 20 28 41 4e 53 49 29 20 73  ecified (ANSI) s
a690: 74 72 69 6e 67 20 74 6f 20 74 68 65 20 57 69 6e  tring to the Win
a6a0: 33 32 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 28  32 debugger.** (
a6b0: 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a  if available)..*
a6c0: 2f 0a 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  /..void sqlite3_
a6d0: 77 69 6e 33 32 5f 77 72 69 74 65 5f 64 65 62 75  win32_write_debu
a6e0: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42  g(const char *zB
a6f0: 75 66 2c 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20  uf, int nBuf){. 
a700: 20 63 68 61 72 20 7a 44 62 67 42 75 66 5b 53 51   char zDbgBuf[SQ
a710: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a720: 55 46 5f 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20  UF_SIZE];.  int 
a730: 6e 4d 69 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c  nMin = MIN(nBuf,
a740: 20 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44   (SQLITE_WIN32_D
a750: 42 47 5f 42 55 46 5f 53 49 5a 45 20 2d 20 31 29  BG_BUF_SIZE - 1)
a760: 29 3b 20 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67  ); /* may be neg
a770: 61 74 69 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20  ative. */.  if( 
a780: 6e 4d 69 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d  nMin<-1 ) nMin =
a790: 20 2d 31 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61   -1; /* all nega
a7a0: 74 69 76 65 20 76 61 6c 75 65 73 20 62 65 63 6f  tive values beco
a7b0: 6d 65 20 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65  me -1. */.  asse
a7c0: 72 74 28 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20  rt( nMin==-1 || 
a7d0: 6e 4d 69 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c  nMin==0 || nMin<
a7e0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a7f0: 5f 42 55 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66  _BUF_SIZE );.#if
a800: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a810: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
a820: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a830: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
a840: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
a850: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a860: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
a870: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
a880: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
a890: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
a8a0: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
a8b0: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
a8c0: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
a8d0: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
a8e0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
a8f0: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
a900: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
a910: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
a920: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
a930: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
a940: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
a950: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
a960: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
a970: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
a980: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
a990: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
a9a0: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
a9b0: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
a9c0: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
a9d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a9e0: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
a9f0: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
aa00: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
aa10: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
aa20: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
aa30: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
aa40: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
aa50: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
aa60: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
aa70: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
aa80: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
aa90: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
aaa0: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
aab0: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
aac0: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
aad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
aae0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
aaf0: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
ab00: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
ab10: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
ab20: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
ab30: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
ab40: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
ab50: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
ab60: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
ab70: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
ab80: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
ab90: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
aba0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
abb0: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
abc0: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
abd0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
abe0: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
abf0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
ac00: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
ac10: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
ac20: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
ac30: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
ac40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
ac70: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
ac80: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
ac90: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
aca0: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
acb0: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
acc0: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
acd0: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
ace0: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
acf0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
ad00: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
ad10: 30 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  0 && !SQLITE_OS_
ad20: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
ad30: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20  _OS_WINRT && \. 
ad40: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 48         SQLITE_TH
ad50: 52 45 41 44 53 41 46 45 3e 30 0a 44 57 4f 52 44  READSAFE>0.DWORD
ad60: 20 73 71 6c 69 74 65 33 57 69 6e 33 32 57 61 69   sqlite3Win32Wai
ad70: 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  t(HANDLE hObject
ad80: 29 7b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20  ){.  DWORD rc;. 
ad90: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 6f 73   while( (rc = os
ada0: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
adb0: 65 63 74 45 78 28 68 4f 62 6a 65 63 74 2c 20 49  ectEx(hObject, I
adc0: 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20 20 20 20  NFINITE,.       
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adf0: 54 52 55 45 29 29 3d 3d 57 41 49 54 5f 49 4f 5f  TRUE))==WAIT_IO_
ae00: 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20  COMPLETION ){}. 
ae10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
ae20: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
ae30: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
ae40: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
ae50: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
ae60: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
ae70: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
ae80: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
ae90: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
aea0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
aeb0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
aec0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
aed0: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
aee0: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
aef0: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
af00: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
af10: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
af20: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
af30: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
af40: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
af50: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
af60: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
af70: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
af80: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
af90: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
afa0: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
afb0: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
afc0: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
afd0: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
afe0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
aff0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
b000: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
b010: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
b020: 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20  () API..*/..#if 
b030: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
b040: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
b050: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
b060: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
b070: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
b080: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
b090: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b0a0: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
b0b0: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b0c0: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
b0d0: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b0e0: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
b0f0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
b100: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
b110: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
b120: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
b130: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
b140: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
b150: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
b160: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
b170: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
b180: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
b190: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
b1a0: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
b1b0: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
b1c0: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b1d0: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
b1e0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b1f0: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
b200: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
b210: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
b220: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
b230: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b240: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
b250: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
b260: 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  n 1;.#elif SQLIT
b270: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
b280: 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 49 6e 74  ONEX.  if( osInt
b290: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
b2a0: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
b2b0: 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d  _os_type, 0, 0)=
b2c0: 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
b2d0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
b2e0: 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f 53 56  AS_ANSI).    OSV
b2f0: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
b300: 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  o;.    sInfo.dwO
b310: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
b320: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
b330: 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73 69  ;.    osGetVersi
b340: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
b350: 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64     osInterlocked
b360: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
b370: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
b380: 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f  ,.        (sInfo
b390: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d  .dwPlatformId ==
b3a0: 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49   VER_PLATFORM_WI
b3b0: 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c  N32_NT) ? 2 : 1,
b3c0: 20 30 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e   0);.#elif defin
b3d0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b3e0: 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 4f 53  HAS_WIDE).    OS
b3f0: 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e  VERSIONINFOW sIn
b400: 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77  fo;.    sInfo.dw
b410: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
b420: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
b430: 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73  );.    osGetVers
b440: 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a  ionExW(&sInfo);.
b450: 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65      osInterlocke
b460: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b470: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b480: 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66  e,.        (sInf
b490: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d  o.dwPlatformId =
b4a0: 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  = VER_PLATFORM_W
b4b0: 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31  IN32_NT) ? 2 : 1
b4c0: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
b4d0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b4e0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b4f0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b500: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b510: 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  2;.#elif SQLITE_
b520: 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 6f 73  TEST.  return os
b530: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
b540: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
b550: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
b560: 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a 20 20 2f  2)==2;.#else.  /
b570: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c  *.  ** NOTE: All
b580: 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 20 77   sub-platforms w
b590: 68 65 72 65 20 74 68 65 20 47 65 74 56 65 72 73  here the GetVers
b5a0: 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74 69  ionEx[AW] functi
b5b0: 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 20 20 20  ons are.  **    
b5c0: 20 20 20 64 65 70 72 65 63 61 74 65 64 20 61 72     deprecated ar
b5d0: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64  e always assumed
b5e0: 20 74 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20   to be based on 
b5f0: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20  the NT kernel.. 
b600: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
b610: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66  #endif.}..#ifdef
b620: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
b630: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
b640: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
b650: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b660: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
b670: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
b680: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b690: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
b6a0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
b6b0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
b6c0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
b6d0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
b6e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
b6f0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b700: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b710: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b720: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b730: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b740: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
b750: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
b760: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
b770: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b780: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
b790: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b7a0: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d  ytes>=0 );.  p =
b7b0: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
b7c0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b7d0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
b7e0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
b7f0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
b800: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b810: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
b820: 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20  to HeapAlloc %u 
b830: 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61  bytes (%lu), hea
b840: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
b850: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
b860: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
b870: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
b880: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
b890: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
b8a0: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b8b0: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
b8c0: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
b8d0: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
b8e0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
b8f0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
b900: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
b910: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
b920: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
b930: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
b940: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
b950: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
b960: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
b970: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
b980: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
b990: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
b9a0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
b9b0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b9c0: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
b9d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
b9e0: 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  !pPrior ) return
b9f0: 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c  ; /* Passing NUL
ba00: 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73  L to HeapFree is
ba10: 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20   undefined. */. 
ba20: 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65   if( !osHeapFree
ba30: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
ba40: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
ba50: 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20   pPrior) ){.    
ba60: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
ba70: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
ba80: 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c  d to HeapFree bl
ba90: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
baa0: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
bab0: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
bac0: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
bad0: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
bae0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
baf0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
bb00: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
bb10: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
bb20: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
bb30: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
bb40: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
bb50: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
bb60: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
bb70: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
bb80: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bb90: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
bba0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bbb0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bbc0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bbd0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bbe0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bbf0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bc00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bc10: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bc20: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
bc30: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
bc40: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
bc50: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
bc60: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
bc70: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
bc80: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
bc90: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
bca0: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
bcb0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bcc0: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
bcd0: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
bce0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
bcf0: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
bd00: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bd10: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
bd20: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
bd30: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
bd40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
bd50: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
bd60: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
bd70: 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68  u bytes (%lu), h
bd80: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
bd90: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
bda0: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
bdb0: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
bdc0: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
bdd0: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
bde0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
bdf0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
be00: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
be10: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
be20: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
be30: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
be40: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
be50: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
be60: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
be70: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
be80: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
be90: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
bea0: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
beb0: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
bec0: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
bed0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bee0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
bef0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
bf00: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
bf10: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
bf20: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
bf30: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
bf40: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
bf50: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bf60: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bf70: 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20   p) );.#endif.  
bf80: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
bf90: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
bfa0: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
bfb0: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
bfc0: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
bfd0: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
bfe0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
bff0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c000: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
c010: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c020: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c030: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
c040: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c050: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
c060: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c070: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
c080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
c090: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
c0a0: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
c0b0: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
c0c0: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
c0d0: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
c0e0: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
c0f0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
c100: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
c110: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
c120: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
c130: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
c140: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
c150: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
c160: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
c170: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
c180: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
c190: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c1a0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c1b0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
c1c0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
c1d0: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c1e0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
c1f0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
c200: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c210: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
c220: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
c230: 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  E.  if( !pWinMem
c240: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
c250: 20 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69     DWORD dwIniti
c260: 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  alSize = SQLITE_
c270: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
c280: 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20  SIZE;.    DWORD 
c290: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c2a0: 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c  (DWORD)sqlite3Gl
c2b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
c2c0: 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69  ;.    if( dwMaxi
c2d0: 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  mumSize==0 ){.  
c2e0: 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a      dwMaximumSiz
c2f0: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
c300: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a  _HEAP_MAX_SIZE;.
c310: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77      }else if( dw
c320: 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61  InitialSize>dwMa
c330: 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20  ximumSize ){.   
c340: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
c350: 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65   = dwMaximumSize
c360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
c370: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
c380: 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51   osHeapCreate(SQ
c390: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c3a0: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49               dwI
c3d0: 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61  nitialSize, dwMa
c3e0: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
c3f0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c400: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
c410: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c420: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
c430: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
c440: 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29  HeapCreate (%lu)
c450: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
c460: 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a  Size=%lu, maxSiz
c470: 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20  e=%lu",.        
c480: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
c490: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
c4a0: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49  _HEAP_FLAGS, dwI
c4b0: 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20  nitialSize,.    
c4c0: 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53        dwMaximumS
c4d0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
c4e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c4f0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
c500: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c510: 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ned = TRUE;.    
c520: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
c530: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20  ata->bOwned );. 
c540: 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d   }.#else.  pWinM
c550: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
c560: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
c570: 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ();.  if( !pWinM
c580: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c590: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
c5a0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
c5b0: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
c5c0: 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  o GetProcessHeap
c5d0: 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61   (%lu)", osGetLa
c5e0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
c5f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c600: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
c610: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c620: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
c630: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
c640: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
c650: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
c660: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c670: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
c680: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c690: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c6a0: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c6b0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c6c0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c6d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c6e0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
c6f0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c700: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
c710: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
c720: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c730: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
c740: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
c750: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c760: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
c770: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c780: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
c790: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
c7a0: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
c7b0: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
c7c0: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
c7d0: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
c7e0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c7f0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
c800: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c810: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
c820: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
c830: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c840: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
c850: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66  _MAGIC2 );..  if
c860: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
c870: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
c880: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c890: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
c8a0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
c8b0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
c8c0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
c8d0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
c8e0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
c8f0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
c900: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
c910: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
c920: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
c930: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
c940: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
c950: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
c960: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
c970: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57  osHeapDestroy(pW
c980: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
c990: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
c9a0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c9b0: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
c9c0: 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25  o HeapDestroy (%
c9d0: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
c9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9f0: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
ca00: 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e  r(), (void*)pWin
ca10: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b  MemData->hHeap);
ca20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ca30: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
ca40: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
ca50: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
ca60: 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b  a->hHeap = NULL;
ca70: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
ca80: 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c  pulate the low-l
ca90: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
caa0: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  cation function 
cab0: 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73  pointers in.** s
cac0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
cad0: 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65  ig.m with pointe
cae0: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
caf0: 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  es in this file.
cb00: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
cb10: 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c  s specify the bl
cb20: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
cb30: 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   manage..**.** T
cb40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
cb50: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
cb60: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20  lite3_config(), 
cb70: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a  and therefore.**
cb80: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
cb90: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
cba0: 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a  e (it is not)..*
cbb0: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
cbc0: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
cbd0: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
cbe0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
cbf0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
cc00: 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d  m_methods winMem
cc10: 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  Methods = {.    
cc20: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  winMemMalloc,.  
cc30: 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20    winMemFree,.  
cc40: 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c    winMemRealloc,
cc50: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c  .    winMemSize,
cc60: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64  .    winMemRound
cc70: 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e  up,.    winMemIn
cc80: 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68  it,.    winMemSh
cc90: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e  utdown,.    &win
cca0: 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20  _mem_data.  };. 
ccb0: 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d   return &winMemM
ccc0: 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20  ethods;.}..void 
ccd0: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
cce0: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71  ault(void){.  sq
ccf0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
cd00: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
cd10: 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  C, sqlite3MemGet
cd20: 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64  Win32());.}.#end
cd30: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
cd40: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
cd50: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
cd60: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
cd70: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20  crosoft Unicode 
cd80: 28 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a 2a  (UTF-16?)..**.**
cd90: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
cda0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
cdb0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
cdc0: 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a 73  rom malloc..*/.s
cdd0: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
cde0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  Utf8ToUnicode(co
cdf0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
ce00: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  ame){.  int nCha
ce10: 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69 64  r;.  LPWSTR zWid
ce20: 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 43  eFilename;..  nC
ce30: 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  har = osMultiByt
ce40: 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f 55  eToWideChar(CP_U
ce50: 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d  TF8, 0, zFilenam
ce60: 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  e, -1, NULL, 0);
ce70: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
ce80: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
ce90: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c 65  .  }.  zWideFile
cea0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
ceb0: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
cec0: 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c 65  sizeof(zWideFile
ced0: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
cee0: 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3d  ( zWideFilename=
cef0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
cf00: 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20   0;.  }.  nChar 
cf10: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
cf20: 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38 2c  ideChar(CP_UTF8,
cf30: 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 2d   0, zFilename, -
cf40: 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  1, zWideFilename
cf50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf70: 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28 20    nChar);.  if( 
cf80: 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20 20  nChar==0 ){.    
cf90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 69  sqlite3_free(zWi
cfa0: 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  deFilename);.   
cfb0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20 3d   zWideFilename =
cfc0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
cfd0: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a   zWideFilename;.
cfe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  }../*.** Convert
cff0: 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f   Microsoft Unico
d000: 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  de to UTF-8.  Sp
d010: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
d020: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
d030: 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
d040: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d050: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d060: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
d070: 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20 7a  ToUtf8(LPCWSTR z
d080: 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  WideFilename){. 
d090: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
d0a0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 0a  ar *zFilename;..
d0b0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
d0c0: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
d0d0: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
d0e0: 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30  eFilename, -1, 0
d0f0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d100: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d110: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d120: 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  }.  zFilename = 
d130: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
d140: 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  o( nByte );.  if
d150: 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  ( zFilename==0 )
d160: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d170: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d180: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d190: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d1a0: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d  zWideFilename, -
d1b0: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 42  1, zFilename, nB
d1c0: 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  yte,.           
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1e0: 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69 66       0, 0);.  if
d1f0: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d200: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d210: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
d220: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a   zFilename = 0;.
d230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69    }.  return zFi
d240: 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
d250: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
d260: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
d270: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62 61  soft Unicode, ba
d280: 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 75  sed on the.** cu
d290: 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20 73  rrent codepage s
d2a0: 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c 65  ettings for file
d2b0: 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   apis..**.** Spa
d2c0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d2d0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d2e0: 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66 72  s obtained.** fr
d2f0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d300: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50 57  c..*/.static LPW
d310: 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  STR winMbcsToUni
d320: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
d330: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69  *zFilename){.  i
d340: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53  nt nByte;.  LPWS
d350: 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  TR zMbcsFilename
d360: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
d370: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
d380: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
d390: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
d3a0: 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Byte = osMultiBy
d3b0: 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64  teToWideChar(cod
d3c0: 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65 6e  epage, 0, zFilen
d3d0: 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20  ame, -1, NULL,. 
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
d400: 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b  )*sizeof(WCHAR);
d410: 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20  .  if( nByte==0 
d420: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d430: 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c 65  .  }.  zMbcsFile
d440: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61  name = sqlite3Ma
d450: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a  llocZero( nByte*
d460: 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c 65  sizeof(zMbcsFile
d470: 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69 66  name[0]) );.  if
d480: 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3d  ( zMbcsFilename=
d490: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d4a0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
d4b0: 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57  = osMultiByteToW
d4c0: 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67 65  ideChar(codepage
d4d0: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
d4e0: 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  -1, zMbcsFilenam
d4f0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
d500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d510: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
d520: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
d530: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
d540: 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  bcsFilename);.  
d550: 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 20    zMbcsFilename 
d560: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d570: 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65 3b  n zMbcsFilename;
d580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
d590: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
d5a0: 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79 74  ode to multi-byt
d5b0: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
d5c0: 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ng, based on the
d5d0: 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49 20  .** user's ANSI 
d5e0: 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  codepage..**.** 
d5f0: 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
d600: 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  e returned strin
d610: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d620: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61  om.** sqlite3_ma
d630: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
d640: 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f  c char *winUnico
d650: 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52  deToMbcs(LPCWSTR
d660: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b   zWideFilename){
d670: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
d680: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
d690: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
d6a0: 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  = osAreFileApisA
d6b0: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
d6c0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d6d0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d6e0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d6f0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46 69  page, 0, zWideFi
d700: 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20 30  lename, -1, 0, 0
d710: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
d720: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d730: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
d740: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   zFilename = sql
d750: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
d760: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
d770: 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20  Filename==0 ){. 
d780: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
d790: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
d7a0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
d7b0: 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57  (codepage, 0, zW
d7c0: 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c  ideFilename, -1,
d7d0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79 74              nByt
d800: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  e, 0, 0);.  if( 
d810: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
d820: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d830: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
d840: 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Filename = 0;.  
d850: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c 65  }.  return zFile
d860: 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  name;.}../*.** C
d870: 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74 65  onvert multibyte
d880: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
d890: 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70 61  g to UTF-8.  Spa
d8a0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a  ce to hold the.*
d8b0: 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e  * returned strin
d8c0: 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  g is obtained fr
d8d0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
d8e0: 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  c()..*/.char *sq
d8f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
d900: 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20 63  _to_utf8(const c
d910: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
d920: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  .  char *zFilena
d930: 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54 52  meUtf8;.  LPWSTR
d940: 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a 54   zTmpWide;..  zT
d950: 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63 73  mpWide = winMbcs
d960: 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e  ToUnicode(zFilen
d970: 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  ame);.  if( zTmp
d980: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
d990: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
d9a0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20 77  FilenameUtf8 = w
d9b0: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
d9c0: 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71 6c  zTmpWide);.  sql
d9d0: 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57 69  ite3_free(zTmpWi
d9e0: 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 46  de);.  return zF
d9f0: 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a 0a  ilenameUtf8;.}..
da00: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55 54  /*.** Convert UT
da10: 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74 65  F-8 to multibyte
da20: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
da30: 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  g.  Space to hol
da40: 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e 65  d the.** returne
da50: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
da60: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
da70: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 63  3_malloc()..*/.c
da80: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e  har *sqlite3_win
da90: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28  32_utf8_to_mbcs(
daa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
dab0: 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a  ename){.  char *
dac0: 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a 20  zFilenameMbcs;. 
dad0: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
dae0: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
daf0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
db00: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
db10: 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29  f( zTmpWide==0 )
db20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
db30: 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 4d    }.  zFilenameM
db40: 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  bcs = winUnicode
db50: 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65 29  ToMbcs(zTmpWide)
db60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
db70: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72 65  (zTmpWide);.  re
db80: 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d 62  turn zFilenameMb
db90: 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  cs;.}../*.** Thi
dba0: 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
dbb0: 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f  the data directo
dbc0: 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  ry or the tempor
dbd0: 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62 61  ary directory ba
dbe0: 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72  sed on.** the pr
dbf0: 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74 73  ovided arguments
dc00: 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67 75  .  The type argu
dc10: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20 69  ment must be 1 i
dc20: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20 74  n order to set t
dc30: 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65 63  he.** data direc
dc40: 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72 64  tory or 2 in ord
dc50: 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74 65  er to set the te
dc60: 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72  mporary director
dc70: 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a  y.  The zValue.*
dc80: 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  * argument is th
dc90: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69  e name of the di
dca0: 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e 20  rectory to use. 
dcb0: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
dcc0: 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c  e will be.** SQL
dcd0: 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73  ITE_OK if succes
dce0: 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sful..*/.int sql
dcf0: 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64  ite3_win32_set_d
dd00: 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20 74  irectory(DWORD t
dd10: 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56 61  ype, LPCWSTR zVa
dd20: 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70  lue){.  char **p
dd30: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  pDirectory = 0;.
dd40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dd50: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69  MIT_AUTOINIT.  i
dd60: 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
dd70: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
dd80: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
dd90: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  rc;.#endif.  if(
dda0: 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49   type==SQLITE_WI
ddb0: 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54 4f  N32_DATA_DIRECTO
ddc0: 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70  RY_TYPE ){.    p
ddd0: 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71  pDirectory = &sq
dde0: 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63  lite3_data_direc
ddf0: 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66  tory;.  }else if
de00: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
de10: 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43 54  IN32_TEMP_DIRECT
de20: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
de30: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
de40: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
de50: 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73  ctory;.  }.  ass
de60: 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f 72  ert( !ppDirector
de70: 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54  y || type==SQLIT
de80: 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49 52  E_WIN32_DATA_DIR
de90: 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20 20  ECTORY_TYPE.    
dea0: 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53        || type==S
deb0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50  QLITE_WIN32_TEMP
dec0: 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45 0a  _DIRECTORY_TYPE.
ded0: 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21    );.  assert( !
dee0: 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20 73  ppDirectory || s
def0: 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48 61  qlite3MemdebugHa
df00: 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74 6f  sType(*ppDirecto
df10: 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41 50  ry, MEMTYPE_HEAP
df20: 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69 72  ) );.  if( ppDir
df30: 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63 68  ectory ){.    ch
df40: 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d  ar *zValueUtf8 =
df50: 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61 6c   0;.    if( zVal
df60: 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20  ue && zValue[0] 
df70: 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65 55  ){.      zValueU
df80: 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65  tf8 = winUnicode
df90: 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a  ToUtf8(zValue);.
dfa0: 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c 75        if ( zValu
dfb0: 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20  eUtf8==0 ){.    
dfc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
dfd0: 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
dfe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
dff0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70 70  sqlite3_free(*pp
e000: 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20  Directory);.    
e010: 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 7a  *ppDirectory = z
e020: 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20 72  ValueUtf8;.    r
e030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e040: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
e050: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
e060: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
e070: 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74 4c  value of winGetL
e080: 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69  astErrorMsg.** i
e090: 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  s zero if the er
e0a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74 73  ror message fits
e0b0: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20   in the buffer, 
e0c0: 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f  or non-zero.** o
e0d0: 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68 65  therwise (if the
e0e0: 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72 75   message was tru
e0f0: 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74  ncated)..*/.stat
e100: 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61 73  ic int winGetLas
e110: 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44 20  tErrorMsg(DWORD 
e120: 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e  lastErrno, int n
e130: 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
e140: 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73  {.  /* FormatMes
e150: 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20 6f  sage returns 0 o
e160: 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68 65  n failure.  Othe
e170: 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72 65  rwise it.  ** re
e180: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  turns the number
e190: 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74 74   of TCHARs writt
e1a0: 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  en to the output
e1b0: 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65 78  .  ** buffer, ex
e1c0: 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72 6d  cluding the term
e1d0: 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61  inating null cha
e1e0: 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20  r..  */.  DWORD 
e1f0: 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61  dwLen = 0;.  cha
e200: 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20  r *zOut = 0;..  
e210: 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
e220: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
e230: 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a 54  NRT.    WCHAR zT
e240: 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f 57  empWide[SQLITE_W
e250: 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f  IN32_MAX_ERRMSG_
e260: 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77  CHARS+1];.    dw
e270: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
e280: 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45  ssageW(FORMAT_ME
e290: 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45  SSAGE_FROM_SYSTE
e2a0: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2c0: 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f   FORMAT_MESSAGE_
e2d0: 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a  IGNORE_INSERTS,.
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
e300: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
e310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e320: 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
e330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e340: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e360: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69 64          zTempWid
e370: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
e380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e390: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58  SQLITE_WIN32_MAX
e3a0: 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20  _ERRMSG_CHARS,. 
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3c0: 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a              0);.
e3d0: 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54 52  #else.    LPWSTR
e3e0: 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c   zTempWide = NUL
e3f0: 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f  L;.    dwLen = o
e400: 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57 28  sFormatMessageW(
e410: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41  FORMAT_MESSAGE_A
e420: 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20 7c  LLOCATE_BUFFER |
e430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
e450: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f  RMAT_MESSAGE_FRO
e460: 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20 20  M_SYSTEM |.     
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d          FORMAT_M
e490: 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e  ESSAGE_IGNORE_IN
e4a0: 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20 20  SERTS,.         
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4c0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
e4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4e0: 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f         lastErrno
e4f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
e510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
e530: 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57 69  LPWSTR) &zTempWi
e540: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
e570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e580: 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
e590: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
e5a0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
e5b0: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
e5c0: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
e5d0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
e5e0: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
e5f0: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
e600: 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
e610: 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20  f8(zTempWide);. 
e620: 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42       sqlite3EndB
e630: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23  enignMalloc();.#
e640: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
e650: 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  NRT.      /* fre
e660: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
e670: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
e680: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
e690: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
e6a0: 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  ree(zTempWide);.
e6b0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
e6c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
e6d0: 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
e6e0: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
e6f0: 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20  zTemp = NULL;.  
e700: 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d    dwLen = osForm
e710: 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d 41  atMessageA(FORMA
e720: 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41  T_MESSAGE_ALLOCA
e730: 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20 20  TE_BUFFER |.    
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e750: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
e760: 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53  MESSAGE_FROM_SYS
e770: 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEM |.          
e780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e790: 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47     FORMAT_MESSAG
e7a0: 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53  E_IGNORE_INSERTS
e7b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e                 N
e7d0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ULL,.           
e7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7f0: 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20    lastErrno,.   
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20            0,.   
e820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e830: 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54 52            (LPSTR
e840: 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20  ) &zTemp,.      
e850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e860: 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20         0,.      
e870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e880: 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69         0);.    i
e890: 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a  f( dwLen > 0 ){.
e8a0: 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74        /* allocat
e8b0: 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20 63  e a buffer and c
e8c0: 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a  onvert to UTF8 *
e8d0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  /.      sqlite3B
e8e0: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
e8f0: 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d  ();.      zOut =
e900: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d   sqlite3_win32_m
e910: 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a 54 65 6d  bcs_to_utf8(zTem
e920: 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
e930: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
e940: 28 29 3b 0a 20 20 20 20 20 20 2f 2a 20 66 72 65  ();.      /* fre
e950: 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75 66  e the system buf
e960: 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  fer allocated by
e970: 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20 2a   FormatMessage *
e980: 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46  /.      osLocalF
e990: 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ree(zTemp);.    
e9a0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  }.  }.#endif.  i
e9b0: 66 28 20 30 20 3d 3d 20 64 77 4c 65 6e 20 29 7b  f( 0 == dwLen ){
e9c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
e9d0: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
e9e0: 2c 20 22 4f 73 45 72 72 6f 72 20 30 78 25 6c 78  , "OsError 0x%lx
e9f0: 20 28 25 6c 75 29 22 2c 20 6c 61 73 74 45 72 72   (%lu)", lastErr
ea00: 6e 6f 2c 20 6c 61 73 74 45 72 72 6e 6f 29 3b 0a  no, lastErrno);.
ea10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
ea20: 63 6f 70 79 20 61 20 6d 61 78 69 6d 75 6d 20 6f  copy a maximum o
ea30: 66 20 6e 42 75 66 20 63 68 61 72 73 20 74 6f 20  f nBuf chars to 
ea40: 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f  output buffer */
ea50: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
ea60: 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
ea70: 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20  , "%s", zOut);. 
ea80: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 55     /* free the U
ea90: 54 46 38 20 62 75 66 66 65 72 20 2a 2f 0a 20 20  TF8 buffer */.  
eaa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eab0: 4f 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Out);.  }.  retu
eac0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  rn 0;.}../*.**.*
ead0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eae0: 2d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c  - winLogErrorAtL
eaf0: 69 6e 65 28 29 20 2d 20 69 73 20 6f 6e 6c 79 20  ine() - is only 
eb00: 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61 20  ever called via 
eb10: 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e  the macro.** win
eb20: 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a  LogError()..**.*
eb30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
eb40: 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20  s invoked after 
eb50: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
eb60: 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f  in an OS functio
eb70: 6e 2e 0a 2a 2a 20 49 74 20 6c 6f 67 73 20 61 20  n..** It logs a 
eb80: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
eb90: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
eba0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
ebb0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
ebc0: 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 2c 20 69  rror code and, i
ebd0: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
ebe0: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
ebf0: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a  quivalent from.*
ec00: 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 2e  * FormatMessage.
ec10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
ec20: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
ec30: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
ec40: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
ec50: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
ec60: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
ec70: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
ec80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
ec90: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
eca0: 4f 50 45 4e 29 2e 0a 2a 2a 20 54 68 65 20 74 77  OPEN)..** The tw
ecb0: 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67  o subsequent arg
ecc0: 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65  uments should be
ecd0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
ece0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
ecf0: 74 0a 2a 2a 20 66 61 69 6c 65 64 20 61 6e 64 20  t.** failed and 
ed00: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
ed10: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
ed20: 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66   if any..*/.#def
ed30: 69 6e 65 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  ine winLogError(
ed40: 61 2c 62 2c 63 2c 64 29 20 20 20 77 69 6e 4c 6f  a,b,c,d)   winLo
ed50: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62  gErrorAtLine(a,b
ed60: 2c 63 2c 64 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73  ,c,d,__LINE__).s
ed70: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 67  tatic int winLog
ed80: 45 72 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69  ErrorAtLine(.  i
ed90: 6e 74 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20  nt errcode,     
eda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
edb0: 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  * SQLite error c
edc0: 6f 64 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c  ode */.  DWORD l
edd0: 61 73 74 45 72 72 6e 6f 2c 20 20 20 20 20 20 20  astErrno,       
ede0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e 33           /* Win3
edf0: 32 20 6c 61 73 74 20 65 72 72 6f 72 20 2a 2f 0a  2 last error */.
ee00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
ee10: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
ee20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
ee30: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
ee40: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
ee50: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
ee60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
ee70: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
ee80: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
ee90: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
eec0: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
eed0: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
eee0: 29 7b 0a 20 20 63 68 61 72 20 7a 4d 73 67 5b 35  ){.  char zMsg[5
eef0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  00];            
ef00: 20 20 20 20 20 2f 2a 20 48 75 6d 61 6e 20 72 65       /* Human re
ef10: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 74 65 78  adable error tex
ef20: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  t */.  int i;   
ef30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef40: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ef50: 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73  ounter */..  zMs
ef60: 67 5b 30 5d 20 3d 20 30 3b 0a 20 20 77 69 6e 47  g[0] = 0;.  winG
ef70: 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6c  etLastErrorMsg(l
ef80: 61 73 74 45 72 72 6e 6f 2c 20 73 69 7a 65 6f 66  astErrno, sizeof
ef90: 28 7a 4d 73 67 29 2c 20 7a 4d 73 67 29 3b 0a 20  (zMsg), zMsg);. 
efa0: 20 61 73 73 65 72 74 28 20 65 72 72 63 6f 64 65   assert( errcode
efb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
efc0: 20 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20   if( zPath==0 ) 
efd0: 7a 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 66 6f  zPath = "";.  fo
efe0: 72 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26  r(i=0; zMsg[i] &
eff0: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 20  & zMsg[i]!='\r' 
f000: 26 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27  && zMsg[i]!='\n'
f010: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b  ; i++){}.  zMsg[
f020: 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
f030: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
f040: 20 20 20 20 20 22 6f 73 5f 77 69 6e 2e 63 3a 25       "os_win.c:%
f050: 64 3a 20 28 25 6c 75 29 20 25 73 28 25 73 29 20  d: (%lu) %s(%s) 
f060: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
f070: 6e 65 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 7a  ne, lastErrno, z
f080: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 4d 73  Func, zPath, zMs
f090: 67 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  g.  );..  return
f0a0: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
f0b0: 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
f0c0: 20 74 69 6d 65 73 20 74 68 61 74 20 61 20 52 65   times that a Re
f0d0: 61 64 46 69 6c 65 28 29 2c 20 57 72 69 74 65 46  adFile(), WriteF
f0e0: 69 6c 65 28 29 2c 20 61 6e 64 20 44 65 6c 65 74  ile(), and Delet
f0f0: 65 46 69 6c 65 28 29 0a 2a 2a 20 77 69 6c 6c 20  eFile().** will 
f100: 62 65 20 72 65 74 72 69 65 64 20 66 6f 6c 6c 6f  be retried follo
f110: 77 69 6e 67 20 61 20 6c 6f 63 6b 69 6e 67 20 65  wing a locking e
f120: 72 72 6f 72 20 2d 20 70 72 6f 62 61 62 6c 79 20  rror - probably 
f130: 63 61 75 73 65 64 20 62 79 0a 2a 2a 20 61 6e 74  caused by.** ant
f140: 69 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 2e  ivirus software.
f150: 20 20 41 6c 73 6f 20 74 68 65 20 69 6e 69 74 69    Also the initi
f160: 61 6c 20 64 65 6c 61 79 20 62 65 66 6f 72 65 20  al delay before 
f170: 74 68 65 20 66 69 72 73 74 20 72 65 74 72 79 2e  the first retry.
f180: 0a 2a 2a 20 54 68 65 20 64 65 6c 61 79 20 69 6e  .** The delay in
f190: 63 72 65 61 73 65 73 20 6c 69 6e 65 61 72 6c 79  creases linearly
f1a0: 20 77 69 74 68 20 65 61 63 68 20 72 65 74 72 79   with each retry
f1b0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
f1c0: 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f  ITE_WIN32_IOERR_
f1d0: 52 45 54 52 59 0a 23 20 64 65 66 69 6e 65 20 53  RETRY.# define S
f1e0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
f1f0: 52 5f 52 45 54 52 59 20 31 30 0a 23 65 6e 64 69  R_RETRY 10.#endi
f200: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
f210: 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54  _WIN32_IOERR_RET
f220: 52 59 5f 44 45 4c 41 59 0a 23 20 64 65 66 69 6e  RY_DELAY.# defin
f230: 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  e SQLITE_WIN32_I
f240: 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59  OERR_RETRY_DELAY
f250: 20 32 35 0a 23 65 6e 64 69 66 0a 73 74 61 74 69   25.#endif.stati
f260: 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65  c int winIoerrRe
f270: 74 72 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e  try = SQLITE_WIN
f280: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 3b 0a  32_IOERR_RETRY;.
f290: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
f2a0: 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20  errRetryDelay = 
f2b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45  SQLITE_WIN32_IOE
f2c0: 52 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 3b 0a  RR_RETRY_DELAY;.
f2d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 77 69 6e 49  ./*.** The "winI
f2e0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20 6d  oerrCanRetry1" m
f2f0: 61 63 72 6f 20 69 73 20 75 73 65 64 20 74 6f 20  acro is used to 
f300: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 20 70  determine if a p
f310: 61 72 74 69 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a  articular I/O.**
f320: 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 62 74 61   error code obta
f330: 69 6e 65 64 20 76 69 61 20 47 65 74 4c 61 73 74  ined via GetLast
f340: 45 72 72 6f 72 28 29 20 69 73 20 65 6c 69 67 69  Error() is eligi
f350: 62 6c 65 20 74 6f 20 62 65 20 72 65 74 72 69 65  ble to be retrie
f360: 64 2e 20 20 49 74 0a 2a 2a 20 6d 75 73 74 20 61  d.  It.** must a
f370: 63 63 65 70 74 20 74 68 65 20 65 72 72 6f 72 20  ccept the error 
f380: 63 6f 64 65 20 44 57 4f 52 44 20 61 73 20 69 74  code DWORD as it
f390: 73 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20  s only argument 
f3a0: 61 6e 64 20 73 68 6f 75 6c 64 20 72 65 74 75 72  and should retur
f3b0: 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  n.** non-zero if
f3c0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
f3d0: 69 73 20 74 72 61 6e 73 69 65 6e 74 20 69 6e 20  is transient in 
f3e0: 6e 61 74 75 72 65 20 61 6e 64 20 74 68 65 20 6f  nature and the o
f3f0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 72 65 73 70  peration.** resp
f400: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 67 65 6e 65  onsible for gene
f410: 72 61 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69  rating the origi
f420: 6e 61 6c 20 65 72 72 6f 72 20 6d 69 67 68 74 20  nal error might 
f430: 73 75 63 63 65 65 64 20 75 70 6f 6e 20 62 65 69  succeed upon bei
f440: 6e 67 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20 20  ng.** retried.  
f450: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  The argument to 
f460: 74 68 69 73 20 6d 61 63 72 6f 20 73 68 6f 75 6c  this macro shoul
f470: 64 20 62 65 20 61 20 76 61 72 69 61 62 6c 65 2e  d be a variable.
f480: 0a 2a 2a 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61  .**.** Additiona
f490: 6c 6c 79 2c 20 61 20 6d 61 63 72 6f 20 6e 61 6d  lly, a macro nam
f4a0: 65 64 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52  ed "winIoerrCanR
f4b0: 65 74 72 79 32 22 20 6d 61 79 20 62 65 20 64 65  etry2" may be de
f4c0: 66 69 6e 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  fined.  If it.**
f4d0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 69 74 20   is defined, it 
f4e0: 77 69 6c 6c 20 62 65 20 63 6f 6e 73 75 6c 74 65  will be consulte
f4f0: 64 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20  d only when the 
f500: 6d 61 63 72 6f 20 22 77 69 6e 49 6f 65 72 72 43  macro "winIoerrC
f510: 61 6e 52 65 74 72 79 31 22 0a 2a 2a 20 72 65 74  anRetry1".** ret
f520: 75 72 6e 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  urns zero.  The 
f530: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
f540: 79 32 22 20 6d 61 63 72 6f 20 69 73 20 63 6f 6d  y2" macro is com
f550: 70 6c 65 74 65 6c 79 20 6f 70 74 69 6f 6e 61 6c  pletely optional
f560: 20 61 6e 64 0a 2a 2a 20 6d 61 79 20 62 65 20 75   and.** may be u
f570: 73 65 64 20 74 6f 20 69 6e 63 6c 75 64 65 20 61  sed to include a
f580: 64 64 69 74 69 6f 6e 61 6c 20 65 72 72 6f 72 20  dditional error 
f590: 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 65 74  codes in the set
f5a0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
f5b0: 72 65 73 75 6c 74 20 69 6e 20 74 68 65 20 66 61  result in the fa
f5c0: 69 6c 69 6e 67 20 49 2f 4f 20 6f 70 65 72 61 74  iling I/O operat
f5d0: 69 6f 6e 20 62 65 69 6e 67 20 72 65 74 72 69 65  ion being retrie
f5e0: 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
f5f0: 20 20 49 66 0a 2a 2a 20 64 65 66 69 6e 65 64 2c    If.** defined,
f600: 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   the "winIoerrCa
f610: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 6d  nRetry2" macro m
f620: 75 73 74 20 65 78 68 69 62 69 74 20 65 78 74 65  ust exhibit exte
f630: 72 6e 61 6c 20 73 65 6d 61 6e 74 69 63 73 0a 2a  rnal semantics.*
f640: 2a 20 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74  * identical to t
f650: 68 6f 73 65 20 6f 66 20 74 68 65 20 22 77 69 6e  hose of the "win
f660: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 20  IoerrCanRetry1" 
f670: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64  macro..*/.#if !d
f680: 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72 43  efined(winIoerrC
f690: 61 6e 52 65 74 72 79 31 29 0a 23 64 65 66 69 6e  anRetry1).#defin
f6a0: 65 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  e winIoerrCanRet
f6b0: 72 79 31 28 61 29 20 28 28 28 61 29 3d 3d 45 52  ry1(a) (((a)==ER
f6c0: 52 4f 52 5f 41 43 43 45 53 53 5f 44 45 4e 49 45  ROR_ACCESS_DENIE
f6d0: 44 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20  D)        || \. 
f6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f700: 29 3d 3d 45 52 52 4f 52 5f 53 48 41 52 49 4e 47  )==ERROR_SHARING
f710: 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 7c  _VIOLATION)    |
f720: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f    ((a)==ERROR_LO
f750: 43 4b 5f 56 49 4f 4c 41 54 49 4f 4e 29 20 20 20  CK_VIOLATION)   
f760: 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
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 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
f790: 4f 52 5f 44 45 56 5f 4e 4f 54 5f 45 58 49 53 54  OR_DEV_NOT_EXIST
f7a0: 29 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  )        || \.  
f7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29              ((a)
f7d0: 3d 3d 45 52 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f  ==ERROR_NETNAME_
f7e0: 44 45 4c 45 54 45 44 29 20 20 20 20 20 20 7c 7c  DELETED)      ||
f7f0: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 45 4d   ((a)==ERROR_SEM
f820: 5f 54 49 4d 45 4f 55 54 29 20 20 20 20 20 20 20  _TIMEOUT)       
f830: 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
f860: 52 5f 4e 45 54 57 4f 52 4b 5f 55 4e 52 45 41 43  R_NETWORK_UNREAC
f870: 48 41 42 4c 45 29 29 0a 23 65 6e 64 69 66 0a 0a  HABLE)).#endif..
f880: 2f 2a 0a 2a 2a 20 49 66 20 61 20 52 65 61 64 46  /*.** If a ReadF
f890: 69 6c 65 28 29 20 6f 72 20 57 72 69 74 65 46 69  ile() or WriteFi
f8a0: 6c 65 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  le() error occur
f8b0: 73 2c 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  s, invoke this r
f8c0: 6f 75 74 69 6e 65 0a 2a 2a 20 74 6f 20 73 65 65  outine.** to see
f8d0: 20 69 66 20 69 74 20 73 68 6f 75 6c 64 20 62 65   if it should be
f8e0: 20 72 65 74 72 69 65 64 2e 20 20 52 65 74 75 72   retried.  Retur
f8f0: 6e 20 54 52 55 45 20 74 6f 20 72 65 74 72 79 2e  n TRUE to retry.
f900: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
f910: 2a 20 74 6f 20 67 69 76 65 20 75 70 20 77 69 74  * to give up wit
f920: 68 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  h an error..*/.s
f930: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 52 65 74  tatic int winRet
f940: 72 79 49 6f 65 72 72 28 69 6e 74 20 2a 70 6e 52  ryIoerr(int *pnR
f950: 65 74 72 79 2c 20 44 57 4f 52 44 20 2a 70 45 72  etry, DWORD *pEr
f960: 72 6f 72 29 7b 0a 20 20 44 57 4f 52 44 20 65 20  ror){.  DWORD e 
f970: 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
f980: 28 29 3b 0a 20 20 69 66 28 20 2a 70 6e 52 65 74  ();.  if( *pnRet
f990: 72 79 3e 3d 77 69 6e 49 6f 65 72 72 52 65 74 72  ry>=winIoerrRetr
f9a0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 45 72  y ){.    if( pEr
f9b0: 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2a 70 45  ror ){.      *pE
f9c0: 72 72 6f 72 20 3d 20 65 3b 0a 20 20 20 20 7d 0a  rror = e;.    }.
f9d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f9e0: 7d 0a 20 20 69 66 28 20 77 69 6e 49 6f 65 72 72  }.  if( winIoerr
f9f0: 43 61 6e 52 65 74 72 79 31 28 65 29 20 29 7b 0a  CanRetry1(e) ){.
fa00: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33      sqlite3_win3
fa10: 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72  2_sleep(winIoerr
fa20: 52 65 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70  RetryDelay*(1+*p
fa30: 6e 52 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b  nRetry));.    ++
fa40: 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65  *pnRetry;.    re
fa50: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23 69 66 20  turn 1;.  }.#if 
fa60: 64 65 66 69 6e 65 64 28 77 69 6e 49 6f 65 72 72  defined(winIoerr
fa70: 43 61 6e 52 65 74 72 79 32 29 0a 20 20 65 6c 73  CanRetry2).  els
fa80: 65 20 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61  e if( winIoerrCa
fa90: 6e 52 65 74 72 79 32 28 65 29 20 29 7b 0a 20 20  nRetry2(e) ){.  
faa0: 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
fab0: 73 6c 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65  sleep(winIoerrRe
fac0: 74 72 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52  tryDelay*(1+*pnR
fad0: 65 74 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70  etry));.    ++*p
fae0: 6e 52 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75  nRetry;.    retu
faf0: 72 6e 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 1;.  }.#endif
fb00: 0a 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b  .  if( pError ){
fb10: 0a 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65  .    *pError = e
fb20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
fb30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61  ;.}../*.** Log a
fb40: 20 49 2f 4f 20 65 72 72 6f 72 20 72 65 74 72 79   I/O error retry
fb50: 20 65 70 69 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61   episode..*/.sta
fb60: 74 69 63 20 76 6f 69 64 20 77 69 6e 4c 6f 67 49  tic void winLogI
fb70: 6f 65 72 72 28 69 6e 74 20 6e 52 65 74 72 79 2c  oerr(int nRetry,
fb80: 20 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20   int lineno){.  
fb90: 69 66 28 20 6e 52 65 74 72 79 20 29 7b 0a 20 20  if( nRetry ){.  
fba0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
fbb0: 4c 49 54 45 5f 4e 4f 54 49 43 45 2c 0a 20 20 20  LITE_NOTICE,.   
fbc0: 20 20 20 22 64 65 6c 61 79 65 64 20 25 64 6d 73     "delayed %dms
fbd0: 20 66 6f 72 20 6c 6f 63 6b 2f 73 68 61 72 69 6e   for lock/sharin
fbe0: 67 20 63 6f 6e 66 6c 69 63 74 20 61 74 20 6c 69  g conflict at li
fbf0: 6e 65 20 25 64 22 2c 0a 20 20 20 20 20 20 77 69  ne %d",.      wi
fc00: 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79  nIoerrRetryDelay
fc10: 2a 6e 52 65 74 72 79 2a 28 6e 52 65 74 72 79 2b  *nRetry*(nRetry+
fc20: 31 29 2f 32 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20  1)/2, lineno.   
fc30: 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 53   );.  }.}..#if S
fc40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f  QLITE_OS_WINCE./
fc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
fc90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69  *********.** Thi
fca0: 73 20 73 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69  s section contai
fcb0: 6e 73 20 63 6f 64 65 20 66 6f 72 20 57 69 6e 43  ns code for WinC
fcc0: 45 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21  E only..*/.#if !
fcd0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
fce0: 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50  SVC_LOCALTIME_AP
fcf0: 49 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53  I) || !SQLITE_MS
fd00: 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
fd10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53 56 43 20  ./*.** The MSVC 
fd20: 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77 73 20 43  CRT on Windows C
fd30: 45 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 61  E may not have a
fd40: 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 66 75 6e   localtime() fun
fd50: 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72  ction.  So.** cr
fd60: 65 61 74 65 20 61 20 73 75 62 73 74 69 74 75 74  eate a substitut
fd70: 65 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c  e..*/.#include <
fd80: 74 69 6d 65 2e 68 3e 0a 73 74 72 75 63 74 20 74  time.h>.struct t
fd90: 6d 20 2a 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c  m *__cdecl local
fda0: 74 69 6d 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f  time(const time_
fdb0: 74 20 2a 74 29 0a 7b 0a 20 20 73 74 61 74 69 63  t *t).{.  static
fdc0: 20 73 74 72 75 63 74 20 74 6d 20 79 3b 0a 20 20   struct tm y;.  
fdd0: 46 49 4c 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54  FILETIME uTm, lT
fde0: 6d 3b 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  m;.  SYSTEMTIME 
fdf0: 70 54 6d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  pTm;.  sqlite3_i
fe00: 6e 74 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20  nt64 t64;.  t64 
fe10: 3d 20 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74  = *t;.  t64 = (t
fe20: 36 34 20 2b 20 31 31 36 34 34 34 37 33 36 30 30  64 + 11644473600
fe30: 29 2a 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54  )*10000000;.  uT
fe40: 6d 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20  m.dwLowDateTime 
fe50: 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 26 20  = (DWORD)(t64 & 
fe60: 30 78 46 46 46 46 46 46 46 46 29 3b 0a 20 20 75  0xFFFFFFFF);.  u
fe70: 54 6d 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  Tm.dwHighDateTim
fe80: 65 3d 20 28 44 57 4f 52 44 29 28 74 36 34 20 3e  e= (DWORD)(t64 >
fe90: 3e 20 33 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54  > 32);.  osFileT
fea0: 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69  imeToLocalFileTi
feb0: 6d 65 28 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20  me(&uTm,&lTm);. 
fec0: 20 6f 73 46 69 6c 65 54 69 6d 65 54 6f 53 79 73   osFileTimeToSys
fed0: 74 65 6d 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54  temTime(&lTm,&pT
fee0: 6d 29 3b 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20  m);.  y.tm_year 
fef0: 3d 20 70 54 6d 2e 77 59 65 61 72 20 2d 20 31 39  = pTm.wYear - 19
ff00: 30 30 3b 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d  00;.  y.tm_mon =
ff10: 20 70 54 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b   pTm.wMonth - 1;
ff20: 0a 20 20 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70  .  y.tm_wday = p
ff30: 54 6d 2e 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20  Tm.wDayOfWeek;. 
ff40: 20 79 2e 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d   y.tm_mday = pTm
ff50: 2e 77 44 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f  .wDay;.  y.tm_ho
ff60: 75 72 20 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a  ur = pTm.wHour;.
ff70: 20 20 79 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d    y.tm_min = pTm
ff80: 2e 77 4d 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d  .wMinute;.  y.tm
ff90: 5f 73 65 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f  _sec = pTm.wSeco
ffa0: 6e 64 3b 0a 20 20 72 65 74 75 72 6e 20 26 79 3b  nd;.  return &y;
ffb0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
ffc0: 6e 65 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e  ne HANDLE_TO_WIN
ffd0: 46 49 4c 45 28 61 29 20 28 77 69 6e 46 69 6c 65  FILE(a) (winFile
ffe0: 2a 29 26 28 28 63 68 61 72 2a 29 61 29 5b 2d 28  *)&((char*)a)[-(
fff0: 69 6e 74 29 6f 66 66 73 65 74 6f 66 28 77 69 6e  int)offsetof(win
10000 46 69 6c 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20  File,h)]../*.** 
10010 41 63 71 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f  Acquire a lock o
10020 6e 20 74 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a  n the handle h.*
10030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
10040 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
10050 48 41 4e 44 4c 45 20 68 29 7b 0a 20 20 20 44 57  HANDLE h){.   DW
10060 4f 52 44 20 64 77 45 72 72 3b 0a 20 20 20 64 6f  ORD dwErr;.   do
10070 20 7b 0a 20 20 20 20 20 64 77 45 72 72 20 3d 20   {.     dwErr = 
10080 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f  osWaitForSingleO
10090 62 6a 65 63 74 28 68 2c 20 49 4e 46 49 4e 49 54  bject(h, INFINIT
100a0 45 29 3b 0a 20 20 20 7d 20 77 68 69 6c 65 20 28  E);.   } while (
100b0 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 4f 42  dwErr != WAIT_OB
100c0 4a 45 43 54 5f 30 20 26 26 20 64 77 45 72 72 20  JECT_0 && dwErr 
100d0 21 3d 20 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45  != WAIT_ABANDONE
100e0 44 29 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  D);.}./*.** Rele
100f0 61 73 65 20 61 20 6c 6f 63 6b 20 61 63 71 75 69  ase a lock acqui
10100 72 65 64 20 62 79 20 77 69 6e 63 65 4d 75 74 65  red by winceMute
10110 78 41 63 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64  xAcquire().*/.#d
10120 65 66 69 6e 65 20 77 69 6e 63 65 4d 75 74 65 78  efine winceMutex
10130 52 65 6c 65 61 73 65 28 68 29 20 52 65 6c 65 61  Release(h) Relea
10140 73 65 4d 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a  seMutex(h)../*.*
10150 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 75 74  * Create the mut
10160 65 78 20 61 6e 64 20 73 68 61 72 65 64 20 6d 65  ex and shared me
10170 6d 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c 6f  mory used for lo
10180 63 6b 69 6e 67 20 69 6e 20 74 68 65 20 66 69 6c  cking in the fil
10190 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20  e.** descriptor 
101a0 70 46 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20  pFile.*/.static 
101b0 69 6e 74 20 77 69 6e 63 65 43 72 65 61 74 65 4c  int winceCreateL
101c0 6f 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ock(const char *
101d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69  zFilename, winFi
101e0 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50  le *pFile){.  LP
101f0 57 53 54 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57  WSTR zTok;.  LPW
10200 53 54 52 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f  STR zName;.  DWO
10210 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
10220 42 4f 4f 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46  BOOL bLogged = F
10230 41 4c 53 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e  ALSE;.  BOOL bIn
10240 69 74 20 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e  it = TRUE;..  zN
10250 61 6d 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55  ame = winUtf8ToU
10260 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
10270 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d  );.  if( zName==
10280 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20  0 ){.    /* out 
10290 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20  of memory */.   
102a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
102b0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
102c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .  }..  /* Initi
102d0 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20  alize the local 
102e0 6c 6f 63 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65  lockdata */.  me
102f0 6d 73 65 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63  mset(&pFile->loc
10300 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 46  al, 0, sizeof(pF
10310 69 6c 65 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20  ile->local));.. 
10320 20 2f 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20   /* Replace the 
10330 62 61 63 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d  backslashes from
10340 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e   the filename an
10350 64 20 6c 6f 77 65 72 63 61 73 65 20 69 74 0a 20  d lowercase it. 
10360 20 2a 2a 20 74 6f 20 64 65 72 69 76 65 20 61 20   ** to derive a 
10370 6d 75 74 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20  mutex name. */. 
10380 20 7a 54 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f   zTok = osCharLo
10390 77 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66  werW(zName);.  f
103a0 6f 72 20 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b  or (;*zTok;zTok+
103b0 2b 29 7b 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f  +){.    if (*zTo
103c0 6b 20 3d 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b  k == '\\') *zTok
103d0 20 3d 20 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f   = '_';.  }..  /
103e0 2a 20 43 72 65 61 74 65 2f 6f 70 65 6e 20 74 68  * Create/open th
103f0 65 20 6e 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f  e named mutex */
10400 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  .  pFile->hMutex
10410 20 3d 20 6f 73 43 72 65 61 74 65 4d 75 74 65 78   = osCreateMutex
10420 57 28 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a  W(NULL, FALSE, z
10430 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 21 70 46  Name);.  if (!pF
10440 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
10450 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
10460 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
10470 72 6f 72 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ror();.    sqlit
10480 65 33 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a  e3_free(zName);.
10490 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
104a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
104b0 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
104c0 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
104d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
104e0 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 31 22  inceCreateLock1"
104f0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
10500 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
10510 74 68 65 20 6d 75 74 65 78 20 62 65 66 6f 72 65  the mutex before
10520 20 63 6f 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20   continuing */. 
10530 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75 69   winceMutexAcqui
10540 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  re(pFile->hMutex
10550 29 3b 0a 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74  );..  /* Since t
10560 68 65 20 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65  he names of name
10570 64 20 6d 75 74 65 78 65 73 2c 20 73 65 6d 61 70  d mutexes, semap
10580 68 6f 72 65 73 2c 20 66 69 6c 65 20 6d 61 70 70  hores, file mapp
10590 69 6e 67 73 20 65 74 63 20 61 72 65 0a 20 20 2a  ings etc are.  *
105a0 2a 20 63 61 73 65 2d 73 65 6e 73 69 74 69 76 65  * case-sensitive
105b0 2c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67 65  , take advantage
105c0 20 6f 66 20 74 68 61 74 20 62 79 20 75 70 70 65   of that by uppe
105d0 72 63 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  rcasing the mute
105e0 78 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20  x name.  ** and 
105f0 75 73 69 6e 67 20 74 68 61 74 20 61 73 20 74 68  using that as th
10600 65 20 73 68 61 72 65 64 20 66 69 6c 65 6d 61 70  e shared filemap
10610 70 69 6e 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a  ping name..  */.
10620 20 20 6f 73 43 68 61 72 55 70 70 65 72 57 28 7a    osCharUpperW(z
10630 4e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  Name);.  pFile->
10640 68 53 68 61 72 65 64 20 3d 20 6f 73 43 72 65 61  hShared = osCrea
10650 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 49  teFileMappingW(I
10660 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
10670 4c 55 45 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  LUE, NULL,.     
10680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106a0 20 20 20 50 41 47 45 5f 52 45 41 44 57 52 49 54     PAGE_READWRIT
106b0 45 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e  E, 0, sizeof(win
106c0 63 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  ceLock),.       
106d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106f0 20 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53   zName);..  /* S
10700 65 74 20 61 20 66 6c 61 67 20 74 68 61 74 20 69  et a flag that i
10710 6e 64 69 63 61 74 65 73 20 77 65 27 72 65 20 74  ndicates we're t
10720 68 65 20 66 69 72 73 74 20 74 6f 20 63 72 65 61  he first to crea
10730 74 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f  te the memory so
10740 20 69 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65   it.  ** must be
10750 20 7a 65 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65   zero-initialize
10760 64 20 2a 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f  d */.  lastErrno
10770 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10780 72 28 29 3b 0a 20 20 69 66 20 28 6c 61 73 74 45  r();.  if (lastE
10790 72 72 6e 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c  rrno == ERROR_AL
107a0 52 45 41 44 59 5f 45 58 49 53 54 53 29 7b 0a 20  READY_EXISTS){. 
107b0 20 20 20 62 49 6e 69 74 20 3d 20 46 41 4c 53 45     bInit = FALSE
107c0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
107d0 5f 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20  _free(zName);.. 
107e0 20 2f 2a 20 49 66 20 77 65 20 73 75 63 63 65 65   /* If we succee
107f0 64 65 64 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68  ded in making th
10800 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
10810 68 61 6e 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20  handle, map it. 
10820 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
10830 68 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 70  hShared ){.    p
10840 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 3d 20 28  File->shared = (
10850 77 69 6e 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70  winceLock*)osMap
10860 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
10870 2d 3e 68 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->hShared,.     
10880 20 20 20 20 20 20 20 20 46 49 4c 45 5f 4d 41 50          FILE_MAP
10890 5f 52 45 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57  _READ|FILE_MAP_W
108a0 52 49 54 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65  RITE, 0, 0, size
108b0 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a  of(winceLock));.
108c0 20 20 20 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e      /* If mappin
108d0 67 20 66 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20  g failed, close 
108e0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
108f0 79 20 68 61 6e 64 6c 65 20 61 6e 64 20 65 72 61  y handle and era
10900 73 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66 28  se it */.    if(
10910 20 21 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 20   !pFile->shared 
10920 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
10930 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
10940 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
10950 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
10960 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
10970 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
10980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10990 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
109a0 63 6b 32 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck2", zFilename)
109b0 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
109c0 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 6f 73  = TRUE;.      os
109d0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c  CloseHandle(pFil
109e0 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a 20 20 20  e->hShared);.   
109f0 20 20 20 70 46 69 6c 65 2d 3e 68 53 68 61 72 65     pFile->hShare
10a00 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  d = NULL;.    }.
10a10 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61    }..  /* If sha
10a20 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64  red memory could
10a30 20 6e 6f 74 20 62 65 20 63 72 65 61 74 65 64 2c   not be created,
10a40 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
10a50 6d 75 74 65 78 20 61 6e 64 20 66 61 69 6c 20 2a  mutex and fail *
10a60 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68  /.  if( pFile->h
10a70 53 68 61 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a  Shared==NULL ){.
10a80 20 20 20 20 69 66 28 20 21 62 4c 6f 67 67 65 64      if( !bLogged
10a90 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
10aa0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
10ab0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69  tErrno;.      wi
10ac0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
10ad0 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c  _IOERR, pFile->l
10ae0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
10af0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
10b00 63 65 43 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20  ceCreateLock3", 
10b10 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
10b20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54 52 55 45    bLogged = TRUE
10b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 69 6e 63  ;.    }.    winc
10b40 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
10b50 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
10b60 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
10b70 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10b80 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
10b90 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65  x = NULL;.    re
10ba0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10bb0 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69  R;.  }..  /* Ini
10bc0 74 69 61 6c 69 7a 65 20 74 68 65 20 73 68 61 72  tialize the shar
10bd0 65 64 20 6d 65 6d 6f 72 79 20 69 66 20 77 65 27  ed memory if we'
10be0 72 65 20 73 75 70 70 6f 73 65 64 20 74 6f 20 2a  re supposed to *
10bf0 2f 0a 20 20 69 66 28 20 62 49 6e 69 74 20 29 7b  /.  if( bInit ){
10c00 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 46 69 6c  .    memset(pFil
10c10 65 2d 3e 73 68 61 72 65 64 2c 20 30 2c 20 73 69  e->shared, 0, si
10c20 7a 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29  zeof(winceLock))
10c30 3b 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75  ;.  }..  winceMu
10c40 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
10c50 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74  ->hMutex);.  ret
10c60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10c70 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20  ../*.** Destroy 
10c80 74 68 65 20 70 61 72 74 20 6f 66 20 77 69 6e 46  the part of winF
10c90 69 6c 65 20 74 68 61 74 20 64 65 61 6c 73 20 77  ile that deals w
10ca0 69 74 68 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a  ith wince locks.
10cb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
10cc0 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28  inceDestroyLock(
10cd0 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
10ce0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d  .  if (pFile->hM
10cf0 75 74 65 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63  utex){.    /* Ac
10d00 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
10d10 2a 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65  */.    winceMute
10d20 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10d30 68 4d 75 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a  hMutex);..    /*
10d40 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
10d50 6c 6f 63 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f  locks should pro
10d60 62 61 62 6c 79 20 61 73 73 65 72 74 20 69 6e 20  bably assert in 
10d70 64 65 62 75 67 20 6d 6f 64 65 2c 20 62 75 74 20  debug mode, but 
10d80 74 68 65 79 0a 20 20 20 20 20 20 20 61 72 65 20  they.       are 
10d90 74 6f 20 63 6c 65 61 6e 75 70 20 69 6e 20 63 61  to cleanup in ca
10da0 73 65 20 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d  se any locks rem
10db0 61 69 6e 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20  ained open */.  
10dc0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
10dd0 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a 20 20  al.nReaders){.  
10de0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10df0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
10e00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46      }.    if (pF
10e10 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65  ile->local.bRese
10e20 72 76 65 64 29 7b 0a 20 20 20 20 20 20 70 46 69  rved){.      pFi
10e30 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
10e40 65 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20  erved = FALSE;. 
10e50 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69     }.    if (pFi
10e60 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
10e70 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
10e80 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69  ->shared->bPendi
10e90 6e 67 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ng = FALSE;.    
10ea0 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
10eb0 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
10ec0 65 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e){.      pFile-
10ed0 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
10ee0 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
10ef0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65   }..    /* De-re
10f00 66 65 72 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73  ference and clos
10f10 65 20 6f 75 72 20 63 6f 70 79 20 6f 66 20 74 68  e our copy of th
10f20 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
10f30 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73  handle */.    os
10f40 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  UnmapViewOfFile(
10f50 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a  pFile->shared);.
10f60 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
10f70 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10f80 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20  );..    /* Done 
10f90 77 69 74 68 20 74 68 65 20 6d 75 74 65 78 20 2a  with the mutex *
10fa0 2f 0a 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78  /.    winceMutex
10fb0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
10fc0 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c  Mutex);.    osCl
10fd0 6f 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d  oseHandle(pFile-
10fe0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 70 46  >hMutex);.    pF
10ff0 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55  ile->hMutex = NU
11000 4c 4c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  LL;.  }.}../*.**
11010 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
11020 6f 6e 20 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69  on of the LockFi
11030 6c 65 28 29 20 41 50 49 20 6f 66 20 57 69 6e 64  le() API of Wind
11040 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
11050 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c  atic BOOL winceL
11060 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
11070 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
11080 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
11090 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77 46  Low,.  DWORD dwF
110a0 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a 20  ileOffsetHigh,. 
110b0 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66   DWORD nNumberOf
110c0 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a  BytesToLockLow,.
110d0 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
110e0 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68  fBytesToLockHigh
110f0 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
11100 46 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f  File = HANDLE_TO
11110 5f 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29  _WINFILE(phFile)
11120 3b 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e  ;.  BOOL bReturn
11130 20 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55   = FALSE;..  UNU
11140 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77  SED_PARAMETER(dw
11150 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b  FileOffsetHigh);
11160 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11170 54 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74  TER(nNumberOfByt
11180 65 73 54 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a  esToLockHigh);..
11190 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d    if (!pFile->hM
111a0 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52 55  utex) return TRU
111b0 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41  E;.  winceMutexA
111c0 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d  cquire(pFile->hM
111d0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e  utex);..  /* Wan
111e0 74 69 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76  ting an exclusiv
111f0 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20  e lock? */.  if 
11200 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
11210 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11220 44 5f 46 49 52 53 54 0a 20 20 20 20 20 20 20 26  D_FIRST.       &
11230 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
11240 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  ToLockLow == (DW
11250 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 29  ORD)SHARED_SIZE)
11260 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
11270 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11280 73 20 3d 3d 20 30 20 26 26 20 70 46 69 6c 65 2d  s == 0 && pFile-
11290 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
112a0 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
112b0 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
112c0 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52  >bExclusive = TR
112d0 55 45 3b 0a 20 20 20 20 20 20 20 70 46 69 6c 65  UE;.       pFile
112e0 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
112f0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
11300 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11310 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11320 2a 20 57 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e  * Want a read-on
11330 6c 79 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ly lock? */.  el
11340 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11350 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11360 29 53 48 41 52 45 44 5f 46 49 52 53 54 20 26 26  )SHARED_FIRST &&
11370 0a 20 20 20 20 20 20 20 20 20 20 20 6e 4e 75 6d  .           nNum
11380 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
11390 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
113a0 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
113b0 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20  ->bExclusive == 
113c0 30 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  0){.      pFile-
113d0 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20  >local.nReaders 
113e0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 20 28 70 46  ++;.      if (pF
113f0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
11400 65 72 73 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20  ers == 1){.     
11410 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11420 2d 3e 6e 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20  ->nReaders ++;. 
11430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52 65       }.      bRe
11440 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
11450 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e   }.  }..  /* Wan
11460 74 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  t a pending lock
11470 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
11480 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
11490 3d 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e  == (DWORD)PENDIN
114a0 47 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20  G_BYTE.         
114b0 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79    && nNumberOfBy
114c0 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20  tesToLockLow == 
114d0 31 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  1){.    /* If no
114e0 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61   pending lock ha
114f0 73 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 2c  s been acquired,
11500 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 69 74   then acquire it
11510 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
11520 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50 65 6e 64  e->shared->bPend
11530 69 6e 67 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  ing == 0) {.    
11540 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
11550 3e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55 45  >bPending = TRUE
11560 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
11570 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20  ocal.bPending = 
11580 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65 74  TRUE;.      bRet
11590 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  urn = TRUE;.    
115a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74  }.  }..  /* Want
115b0 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
115c0 3f 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28  ? */.  else if (
115d0 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20  dwFileOffsetLow 
115e0 3d 3d 20 28 44 57 4f 52 44 29 52 45 53 45 52 56  == (DWORD)RESERV
115f0 45 44 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20  ED_BYTE.        
11600 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42     && nNumberOfB
11610 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d  ytesToLockLow ==
11620 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
11630 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73  le->shared->bRes
11640 65 72 76 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20  erved == 0) {.  
11650 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
11660 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 54  d->bReserved = T
11670 52 55 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  RUE;.      pFile
11680 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
11690 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  d = TRUE;.      
116a0 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
116b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e      }.  }..  win
116c0 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
116d0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
116e0 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e 3b   return bReturn;
116f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70  .}../*.** An imp
11700 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
11710 68 65 20 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50  he UnlockFile AP
11720 49 20 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72  I of Windows for
11730 20 43 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f   CE.*/.static BO
11740 4f 4c 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69  OL winceUnlockFi
11750 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70  le(.  LPHANDLE p
11760 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64  hFile,.  DWORD d
11770 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a  wFileOffsetLow,.
11780 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66    DWORD dwFileOf
11790 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52  fsetHigh,.  DWOR
117a0 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
117b0 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  ToUnlockLow,.  D
117c0 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
117d0 74 65 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a  tesToUnlockHigh.
117e0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
117f0 69 6c 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f  ile = HANDLE_TO_
11800 57 49 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b  WINFILE(phFile);
11810 0a 20 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20  .  BOOL bReturn 
11820 3d 20 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53  = FALSE;..  UNUS
11830 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46  ED_PARAMETER(dwF
11840 69 6c 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a  ileOffsetHigh);.
11850 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
11860 45 52 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  ER(nNumberOfByte
11870 73 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a  sToUnlockHigh);.
11880 0a 20 20 69 66 20 28 21 70 46 69 6c 65 2d 3e 68  .  if (!pFile->h
11890 4d 75 74 65 78 29 20 72 65 74 75 72 6e 20 54 52  Mutex) return TR
118a0 55 45 3b 0a 20 20 77 69 6e 63 65 4d 75 74 65 78  UE;.  winceMutex
118b0 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68  Acquire(pFile->h
118c0 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65  Mutex);..  /* Re
118d0 6c 65 61 73 69 6e 67 20 61 20 72 65 61 64 65 72  leasing a reader
118e0 20 6c 6f 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c   lock or an excl
118f0 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
11900 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11910 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11920 41 52 45 44 5f 46 49 52 53 54 29 7b 0a 20 20 20  ARED_FIRST){.   
11930 20 2f 2a 20 44 69 64 20 77 65 20 68 61 76 65 20   /* Did we have 
11940 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
11950 6b 3f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46  k? */.    if (pF
11960 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c  ile->local.bExcl
11970 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20 61 73  usive){.      as
11980 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79  sert(nNumberOfBy
11990 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d  tesToUnlockLow =
119a0 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f  = (DWORD)SHARED_
119b0 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 70 46 69  SIZE);.      pFi
119c0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75  le->local.bExclu
119d0 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
119e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
119f0 64 2d 3e 62 45 78 63 6c 75 73 69 76 65 20 3d 20  d->bExclusive = 
11a00 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
11a10 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
11a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 69 64 20 77   }..    /* Did w
11a30 65 20 6a 75 73 74 20 68 61 76 65 20 61 20 72 65  e just have a re
11a40 61 64 65 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20  ader lock? */.  
11a50 20 20 65 6c 73 65 20 69 66 20 28 70 46 69 6c 65    else if (pFile
11a60 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11a70 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
11a80 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11a90 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57  UnlockLow == (DW
11aa0 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a 45 0a  ORD)SHARED_SIZE.
11ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
11ac0 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
11ad0 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b  UnlockLow == 1);
11ae0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
11af0 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b  cal.nReaders --;
11b00 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
11b10 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11b20 20 3d 3d 20 30 29 0a 20 20 20 20 20 20 7b 0a 20   == 0).      {. 
11b30 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68         pFile->sh
11b40 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d  ared->nReaders -
11b50 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
11b60 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
11b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
11b80 20 52 65 6c 65 61 73 69 6e 67 20 61 20 70 65 6e   Releasing a pen
11b90 64 69 6e 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65  ding lock */.  e
11ba0 6c 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66  lse if (dwFileOf
11bb0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11bc0 44 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20  D)PENDING_BYTE. 
11bd0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11be0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11bf0 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11c00 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
11c10 61 6c 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20  al.bPending){.  
11c20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
11c30 2e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  .bPending = FALS
11c40 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
11c50 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11c60 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11c70 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a  bReturn = TRUE;.
11c80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52      }.  }.  /* R
11c90 65 6c 65 61 73 69 6e 67 20 61 20 72 65 73 65 72  eleasing a reser
11ca0 76 65 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c  ved lock */.  el
11cb0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11cc0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11cd0 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
11ce0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
11cf0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
11d00 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20  ockLow == 1){.  
11d10 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63    if (pFile->loc
11d20 61 6c 2e 62 52 65 73 65 72 76 65 64 29 20 7b 0a  al.bReserved) {.
11d30 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63        pFile->loc
11d40 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d 20 46  al.bReserved = F
11d50 41 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c  ALSE;.      pFil
11d60 65 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65  e->shared->bRese
11d70 72 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  rved = FALSE;.  
11d80 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11d90 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11da0 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61   winceMutexRelea
11db0 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78  se(pFile->hMutex
11dc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65 74  );.  return bRet
11dd0 75 72 6e 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64  urn;.}./*.** End
11de0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
11df0 63 6f 64 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a  code for wince.*
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65  ************/.#e
11e50 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
11e60 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a  S_WINCE */../*.*
11e70 2a 20 4c 6f 63 6b 20 61 20 66 69 6c 65 20 72 65  * Lock a file re
11e80 67 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  gion..*/.static 
11e90 42 4f 4f 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  BOOL winLockFile
11ea0 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
11eb0 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61  ile,.  DWORD fla
11ec0 67 73 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  gs,.  DWORD offs
11ed0 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f  etLow,.  DWORD o
11ee0 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f  ffsetHigh,.  DWO
11ef0 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a  RD numBytesLow,.
11f00 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73    DWORD numBytes
11f10 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49  High.){.#if SQLI
11f20 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a  TE_OS_WINCE.  /*
11f30 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64  .  ** NOTE: Wind
11f40 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
11f50 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
11f60 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
11f70 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a  of the Win32.  *
11f80 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b  *       API Lock
11f90 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
11fa0 75 72 6e 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c  urn winceLockFil
11fb0 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  e(phFile, offset
11fc0 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
11fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11fe0 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73          numBytes
11ff0 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67  Low, numBytesHig
12000 68 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  h);.#else.  if( 
12010 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
12020 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
12030 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c  .    memset(&ovl
12040 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  p, 0, sizeof(OVE
12050 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
12060 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66  vlp.Offset = off
12070 73 65 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70  setLow;.    ovlp
12080 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66  .OffsetHigh = of
12090 66 73 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65  fsetHigh;.    re
120a0 74 75 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45  turn osLockFileE
120b0 78 28 2a 70 68 46 69 6c 65 2c 20 66 6c 61 67 73  x(*phFile, flags
120c0 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77  , 0, numBytesLow
120d0 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20  , numBytesHigh, 
120e0 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  &ovlp);.  }else{
120f0 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
12100 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20  ckFile(*phFile, 
12110 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
12120 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c  tHigh, numBytesL
12130 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ow,.            
12140 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42 79 74            numByt
12150 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e  esHigh);.  }.#en
12160 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c  dif.}../*.** Unl
12170 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
12180 6e 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n.. */.static BO
12190 4f 4c 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65  OL winUnlockFile
121a0 28 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46  (.  LPHANDLE phF
121b0 69 6c 65 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  ile,.  DWORD off
121c0 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  setLow,.  DWORD 
121d0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  offsetHigh,.  DW
121e0 4f 52 44 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  ORD numBytesLow,
121f0 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
12200 73 48 69 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c  sHigh.){.#if SQL
12210 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f  ITE_OS_WINCE.  /
12220 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e  *.  ** NOTE: Win
12230 64 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c  dows CE is handl
12240 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68  ed differently h
12250 65 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b  ere due its lack
12260 20 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20   of the Win32.  
12270 2a 2a 20 20 20 20 20 20 20 41 50 49 20 55 6e 6c  **       API Unl
12280 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ockFile..  */.  
12290 72 65 74 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f  return winceUnlo
122a0 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f  ckFile(phFile, o
122b0 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74  ffsetLow, offset
122c0 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20 20  High,.          
122d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
122e0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
122f0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
12300 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
12310 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
12320 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
12330 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
12340 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
12350 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12360 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
12370 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
12380 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
12390 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e  .    return osUn
123a0 6c 6f 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69  lockFileEx(*phFi
123b0 6c 65 2c 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c  le, 0, numBytesL
123c0 6f 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68  ow, numBytesHigh
123d0 2c 20 26 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73  , &ovlp);.  }els
123e0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73  e{.    return os
123f0 55 6e 6c 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69  UnlockFile(*phFi
12400 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f  le, offsetLow, o
12410 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d 42 79  ffsetHigh, numBy
12420 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20  tesLow,.        
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
12450 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a   }.#endif.}../**
12460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54  ***********.** T
124b0 68 65 20 6e 65 78 74 20 67 72 6f 75 70 20 6f 66  he next group of
124c0 20 72 6f 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d   routines implem
124d0 65 6e 74 20 74 68 65 20 49 2f 4f 20 6d 65 74 68  ent the I/O meth
124e0 6f 64 73 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ods specified.**
124f0 20 62 79 20 74 68 65 20 73 71 6c 69 74 65 33 5f   by the sqlite3_
12500 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
12510 74 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  t..*************
12520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12560 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d  */../*.** Some M
12570 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65  icrosoft compile
12580 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64 65 66  rs lack this def
12590 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  inition..*/.#ifn
125a0 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f  def INVALID_SET_
125b0 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64  FILE_POINTER.# d
125c0 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45  efine INVALID_SE
125d0 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28  T_FILE_POINTER (
125e0 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69  (DWORD)-1).#endi
125f0 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  f../*.** Move th
12600 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
12610 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 68  on of the file h
12620 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61 73 20  andle passed as 
12630 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
12640 75 6d 65 6e 74 20 74 6f 20 6f 66 66 73 65 74 20  ument to offset 
12650 69 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74  iOffset within t
12660 68 65 20 66 69 6c 65 2e 20 49 66 20 73 75 63 63  he file. If succ
12670 65 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 20 30  essful, return 0
12680 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  ..** Otherwise, 
12690 73 65 74 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  set pFile->lastE
126a0 72 72 6e 6f 20 61 6e 64 20 72 65 74 75 72 6e 20  rrno and return 
126b0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
126c0 74 69 63 20 69 6e 74 20 77 69 6e 53 65 65 6b 46  tic int winSeekF
126d0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
126e0 6c 65 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  le, sqlite3_int6
126f0 34 20 69 4f 66 66 73 65 74 29 7b 0a 23 69 66 20  4 iOffset){.#if 
12700 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
12710 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
12720 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
12730 20 20 20 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20     /* Most sig. 
12740 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
12750 66 66 73 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20  ffset */.  LONG 
12760 6c 6f 77 65 72 42 69 74 73 3b 20 20 20 20 20 20  lowerBits;      
12770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
12780 61 73 74 20 73 69 67 2e 20 33 32 20 62 69 74 73  ast sig. 32 bits
12790 20 6f 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a   of new offset *
127a0 2f 0a 20 20 44 57 4f 52 44 20 64 77 52 65 74 3b  /.  DWORD dwRet;
127b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127c0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
127d0 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
127e0 50 6f 69 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44  Pointer() */.  D
127f0 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20  WORD lastErrno; 
12800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12810 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64  * Value returned
12820 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72   by GetLastError
12830 28 29 20 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45  () */..  OSTRACE
12840 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c  (("SEEK file=%p,
12850 20 6f 66 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c   offset=%lld\n",
12860 20 70 46 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73   pFile->h, iOffs
12870 65 74 29 29 3b 0a 0a 20 20 75 70 70 65 72 42 69  et));..  upperBi
12880 74 73 20 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66  ts = (LONG)((iOf
12890 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
128a0 66 66 66 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72  ffffff);.  lower
128b0 42 69 74 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f  Bits = (LONG)(iO
128c0 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
128d0 66 66 29 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f  ff);..  /* API o
128e0 64 64 69 74 79 3a 20 49 66 20 73 75 63 63 65 73  ddity: If succes
128f0 73 66 75 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69  sful, SetFilePoi
12900 6e 74 65 72 28 29 20 72 65 74 75 72 6e 73 20 61  nter() returns a
12910 20 64 77 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74   dword.  ** cont
12920 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 77 65 72  aining the lower
12930 20 33 32 2d 62 69 74 73 20 6f 66 20 74 68 65 20   32-bits of the 
12940 6e 65 77 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e  new file-offset.
12950 20 4f 72 2c 20 69 66 20 69 74 20 66 61 69 6c 73   Or, if it fails
12960 2c 0a 20 20 2a 2a 20 69 74 20 72 65 74 75 72 6e  ,.  ** it return
12970 73 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  s INVALID_SET_FI
12980 4c 45 5f 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65  LE_POINTER. Howe
12990 76 65 72 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ver according to
129a0 20 4d 53 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41   MSDN,.  ** INVA
129b0 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
129c0 4e 54 45 52 20 6d 61 79 20 61 6c 73 6f 20 62 65  NTER may also be
129d0 20 61 20 76 61 6c 69 64 20 6e 65 77 20 6f 66 66   a valid new off
129e0 73 65 74 2e 20 53 6f 20 74 6f 20 64 65 74 65 72  set. So to deter
129f0 6d 69 6e 65 0a 20 20 2a 2a 20 77 68 65 74 68 65  mine.  ** whethe
12a00 72 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  r an error has a
12a10 63 74 75 61 6c 6c 79 20 6f 63 63 75 72 72 65 64  ctually occurred
12a20 2c 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 65 63  , it is also nec
12a30 65 73 73 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20  essary to call. 
12a40 20 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72   ** GetLastError
12a50 28 29 2e 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74  ()..  */.  dwRet
12a60 20 3d 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e   = osSetFilePoin
12a70 74 65 72 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f  ter(pFile->h, lo
12a80 77 65 72 42 69 74 73 2c 20 26 75 70 70 65 72 42  werBits, &upperB
12a90 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29  its, FILE_BEGIN)
12aa0 3b 0a 0a 20 20 69 66 28 20 28 64 77 52 65 74 3d  ;..  if( (dwRet=
12ab0 3d 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c  =INVALID_SET_FIL
12ac0 45 5f 50 4f 49 4e 54 45 52 0a 20 20 20 20 20 20  E_POINTER.      
12ad0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
12ae0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
12af0 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29  ))!=NO_ERROR)) )
12b00 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
12b10 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
12b20 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72  no;.    winLogEr
12b30 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
12b40 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61  _SEEK, pFile->la
12b50 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
12b60 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 65 65           "winSee
12b70 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  kFile", pFile->z
12b80 50 61 74 68 29 3b 0a 20 20 20 20 4f 53 54 52 41  Path);.    OSTRA
12b90 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25  CE(("SEEK file=%
12ba0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
12bb0 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c  RR_SEEK\n", pFil
12bc0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75  e->h));.    retu
12bd0 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54  rn 1;.  }..  OST
12be0 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c 65  RACE(("SEEK file
12bf0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
12c00 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
12c10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  ;.  return 0;.#e
12c20 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61  lse.  /*.  ** Sa
12c30 6d 65 20 61 73 20 61 62 6f 76 65 2c 20 65 78 63  me as above, exc
12c40 65 70 74 20 74 68 61 74 20 74 68 69 73 20 69 6d  ept that this im
12c50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72  plementation wor
12c60 6b 73 20 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20  ks for WinRT..  
12c70 2a 2f 0a 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45  */..  LARGE_INTE
12c80 47 45 52 20 78 3b 20 20 20 20 20 20 20 20 20 20  GER x;          
12c90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77        /* The new
12ca0 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f   offset */.  BOO
12cb0 4c 20 62 52 65 74 3b 20 20 20 20 20 20 20 20 20  L bRet;         
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12cd0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12ce0 79 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  y SetFilePointer
12cf0 45 78 28 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61  Ex() */..  x.Qua
12d00 64 50 61 72 74 20 3d 20 69 4f 66 66 73 65 74 3b  dPart = iOffset;
12d10 0a 20 20 62 52 65 74 20 3d 20 6f 73 53 65 74 46  .  bRet = osSetF
12d20 69 6c 65 50 6f 69 6e 74 65 72 45 78 28 70 46 69  ilePointerEx(pFi
12d30 6c 65 2d 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c  le->h, x, 0, FIL
12d40 45 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28  E_BEGIN);..  if(
12d50 21 62 52 65 74 29 7b 0a 20 20 20 20 70 46 69 6c  !bRet){.    pFil
12d60 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f  e->lastErrno = o
12d70 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
12d80 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
12d90 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
12da0 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
12db0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
12dc0 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
12dd0 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
12de0 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
12df0 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
12e00 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
12e10 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
12e20 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
12e30 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
12e40 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
12e50 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
12e60 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12e70 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
12e80 66 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.}..#if SQLITE_
12e90 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
12ea0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
12eb0 65 6e 63 65 73 20 74 6f 20 56 46 53 20 68 65 6c  ences to VFS hel
12ec0 70 65 72 20 6d 65 74 68 6f 64 73 20 75 73 65 64  per methods used
12ed0 20 66 6f 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70   for memory mapp
12ee0 65 64 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ed files */.stat
12ef0 69 63 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c  ic int winMapfil
12f00 65 28 77 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69  e(winFile*, sqli
12f10 74 65 33 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74  te3_int64);.stat
12f20 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
12f30 69 6c 65 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23  ile(winFile*);.#
12f40 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  endif../*.** Clo
12f50 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  se a file..**.**
12f60 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
12f70 74 68 61 74 20 61 6e 20 61 74 74 65 6d 70 74 20  that an attempt 
12f80 74 6f 20 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c  to close a handl
12f90 65 20 6d 69 67 68 74 20 73 6f 6d 65 74 69 6d 65  e might sometime
12fa0 73 0a 2a 2a 20 66 61 69 6c 2e 20 20 54 68 69 73  s.** fail.  This
12fb0 20 69 73 20 61 20 76 65 72 79 20 75 6e 72 65 61   is a very unrea
12fc0 73 6f 6e 61 62 6c 65 20 72 65 73 75 6c 74 2c 20  sonable result, 
12fd0 62 75 74 20 57 69 6e 64 6f 77 73 20 69 73 20 6e  but Windows is n
12fe0 6f 74 6f 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20  otorious.** for 
12ff0 62 65 69 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62  being unreasonab
13000 6c 65 20 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64  le so I do not d
13010 6f 75 62 74 20 74 68 61 74 20 69 74 20 6d 69 67  oubt that it mig
13020 68 74 20 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a  ht happen.  If.*
13030 2a 20 74 68 65 20 63 6c 6f 73 65 20 66 61 69 6c  * the close fail
13040 73 2c 20 77 65 20 70 61 75 73 65 20 66 6f 72 20  s, we pause for 
13050 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  100 milliseconds
13060 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 2e 20   and try again. 
13070 20 41 73 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d   As.** many as M
13080 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
13090 61 74 74 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73  attempts to clos
130a0 65 20 74 68 65 20 68 61 6e 64 6c 65 20 61 72 65  e the handle are
130b0 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20   made before.** 
130c0 67 69 76 69 6e 67 20 75 70 20 61 6e 64 20 72 65  giving up and re
130d0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
130e0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f  ..*/.#define MX_
130f0 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 33 0a  CLOSE_ATTEMPT 3.
13100 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 6c  static int winCl
13110 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13120 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c   *id){.  int rc,
13130 20 63 6e 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46   cnt = 0;.  winF
13140 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13150 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  nFile*)id;..  as
13160 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 23  sert( id!=0 );.#
13170 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13180 49 54 5f 57 41 4c 0a 20 20 61 73 73 65 72 74 28  IT_WAL.  assert(
13190 20 70 46 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20   pFile->pShm==0 
131a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
131b0 72 74 28 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55  rt( pFile->h!=NU
131c0 4c 4c 20 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d  LL && pFile->h!=
131d0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
131e0 41 4c 55 45 20 29 3b 0a 20 20 4f 53 54 52 41 43  ALUE );.  OSTRAC
131f0 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c  E(("CLOSE pid=%l
13200 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
13210 65 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20  e=%p\n",.       
13220 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
13230 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
13240 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
13250 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13260 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
13270 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  nUnmapfile(pFile
13280 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b  );.#endif..  do{
13290 0a 20 20 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73  .    rc = osClos
132a0 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
132b0 29 3b 0a 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61  );.    /* Simula
132c0 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b  teIOError( rc=0;
132d0 20 63 6e 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54   cnt=MX_CLOSE_AT
132e0 54 45 4d 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d  TEMPT; ); */.  }
132f0 77 68 69 6c 65 28 20 72 63 3d 3d 30 20 26 26 20  while( rc==0 && 
13300 2b 2b 63 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45  ++cnt < MX_CLOSE
13310 5f 41 54 54 45 4d 50 54 20 26 26 20 28 73 71 6c  _ATTEMPT && (sql
13320 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
13330 28 31 30 30 29 2c 20 31 29 20 29 3b 0a 23 69 66  (100), 1) );.#if
13340 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
13350 0a 23 64 65 66 69 6e 65 20 57 49 4e 43 45 5f 44  .#define WINCE_D
13360 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
13370 20 33 0a 20 20 77 69 6e 63 65 44 65 73 74 72 6f   3.  winceDestro
13380 79 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  yLock(pFile);.  
13390 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65  if( pFile->zDele
133a0 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20  teOnClose ){.   
133b0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
133c0 20 20 77 68 69 6c 65 28 0a 20 20 20 20 20 20 20    while(.       
133d0 20 20 20 20 6f 73 44 65 6c 65 74 65 46 69 6c 65      osDeleteFile
133e0 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
133f0 4f 6e 43 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20  OnClose)==0.    
13400 20 20 20 20 26 26 20 6f 73 47 65 74 46 69 6c 65      && osGetFile
13410 41 74 74 72 69 62 75 74 65 73 57 28 70 46 69 6c  AttributesW(pFil
13420 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73  e->zDeleteOnClos
13430 65 29 21 3d 30 78 66 66 66 66 66 66 66 66 0a 20  e)!=0xffffffff. 
13440 20 20 20 20 20 20 20 26 26 20 63 6e 74 2b 2b 20         && cnt++ 
13450 3c 20 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e  < WINCE_DELETION
13460 5f 41 54 54 45 4d 50 54 53 0a 20 20 20 20 29 7b  _ATTEMPTS.    ){
13470 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
13480 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30 30 29  win32_sleep(100)
13490 3b 20 20 2f 2a 20 57 61 69 74 20 61 20 6c 69 74  ;  /* Wait a lit
134a0 74 6c 65 20 62 65 66 6f 72 65 20 74 72 79 69 6e  tle before tryin
134b0 67 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d  g again */.    }
134c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
134d0 65 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  e(pFile->zDelete
134e0 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65  OnClose);.  }.#e
134f0 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 29 7b  ndif.  if( rc ){
13500 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  .    pFile->h = 
13510 4e 55 4c 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e  NULL;.  }.  Open
13520 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f  Counter(-1);.  O
13530 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 70  STRACE(("CLOSE p
13540 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
13550 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  , file=%p, rc=%s
13560 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
13570 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
13580 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
13590 70 46 69 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22  pFile->h, rc ? "
135a0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
135b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20  ;.  return rc ? 
135c0 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
135d0 20 20 20 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72        : winLogEr
135e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
135f0 5f 43 4c 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73  _CLOSE, osGetLas
13600 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
13610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13620 20 20 20 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20      "winClose", 
13630 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d  pFile->zPath);.}
13640 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
13650 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
13660 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
13670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
13680 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
13690 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
136a0 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
136b0 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
136c0 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
136d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
136e0 77 69 6e 52 65 61 64 28 0a 20 20 73 71 6c 69 74  winRead(.  sqlit
136f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
13700 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
13710 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
13720 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
13730 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
13740 69 74 65 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ite content into
13750 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
13760 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
13770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13780 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
13790 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c  to read */.  sql
137a0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
137b0 74 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e  t       /* Begin
137c0 20 72 65 61 64 69 6e 67 20 61 74 20 74 68 69 73   reading at this
137d0 20 6f 66 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69   offset */.){.#i
137e0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
137f0 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
13800 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
13810 56 45 52 4c 41 50 50 45 44 29 0a 20 20 4f 56 45  VERLAPPED).  OVE
13820 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70 70  RLAPPED overlapp
13830 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
13840 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 52  The offset for R
13850 65 61 64 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  eadFile. */.#end
13860 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  if.  winFile *pF
13870 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
13880 69 64 3b 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e  id;  /* file han
13890 64 6c 65 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e  dle */.  DWORD n
138a0 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  Read;           
138b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
138c0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
138d0 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 66  ally read from f
138e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ile */.  int nRe
138f0 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
13900 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
13910 65 72 20 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a  er of retrys */.
13920 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
13930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
13940 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
13950 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20   offset>=0 );.  
13960 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
13980 45 52 52 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54  ERR_READ);.  OST
13990 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
139a0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
139b0 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d 25  ile=%p, buffer=%
139c0 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a  p, amount=%d, ".
139d0 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 66 73             "offs
139e0 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  et=%lld, lock=%d
139f0 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e  \n", osGetCurren
13a00 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
13a10 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ile,.           
13a20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20  pFile->h, pBuf, 
13a30 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46 69  amt, offset, pFi
13a40 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  le->locktype));.
13a50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
13a60 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
13a70 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
13a80 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
13a90 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
13aa0 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
13ab0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
13ac0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
13ad0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
13ae0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
13af0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
13b00 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
13b10 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
13b20 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
13b30 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
13b40 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
13b50 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
13b60 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
13b70 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
13b80 22 52 45 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25  "READ-MMAP pid=%
13b90 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
13ba0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
13bb0 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  _OK\n",.        
13bc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13bd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13be0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
13bf0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
13c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13c20 6e 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46  nCopy = (int)(pF
13c30 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
13c40 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d  offset);.      m
13c50 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
13c60 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
13c70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
13c80 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
13c90 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
13ca0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
13cb0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
13cc0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
13cd0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
13ce0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
13cf0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c  LITE_OS_WINCE ||
13d00 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13d10 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
13d20 50 45 44 29 0a 20 20 69 66 28 20 77 69 6e 53 65  PED).  if( winSe
13d30 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
13d40 66 73 65 74 29 20 29 7b 0a 20 20 20 20 4f 53 54  fset) ){.    OST
13d50 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
13d60 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13d70 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13d80 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20  E_FULL\n",.     
13d90 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
13da0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
13db0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
13dc0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
13dd0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a  QLITE_FULL;.  }.
13de0 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65 61 64    while( !osRead
13df0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70  File(pFile->h, p
13e00 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64  Buf, amt, &nRead
13e10 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20  , 0) ){.#else.  
13e20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
13e30 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
13e40 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 6f 76  ERLAPPED));.  ov
13e50 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 20  erlapped.Offset 
13e60 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20  = (LONG)(offset 
13e70 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  & 0xffffffff);. 
13e80 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73   overlapped.Offs
13e90 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28  etHigh = (LONG)(
13ea0 28 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30  (offset>>32) & 0
13eb0 78 37 66 66 66 66 66 66 66 29 3b 0a 20 20 77 68  x7fffffff);.  wh
13ec0 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c 65  ile( !osReadFile
13ed0 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c  (pFile->h, pBuf,
13ee0 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f   amt, &nRead, &o
13ef0 76 65 72 6c 61 70 70 65 64 29 20 26 26 0a 20 20  verlapped) &&.  
13f00 20 20 20 20 20 20 20 6f 73 47 65 74 4c 61 73 74         osGetLast
13f10 45 72 72 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48  Error()!=ERROR_H
13f20 41 4e 44 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e  ANDLE_EOF ){.#en
13f30 64 69 66 0a 20 20 20 20 44 57 4f 52 44 20 6c 61  dif.    DWORD la
13f40 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  stErrno;.    if(
13f50 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
13f60 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72 72  nRetry, &lastErr
13f70 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  no) ) continue;.
13f80 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
13f90 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
13fa0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
13fb0 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46  READ pid=%lu, pF
13fc0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
13fd0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
13fe0 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20  _READ\n",.      
13ff0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
14000 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
14010 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
14020 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69  );.    return wi
14030 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
14040 5f 49 4f 45 52 52 5f 52 45 41 44 2c 20 70 46 69  _IOERR_READ, pFi
14050 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
14060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14070 20 20 20 20 20 20 22 77 69 6e 52 65 61 64 22 2c        "winRead",
14080 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
14090 20 20 7d 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72    }.  winLogIoer
140a0 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45  r(nRetry, __LINE
140b0 5f 5f 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64  __);.  if( nRead
140c0 3c 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20  <(DWORD)amt ){. 
140d0 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
140e0 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
140f0 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
14100 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
14110 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
14120 29 5b 6e 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74  )[nRead], 0, amt
14130 2d 6e 52 65 61 64 29 3b 0a 20 20 20 20 4f 53 54  -nRead);.    OST
14140 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
14150 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
14160 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
14170 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
14180 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AD\n",.         
14190 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
141a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
141b0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
141c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
141d0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
141e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  AD;.  }..  OSTRA
141f0 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c  CE(("READ pid=%l
14200 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
14210 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14220 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
14230 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
14240 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
14250 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
14260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
14280 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
14290 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e  fer into a file.
142a0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
142b0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a  OK on success.**
142c0 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65   or some other e
142d0 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69  rror code on fai
142e0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
142f0 69 6e 74 20 77 69 6e 57 72 69 74 65 28 0a 20 20  int winWrite(.  
14300 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14320 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72 69 74 65  /* File to write
14330 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   into */.  const
14340 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
14350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14360 65 20 62 79 74 65 73 20 74 6f 20 62 65 20 77 72  e bytes to be wr
14370 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61  itten */.  int a
14380 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
14390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
143a0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
143b0 20 77 72 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69   write */.  sqli
143c0 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
143d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
143e0 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 66  ffset into the f
143f0 69 6c 65 20 74 6f 20 62 65 67 69 6e 20 77 72 69  ile to begin wri
14400 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20  ting at */.){.  
14410 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14430 2f 2a 20 54 72 75 65 20 69 66 20 65 72 72 6f 72  /* True if error
14440 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 65   has occurred, e
14450 6c 73 65 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77  lse false */.  w
14460 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
14470 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
14480 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f  * File handle */
14490 0a 20 20 69 6e 74 20 6e 52 65 74 72 79 20 3d 20  .  int nRetry = 
144a0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
144b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
144c0 72 65 74 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73  retries */..  as
144d0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20  sert( amt>0 );. 
144e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
144f0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
14500 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
14510 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a  E_IOERR_WRITE);.
14520 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
14530 6c 6c 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53  llError(return S
14540 51 4c 49 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20  QLITE_FULL);..  
14550 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
14560 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14570 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75 66 66  p, file=%p, buff
14580 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64  er=%p, amount=%d
14590 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 22  , ".           "
145a0 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63  offset=%lld, loc
145b0 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75  k=%d\n", osGetCu
145c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
145d0 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  , pFile,.       
145e0 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42      pFile->h, pB
145f0 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c  uf, amt, offset,
14600 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
14610 29 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ));..#if defined
14620 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41  (SQLITE_MMAP_REA
14630 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54  DWRITE) && SQLIT
14640 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14650 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
14660 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
14670 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
14680 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
14690 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
146a0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
146b0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
146c0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
146d0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
146e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
146f0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
14700 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
14710 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
14720 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
14730 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
14740 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
14750 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
14760 54 52 41 43 45 28 28 22 57 52 49 54 45 2d 4d 4d  TRACE(("WRITE-MM
14770 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AP pid=%lu, pFil
14780 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
14790 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
147b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
147c0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
147d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
147e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
147f0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
14800 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
14810 28 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61  (int)(pFile->mma
14820 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b  pSize - offset);
14830 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
14840 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
14850 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
14860 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
14870 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
14880 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
14890 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
148a0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
148b0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
148c0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
148d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
148e0 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64  WINCE || defined
148f0 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
14900 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 72  _OVERLAPPED).  r
14910 63 20 3d 20 77 69 6e 53 65 65 6b 46 69 6c 65 28  c = winSeekFile(
14920 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a  pFile, offset);.
14930 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23    if( rc==0 ){.#
14940 65 6c 73 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a  else.  {.#endif.
14950 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
14960 49 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64  INCE && !defined
14970 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f  (SQLITE_WIN32_NO
14980 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20  _OVERLAPPED).   
14990 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 65 72   OVERLAPPED over
149a0 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20 20 2f  lapped;        /
149b0 2a 20 54 68 65 20 6f 66 66 73 65 74 20 66 6f 72  * The offset for
149c0 20 57 72 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23   WriteFile. */.#
149d0 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 61 52  endif.    u8 *aR
149e0 65 6d 20 3d 20 28 75 38 20 2a 29 70 42 75 66 3b  em = (u8 *)pBuf;
149f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
14a00 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
14a10 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  n */.    int nRe
14a20 6d 20 3d 20 61 6d 74 3b 20 20 20 20 20 20 20 20  m = amt;        
14a30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
14a40 20 6f 66 20 62 79 74 65 73 20 79 65 74 20 74 6f   of bytes yet to
14a50 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
14a60 20 20 20 44 57 4f 52 44 20 6e 57 72 69 74 65 3b     DWORD nWrite;
14a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a80 20 2f 2a 20 42 79 74 65 73 20 77 72 69 74 74 65   /* Bytes writte
14a90 6e 20 62 79 20 65 61 63 68 20 57 72 69 74 65 46  n by each WriteF
14aa0 69 6c 65 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20  ile() call */.  
14ab0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
14ac0 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20  o = NO_ERROR;   
14ad0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
14ae0 64 20 62 79 20 47 65 74 4c 61 73 74 45 72 72 6f  d by GetLastErro
14af0 72 28 29 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  r() */..#if !SQL
14b00 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
14b10 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14b20 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50  WIN32_NO_OVERLAP
14b30 50 45 44 29 0a 20 20 20 20 6d 65 6d 73 65 74 28  PED).    memset(
14b40 26 6f 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20  &overlapped, 0, 
14b50 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45  sizeof(OVERLAPPE
14b60 44 29 29 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70  D));.    overlap
14b70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
14b80 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
14b90 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 6f 76  fffffff);.    ov
14ba0 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
14bb0 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
14bc0 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
14bd0 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a  ffffff);.#endif.
14be0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  .    while( nRem
14bf0 3e 30 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  >0 ){.#if SQLITE
14c00 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66  _OS_WINCE || def
14c10 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14c20 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14c30 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72  .      if( !osWr
14c40 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  iteFile(pFile->h
14c50 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e  , aRem, nRem, &n
14c60 57 72 69 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c  Write, 0) ){.#el
14c70 73 65 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73  se.      if( !os
14c80 57 72 69 74 65 46 69 6c 65 28 70 46 69 6c 65 2d  WriteFile(pFile-
14c90 3e 68 2c 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20  >h, aRem, nRem, 
14ca0 26 6e 57 72 69 74 65 2c 20 26 6f 76 65 72 6c 61  &nWrite, &overla
14cb0 70 70 65 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a  pped) ){.#endif.
14cc0 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e 52          if( winR
14cd0 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65 74 72  etryIoerr(&nRetr
14ce0 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  y, &lastErrno) )
14cf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
14d00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14d10 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
14d20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72  nWrite==0 || nWr
14d30 69 74 65 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d  ite<=(DWORD)nRem
14d40 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 57   );.      if( nW
14d50 72 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74  rite==0 || nWrit
14d60 65 3e 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b  e>(DWORD)nRem ){
14d70 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
14d80 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
14d90 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
14da0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
14db0 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
14dc0 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
14dd0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
14de0 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 20  VERLAPPED).     
14df0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 57 72 69 74   offset += nWrit
14e00 65 3b 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70  e;.      overlap
14e10 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f  ped.Offset = (LO
14e20 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30 78 66  NG)(offset & 0xf
14e30 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20  fffffff);.      
14e40 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
14e50 74 48 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28  tHigh = (LONG)((
14e60 6f 66 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78  offset>>32) & 0x
14e70 37 66 66 66 66 66 66 66 29 3b 0a 23 65 6e 64 69  7fffffff);.#endi
14e80 66 0a 20 20 20 20 20 20 61 52 65 6d 20 2b 3d 20  f.      aRem += 
14e90 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6e 52  nWrite;.      nR
14ea0 65 6d 20 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em -= nWrite;.  
14eb0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 6d    }.    if( nRem
14ec0 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  >0 ){.      pFil
14ed0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
14ee0 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  astErrno;.      
14ef0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
14f00 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  }..  if( rc ){. 
14f10 20 20 20 69 66 28 20 20 20 28 20 70 46 69 6c 65     if(   ( pFile
14f20 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ->lastErrno==ERR
14f30 4f 52 5f 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46  OR_HANDLE_DISK_F
14f40 55 4c 4c 20 29 0a 20 20 20 20 20 20 20 7c 7c 20  ULL ).       || 
14f50 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
14f60 6e 6f 3d 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46  no==ERROR_DISK_F
14f70 55 4c 4c 20 29 29 7b 0a 20 20 20 20 20 20 4f 53  ULL )){.      OS
14f80 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69  TRACE(("WRITE pi
14f90 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
14fa0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
14fb0 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ITE_FULL\n",.   
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
14fd0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
14fe0 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
14ff0 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
15000 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
15010 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46  (SQLITE_FULL, pF
15020 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
15050 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te1", pFile->zPa
15060 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f  th);.    }.    O
15070 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20 70  STRACE(("WRITE p
15080 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
15090 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
150a0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
150b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
150c0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
150d0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
150e0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
150f0 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
15100 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
15110 52 5f 57 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e  R_WRITE, pFile->
15120 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
15130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15140 20 20 22 77 69 6e 57 72 69 74 65 32 22 2c 20 70    "winWrite2", p
15150 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
15160 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
15170 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20 5f  gIoerr(nRetry, _
15180 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20  _LINE__);.  }.  
15190 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
151a0 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
151b0 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
151c0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
151d0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
151e0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
151f0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15200 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
15210 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15220 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
15230 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
15240 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74  ified size.*/.st
15250 61 74 69 63 20 69 6e 74 20 77 69 6e 54 72 75 6e  atic int winTrun
15260 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
15270 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
15280 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 77  nt64 nByte){.  w
15290 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  inFile *pFile = 
152a0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f  (winFile*)id;  /
152b0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62  * File handle ob
152c0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ject */.  int rc
152d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
152e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
152f0 75 72 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 69  urn code for thi
15300 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
15310 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b  DWORD lastErrno;
15320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15330 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  e );.  SimulateI
15340 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
15350 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
15360 41 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ATE);.  OSTRACE(
15370 28 22 54 52 55 4e 43 41 54 45 20 70 69 64 3d 25  ("TRUNCATE pid=%
15380 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15390 6c 65 3d 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64  le=%p, size=%lld
153a0 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20  , lock=%d\n",.  
153b0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
153c0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
153d0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
153e0 68 2c 20 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d  h, nByte, pFile-
153f0 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20  >locktype));..  
15400 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
15410 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
15420 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
15430 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
15440 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
15450 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
15460 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
15470 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
15480 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
15490 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
154a0 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
154b0 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
154c0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
154d0 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
154e0 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
154f0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
15500 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
15510 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
15520 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
15530 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
15540 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
15550 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64    }..  /* SetEnd
15560 4f 66 46 69 6c 65 28 29 20 72 65 74 75 72 6e 73  OfFile() returns
15570 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73   non-zero when s
15580 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65  uccessful, or ze
15590 72 6f 20 77 68 65 6e 20 69 74 20 66 61 69 6c 73  ro when it fails
155a0 2e 20 2a 2f 0a 20 20 69 66 28 20 77 69 6e 53 65  . */.  if( winSe
155b0 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42  ekFile(pFile, nB
155c0 79 74 65 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  yte) ){.    rc =
155d0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
155e0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
155f0 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  TE, pFile->lastE
15600 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15610 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 54             "winT
15620 72 75 6e 63 61 74 65 31 22 2c 20 70 46 69 6c 65  runcate1", pFile
15630 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
15640 65 20 69 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e  e if( 0==osSetEn
15650 64 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  dOfFile(pFile->h
15660 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
15670 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f   ((lastErrno = o
15680 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
15690 21 3d 45 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50  !=ERROR_USER_MAP
156a0 50 45 44 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20  PED_FILE) ){.   
156b0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
156c0 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
156d0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
156e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
156f0 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
15700 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
15710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15720 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 32 22    "winTruncate2"
15730 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15740 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
15750 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15760 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
15770 65 20 77 61 73 20 74 72 75 6e 63 61 74 65 64 20  e was truncated 
15780 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
15790 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
157a0 6e 74 6c 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64  ntly.  ** mapped
157b0 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20   region, reduce 
157c0 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61  the effective ma
157d0 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65  pping size as we
157e0 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a  ll. SQLite will.
157f0 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
15800 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
15810 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
15820 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
15830 6d 20 6e 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20  m now on..  */. 
15840 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70   if( pFile->pMap
15850 52 65 67 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c  Region && nByte<
15860 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
15870 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  ){.    pFile->mm
15880 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
15890 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53    }.#endif..  OS
158a0 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
158b0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
158c0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
158d0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
158e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
158f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15900 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
15910 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
15920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15930 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15940 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
15950 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
15960 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
15970 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
15980 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
15990 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
159a0 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
159b0 20 6f 63 63 75 72 69 6e 67 20 61 74 20 74 68 65   occuring at the
159c0 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f   right times..*/
159d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e  .int sqlite3_syn
159e0 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74  c_count = 0;.int
159f0 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
15a00 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  c_count = 0;.#en
15a10 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  dif../*.** Make 
15a20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20  sure all writes 
15a30 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  to a particular 
15a40 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74  file are committ
15a50 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  ed to disk..*/.s
15a60 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 79 6e  tatic int winSyn
15a70 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
15a80 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  id, int flags){.
15a90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
15aa0 4f 5f 53 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a  O_SYNC.  /*.  **
15ab0 20 55 73 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20   Used only when 
15ac0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
15ad0 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20  s not defined.. 
15ae0 20 20 2a 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a    */.  BOOL rc;.
15af0 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
15b00 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 21  ned(NDEBUG) || !
15b10 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e  defined(SQLITE_N
15b20 4f 5f 53 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20  O_SYNC) || \.   
15b30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
15b40 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20  HAVE_OS_TRACE). 
15b50 20 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 77 68   /*.  ** Used wh
15b60 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  en SQLITE_NO_SYN
15b70 43 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  C is not defined
15b80 20 61 6e 64 20 62 79 20 74 68 65 20 61 73 73 65   and by the asse
15b90 72 74 28 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a  rt() and/or.  **
15ba0 20 4f 53 54 52 41 43 45 28 29 20 6d 61 63 72 6f   OSTRACE() macro
15bb0 73 2e 0a 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69  s..   */.  winFi
15bc0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
15bd0 46 69 6c 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a  File*)id;.#else.
15be0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
15bf0 45 52 28 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a  ER(id);.#endif..
15c00 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
15c10 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  );.  /* Check th
15c20 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  at one of SQLITE
15c30 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20  _SYNC_NORMAL or 
15c40 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20  FULL was passed 
15c50 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61  */.  assert((fla
15c60 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
15c70 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20  _SYNC_NORMAL.   
15c80 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30     || (flags&0x0
15c90 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
15ca0 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  FULL.  );..  /* 
15cb0 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74  Unix cannot, but
15cc0 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61   some systems ma
15cd0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
15ce0 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20  FULL from here. 
15cf0 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69  This.  ** line i
15d00 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64  s to test that d
15d10 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74  oing so does not
15d20 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c   cause any probl
15d30 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ems..  */.  Simu
15d40 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
15d50 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
15d60 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52  _FULL );..  OSTR
15d70 41 43 45 28 28 22 53 59 4e 43 20 70 69 64 3d 25  ACE(("SYNC pid=%
15d80 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15d90 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c  le=%p, flags=%x,
15da0 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20   lock=%d\n",.   
15db0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15dc0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15dd0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15de0 2c 20 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  , flags,.       
15df0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74      pFile->lockt
15e00 79 70 65 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20  ype));..#ifndef 
15e10 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 55 4e  SQLITE_TEST.  UN
15e20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
15e30 6c 61 67 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69  lags);.#else.  i
15e40 66 28 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  f( (flags&0x0F)=
15e50 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
15e60 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  L ){.    sqlite3
15e70 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
15e80 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  +;.  }.  sqlite3
15e90 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
15ea0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
15eb0 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
15ec0 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
15ed0 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
15ee0 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
15ef0 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
15f00 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
15f10 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
15f20 43 2d 4e 4f 50 20 70 69 64 3d 25 6c 75 2c 20 70  C-NOP pid=%lu, p
15f30 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15f40 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15f50 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15f60 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15f70 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15f80 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
15f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
15fa0 6c 73 65 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  lse.#if SQLITE_M
15fb0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
15fc0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70   if( pFile->pMap
15fd0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66  Region ){.    if
15fe0 28 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66 46  ( osFlushViewOfF
15ff0 69 6c 65 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52  ile(pFile->pMapR
16000 65 67 69 6f 6e 2c 20 30 29 20 29 7b 0a 20 20 20  egion, 0) ){.   
16010 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
16020 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  C-MMAP pid=%lu, 
16030 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
16040 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
16050 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
16060 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65  LITE_OK\n", osGe
16070 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
16080 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d(),.           
16090 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65      pFile, pFile
160a0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a  ->pMapRegion));.
160b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160c0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
160d0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
160e0 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
160f0 41 43 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20  ACE(("SYNC-MMAP 
16100 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
16110 70 2c 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70  p, pMapRegion=%p
16120 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
16130 20 20 20 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f     "rc=SQLITE_IO
16140 45 52 52 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47  ERR_MMAP\n", osG
16150 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
16160 49 64 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20  Id(),.          
16170 20 20 20 20 20 70 46 69 6c 65 2c 20 70 46 69 6c       pFile, pFil
16180 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b  e->pMapRegion));
16190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
161a0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
161b0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69  _IOERR_MMAP, pFi
161c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
161f0 31 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  1", pFile->zPath
16200 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
16210 64 69 66 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75  dif.  rc = osFlu
16220 73 68 46 69 6c 65 42 75 66 66 65 72 73 28 70 46  shFileBuffers(pF
16230 69 6c 65 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c  ile->h);.  Simul
16240 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 46  ateIOError( rc=F
16250 41 4c 53 45 20 29 3b 0a 20 20 69 66 28 20 72 63  ALSE );.  if( rc
16260 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
16270 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20  ("SYNC pid=%lu, 
16280 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
16290 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
162a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
162b0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
162c0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
162d0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
162e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
162f0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
16300 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16310 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
16320 72 28 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  r();.    OSTRACE
16330 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c  (("SYNC pid=%lu,
16340 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16350 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
16360 45 52 52 5f 46 53 59 4e 43 5c 6e 22 2c 0a 20 20  ERR_FSYNC\n",.  
16370 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16380 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16390 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
163a0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
163b0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
163c0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
163d0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
163e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
163f0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 53             "winS
16400 79 6e 63 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  ync2", pFile->zP
16410 61 74 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ath);.  }.#endif
16420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  .}../*.** Determ
16430 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ine the current 
16440 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69  size of a file i
16450 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69  n bytes.*/.stati
16460 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a  c int winFileSiz
16470 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
16480 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
16490 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e  4 *pSize){.  win
164a0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77  File *pFile = (w
164b0 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  inFile*)id;.  in
164c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
164d0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
164e0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
164f0 70 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69  pSize!=0 );.  Si
16500 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
16510 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
16520 52 5f 46 53 54 41 54 29 3b 0a 20 20 4f 53 54 52  R_FSTAT);.  OSTR
16530 41 43 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d  ACE(("SIZE file=
16540 25 70 2c 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c  %p, pSize=%p\n",
16550 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65   pFile->h, pSize
16560 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ));..#if SQLITE_
16570 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20  OS_WINRT.  {.   
16580 20 46 49 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49   FILE_STANDARD_I
16590 4e 46 4f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66  NFO info;.    if
165a0 28 20 6f 73 47 65 74 46 69 6c 65 49 6e 66 6f 72  ( osGetFileInfor
165b0 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78  mationByHandleEx
165c0 28 70 46 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53  (pFile->h, FileS
165d0 74 61 6e 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20  tandardInfo,.   
165e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16600 20 20 26 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28    &info, sizeof(
16610 69 6e 66 6f 29 29 20 29 7b 0a 20 20 20 20 20 20  info)) ){.      
16620 2a 70 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e  *pSize = info.En
16630 64 4f 66 46 69 6c 65 2e 51 75 61 64 50 61 72 74  dOfFile.QuadPart
16640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16650 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
16660 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
16670 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63  rror();.      rc
16680 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53   = winLogError(S
16690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
166a0 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  T, pFile->lastEr
166b0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
166c0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
166d0 46 69 6c 65 53 69 7a 65 22 2c 20 70 46 69 6c 65  FileSize", pFile
166e0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
166f0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20    }.#else.  {.  
16700 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
16710 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c 6f 77  s;.    DWORD low
16720 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f 52  erBits;.    DWOR
16730 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
16740 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 6f 73    lowerBits = os
16750 47 65 74 46 69 6c 65 53 69 7a 65 28 70 46 69 6c  GetFileSize(pFil
16760 65 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73  e->h, &upperBits
16770 29 3b 0a 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  );.    *pSize = 
16780 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
16790 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
167a0 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
167b0 20 20 69 66 28 20 20 20 28 6c 6f 77 65 72 42 69    if(   (lowerBi
167c0 74 73 20 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49  ts == INVALID_FI
167d0 4c 45 5f 53 49 5a 45 29 0a 20 20 20 20 20 20 20  LE_SIZE).       
167e0 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d  && ((lastErrno =
167f0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16800 29 29 21 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b  ))!=NO_ERROR) ){
16810 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
16820 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
16830 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
16840 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
16850 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
16860 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
16870 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16880 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 69 6c           "winFil
16890 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
168a0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
168b0 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
168c0 45 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70  E(("SIZE file=%p
168d0 2c 20 70 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69  , pSize=%p, *pSi
168e0 7a 65 3d 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e  ze=%lld, rc=%s\n
168f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
16900 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a  ile->h, pSize, *
16910 70 53 69 7a 65 2c 20 73 71 6c 69 74 65 33 45 72  pSize, sqlite3Er
16920 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72  rName(rc)));.  r
16930 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16940 2a 2a 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  ** LOCKFILE_FAIL
16950 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 69 73 20  _IMMEDIATELY is 
16960 75 6e 64 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d  undefined on som
16970 65 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  e Windows system
16980 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f  s..*/.#ifndef LO
16990 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
169a0 44 49 41 54 45 4c 59 0a 23 20 64 65 66 69 6e 65  DIATELY.# define
169b0 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49   LOCKFILE_FAIL_I
169c0 4d 4d 45 44 49 41 54 45 4c 59 20 31 0a 23 65 6e  MMEDIATELY 1.#en
169d0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43  dif..#ifndef LOC
169e0 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f  KFILE_EXCLUSIVE_
169f0 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f  LOCK.# define LO
16a00 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49 56 45  CKFILE_EXCLUSIVE
16a10 5f 4c 4f 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a  _LOCK 2.#endif..
16a20 2f 2a 0a 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c  /*.** Historical
16a30 6c 79 2c 20 53 51 4c 69 74 65 20 68 61 73 20 75  ly, SQLite has u
16a40 73 65 64 20 62 6f 74 68 20 74 68 65 20 4c 6f 63  sed both the Loc
16a50 6b 46 69 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69  kFile and LockFi
16a60 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a  leEx functions..
16a70 2a 2a 20 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b  ** When the Lock
16a80 46 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 77 61  File function wa
16a90 73 20 75 73 65 64 2c 20 69 74 20 77 61 73 20 61  s used, it was a
16aa0 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20 74  lways expected t
16ab0 6f 20 66 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69  o fail.** immedi
16ac0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
16ad0 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f  k could not be o
16ae0 62 74 61 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20  btained.  Also, 
16af0 69 74 20 61 6c 77 61 79 73 20 65 78 70 65 63 74  it always expect
16b00 65 64 20 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20  ed to.** obtain 
16b10 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16b20 6b 2e 20 20 54 68 65 73 65 20 66 6c 61 67 73 20  k.  These flags 
16b30 61 72 65 20 75 73 65 64 20 77 69 74 68 20 74 68  are used with th
16b40 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
16b50 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66  ction.** and ref
16b60 6c 65 63 74 20 74 68 6f 73 65 20 65 78 70 65 63  lect those expec
16b70 74 61 74 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f  tations; therefo
16b80 72 65 2c 20 74 68 65 79 20 73 68 6f 75 6c 64 20  re, they should 
16b90 6e 6f 74 20 62 65 20 63 68 61 6e 67 65 64 2e 0a  not be changed..
16ba0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16bb0 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
16bc0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
16bd0 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20  _LOCKFILE_FLAGS 
16be0 20 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c    (LOCKFILE_FAIL
16bf0 5f 49 4d 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c  _IMMEDIATELY | \
16c00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c20 20 20 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c     LOCKFILE_EXCL
16c30 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64  USIVE_LOCK).#end
16c40 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e  if../*.** Curren
16c50 74 6c 79 2c 20 53 51 4c 69 74 65 20 6e 65 76 65  tly, SQLite neve
16c60 72 20 63 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b  r calls the Lock
16c70 46 69 6c 65 45 78 20 66 75 6e 63 74 69 6f 6e 20  FileEx function 
16c80 77 69 74 68 6f 75 74 20 77 61 6e 74 69 6e 67 20  without wanting 
16c90 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66  the.** call to f
16ca0 61 69 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ail immediately 
16cb0 69 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e  if the lock cann
16cc0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a  ot be obtained..
16cd0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
16ce0 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41  E_LOCKFILEEX_FLA
16cf0 47 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  GS.# define SQLI
16d00 54 45 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c  TE_LOCKFILEEX_FL
16d10 41 47 53 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41  AGS (LOCKFILE_FA
16d20 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a  IL_IMMEDIATELY).
16d30 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63  #endif../*.** Ac
16d40 71 75 69 72 65 20 61 20 72 65 61 64 65 72 20 6c  quire a reader l
16d50 6f 63 6b 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ock..** Differen
16d60 74 20 41 50 49 20 72 6f 75 74 69 6e 65 73 20 61  t API routines a
16d70 72 65 20 63 61 6c 6c 65 64 20 64 65 70 65 6e 64  re called depend
16d80 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
16d90 72 20 6e 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73  r not this.** is
16da0 20 57 69 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e   Win9x or WinNT.
16db0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
16dc0 69 6e 47 65 74 52 65 61 64 4c 6f 63 6b 28 77 69  inGetReadLock(wi
16dd0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  nFile *pFile){. 
16de0 20 69 6e 74 20 72 65 73 3b 0a 20 20 4f 53 54 52   int res;.  OSTR
16df0 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
16e00 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
16e10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
16e20 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
16e30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
16e40 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
16e50 53 5f 57 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20  S_WINCE.    /*. 
16e60 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64     ** NOTE: Wind
16e70 6f 77 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65  ows CE is handle
16e80 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65  d differently he
16e90 72 65 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20  re due its lack 
16ea0 6f 66 20 74 68 65 20 57 69 6e 33 32 0a 20 20 20  of the Win32.   
16eb0 20 2a 2a 20 20 20 20 20 20 20 41 50 49 20 4c 6f   **       API Lo
16ec0 63 6b 46 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f  ckFileEx..    */
16ed0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 63 65  .    res = wince
16ee0 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
16ef0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
16f00 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73  , 0, 1, 0);.#els
16f10 65 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  e.    res = winL
16f20 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
16f30 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
16f40 4c 45 45 58 5f 46 4c 41 47 53 2c 20 53 48 41 52  LEEX_FLAGS, SHAR
16f50 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20  ED_FIRST, 0,.   
16f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f70 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20     SHARED_SIZE, 
16f80 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  0);.#endif.  }.#
16f90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
16fa0 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
16fb0 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a  se{.    int lk;.
16fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
16fd0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b  omness(sizeof(lk
16fe0 29 2c 20 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69  ), &lk);.    pFi
16ff0 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
17000 74 65 20 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b  te = (short)((lk
17010 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 28   & 0x7fffffff)%(
17020 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29  SHARED_SIZE - 1)
17030 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
17040 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  LockFile(&pFile-
17050 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46  >h, SQLITE_LOCKF
17060 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20  ILE_FLAGS,.     
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17080 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 46   SHARED_FIRST+pF
17090 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42  ile->sharedLockB
170a0 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  yte, 0, 1, 0);. 
170b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
170c0 72 65 73 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  res == 0 ){.    
170d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
170e0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
170f0 72 28 29 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e  r();.    /* No n
17100 65 65 64 20 74 6f 20 6c 6f 67 20 61 20 66 61 69  eed to log a fai
17110 6c 75 72 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  lure to lock */.
17120 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
17130 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  READ-LOCK file=%
17140 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
17150 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
17160 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17170 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20  }../*.** Undo a 
17180 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74  readlock.*/.stat
17190 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b  ic int winUnlock
171a0 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
171b0 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
171c0 72 65 73 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  res;.  DWORD las
171d0 74 45 72 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43  tErrno;.  OSTRAC
171e0 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20  E(("READ-UNLOCK 
171f0 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
17200 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70  \n", pFile->h, p
17210 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29  File->locktype))
17220 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
17230 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   ){.    res = wi
17240 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69  nUnlockFile(&pFi
17250 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49  le->h, SHARED_FI
17260 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53  RST, 0, SHARED_S
17270 49 5a 45 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66  IZE, 0);.  }.#if
17280 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
17290 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
172a0 7b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55  {.    res = winU
172b0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
172c0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
172d0 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c  T+pFile->sharedL
172e0 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30  ockByte, 0, 1, 0
172f0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
17300 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 28  if( res==0 && ((
17310 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17320 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
17330 52 52 4f 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29  RROR_NOT_LOCKED)
17340 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
17350 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
17360 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67  rrno;.    winLog
17370 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
17380 52 52 5f 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65  RR_UNLOCK, pFile
17390 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
173b0 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22  nUnlockReadLock"
173c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
173d0 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
173e0 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
173f0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c  e=%p, result=%d\
17400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
17410 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  s));.  return re
17420 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  s;.}../*.** Lock
17430 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
17440 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
17450 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 6c  d by parameter l
17460 6f 63 6b 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a  ocktype - one.**
17470 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17480 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
17490 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
174a0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
174b0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
174c0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
174d0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
174e0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
174f0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
17500 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
17510 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
17520 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
17530 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
17540 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
17550 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
17560 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
17570 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
17580 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
17590 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
175a0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
175b0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
175c0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
175d0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
175e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
175f0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
17600 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
17610 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
17620 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
17630 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
17640 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
17650 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
17660 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
17670 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
17680 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
17690 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
176a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
176b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
176c0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
176d0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
176e0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
176f0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
17700 6c 6f 63 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e  lock.  The winUn
17710 6c 6f 63 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a  lock() routine.*
17720 2a 20 65 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63  * erases all loc
17730 6b 73 20 61 74 20 6f 6e 63 65 20 61 6e 64 20 72  ks at once and r
17740 65 74 75 72 6e 73 20 75 73 20 69 6d 6d 65 64 69  eturns us immedi
17750 61 74 65 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67  ately to locking
17760 20 6c 65 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20   level 0..** It 
17770 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
17780 74 6f 20 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63  to lower the loc
17790 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73  king level one s
177a0 74 65 70 20 61 74 20 61 20 74 69 6d 65 2e 20 20  tep at a time.  
177b0 59 6f 75 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73  You.** must go s
177c0 74 72 61 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69  traight to locki
177d0 6e 67 20 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73  ng level 0..*/.s
177e0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
177f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
17800 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
17810 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
17820 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
17830 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20  eturn code from 
17840 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20  subroutines */. 
17850 20 69 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20   int res = 1;   
17860 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17870 74 20 6f 66 20 61 20 57 69 6e 64 6f 77 73 20 6c  t of a Windows l
17880 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e  ock call */.  in
17890 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20  t newLocktype;  
178a0 20 20 20 20 20 2f 2a 20 53 65 74 20 70 46 69 6c       /* Set pFil
178b0 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74  e->locktype to t
178c0 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72 65  his value before
178d0 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   exiting */.  in
178e0 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  t gotPendingLock
178f0 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66 20   = 0;/* True if 
17900 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50 45  we acquired a PE
17910 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20  NDING lock this 
17920 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  time */.  winFil
17930 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
17940 69 6c 65 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44  ile*)id;.  DWORD
17950 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f   lastErrno = NO_
17960 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74  ERROR;..  assert
17970 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54  ( id!=0 );.  OST
17980 52 41 43 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65  RACE(("LOCK file
17990 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28  =%p, oldLock=%d(
179a0 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c  %d), newLock=%d\
179b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
179c0 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e  File->h, pFile->
179d0 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d  locktype, pFile-
179e0 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c  >sharedLockByte,
179f0 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20   locktype));..  
17a00 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
17a10 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66  lready a lock of
17a20 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f   this type or mo
17a30 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f  re restrictive o
17a40 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c  n the.  ** OsFil
17a50 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
17a60 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
17a70 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
17a80 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  , as.  ** sqlite
17a90 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20  3OsEnterMutex() 
17aa0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
17ab0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
17ac0 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
17ad0 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  pe>=locktype ){.
17ae0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
17af0 43 4b 2d 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c  CK-HELD file=%p,
17b00 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
17b10 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
17b20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b30 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f  OK;.  }..  /* Do
17b40 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79 20 6b   not allow any k
17b50 69 6e 64 20 6f 66 20 77 72 69 74 65 2d 6c 6f 63  ind of write-loc
17b60 6b 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  k on a read-only
17b70 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20   database.  */. 
17b80 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72   if( (pFile->ctr
17b90 6c 46 6c 61 67 73 20 26 20 57 49 4e 46 49 4c 45  lFlags & WINFILE
17ba0 5f 52 44 4f 4e 4c 59 29 21 3d 30 20 26 26 20 6c  _RDONLY)!=0 && l
17bb0 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
17bc0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
17bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17be0 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  R_LOCK;.  }..  /
17bf0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
17c00 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
17c10 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f   is correct.  */
17c20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17c30 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c  ->locktype!=NO_L
17c40 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d  OCK || locktype=
17c50 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17c60 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
17c70 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe!=PENDING_LOCK
17c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f   );.  assert( lo
17c90 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45 44  cktype!=RESERVED
17ca0 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
17cb0 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
17cc0 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  _LOCK );..  /* L
17cd0 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47 5f  ock the PENDING_
17ce0 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65 20  LOCK byte if we 
17cf0 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65 20  need to acquire 
17d00 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f  a PENDING lock o
17d10 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44 20  r.  ** a SHARED 
17d20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72 65  lock.  If we are
17d30 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
17d40 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63  RED lock, the ac
17d50 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a  quisition of.  *
17d60 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f  * the PENDING_LO
17d70 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70 6f  CK byte is tempo
17d80 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77  rary..  */.  new
17d90 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c 65  Locktype = pFile
17da0 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66  ->locktype;.  if
17db0 28 20 20 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  (   (pFile->lock
17dc0 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20  type==NO_LOCK). 
17dd0 20 20 20 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b      || (   (lock
17de0 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f  type==EXCLUSIVE_
17df0 4c 4f 43 4b 29 0a 20 20 20 20 20 20 20 20 20 26  LOCK).         &
17e00 26 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  & (pFile->lockty
17e10 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe==RESERVED_LOC
17e20 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  K)).  ){.    int
17e30 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
17e40 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
17e50 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
17e60 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
17e70 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
17e80 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
17e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
17eb0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
17ec0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
17ed0 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
17ee0 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
17ef0 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
17f00 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
17f10 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
17f20 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
17f30 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
17f40 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
17f50 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
17f60 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
17f70 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
17f80 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
17f90 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
17fa0 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
17fb0 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
17fc0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
17fd0 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
17fe0 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
17ff0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
18000 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
18010 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45    */.      lastE
18020 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18030 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
18040 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
18050 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
18060 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65  %p, count=%d, re
18070 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  sult=%d\n",.    
18080 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18090 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b  ->h, cnt, res));
180a0 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
180b0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41  rrno==ERROR_INVA
180c0 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20  LID_HANDLE ){.  
180d0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
180e0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
180f0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
18100 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
18110 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  CK;.        OSTR
18120 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
18130 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
18140 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
18150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
18160 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c  ile->h, cnt, sql
18170 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18180 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
18190 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
181a0 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
181b0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
181c0 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
181d0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
181e0 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
181f0 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
18200 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
18210 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
18220 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18230 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
18240 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
18250 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18260 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
18270 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
18280 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
18290 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
182a0 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
182b0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  e);.    if( res 
182c0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
182d0 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
182e0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
182f0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18300 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18310 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18320 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
18330 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
18340 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
18350 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18360 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
18370 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
18380 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18390 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
183a0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
183b0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
183c0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
183d0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
183e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
183f0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
18400 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
18410 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
18420 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
18430 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
18440 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
18450 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
18460 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
18470 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18480 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18490 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
184a0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
184b0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
184c0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
184d0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
184e0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
184f0 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
18500 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
18510 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
18520 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
18530 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18540 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
18550 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
18560 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
18570 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  le);.    res = w
18580 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
18590 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
185a0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41  KFILE_FLAGS, SHA
185b0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
185c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
185d0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
185e0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
185f0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
18600 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
18610 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
18620 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
18630 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18640 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
18650 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
18660 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
18670 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
18680 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
18690 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
186a0 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
186b0 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
186c0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
186d0 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
186e0 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
186f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
18700 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
18710 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
18720 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
18730 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
18740 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
18750 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
18760 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
18770 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
18780 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
18790 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
187a0 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
187b0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
187c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
187d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
187e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
187f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
18800 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18810 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
18820 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  OCK-FAIL file=%p
18830 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74  , wanted=%d, got
18840 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
18850 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
18860 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
18870 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46  type));.  }.  pF
18880 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
18890 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
188a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
188b0 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
188c0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
188d0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
188e0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
188f0 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  pe, sqlite3ErrNa
18900 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
18910 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18920 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
18930 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
18940 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
18950 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
18960 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
18970 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
18980 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
18990 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
189a0 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
189b0 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
189c0 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
189d0 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
189e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
189f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
18a00 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
18a10 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65  t res;.  winFile
18a20 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
18a30 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
18a40 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
18a50 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
18a60 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
18a70 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
18a80 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
18a90 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
18aa0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
18ab0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
18ac0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
18ad0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
18ae0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
18af0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  LOCK ){.    res 
18b00 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
18b10 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
18b20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
18b30 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
18b40 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
18b50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
18b60 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
18b70 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
18b80 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
18b90 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  S,RESERVED_BYTE,
18ba0 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  0,1,0);.    if( 
18bb0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  res ){.      win
18bc0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
18bd0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
18be0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
18bf0 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21     }.    res = !
18c00 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  res;.    OSTRACE
18c10 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
18c20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
18c30 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
18c40 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
18c50 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
18c60 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  = res;.  OSTRACE
18c70 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
18c80 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
18c90 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
18ca0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
18cb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
18cc0 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c  ile->h, pResOut,
18cd0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
18ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18cf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
18d00 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
18d10 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
18d20 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
18d30 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
18d40 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
18d50 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
18d60 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
18d70 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
18d80 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
18d90 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
18da0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
18db0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
18dc0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
18dd0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
18de0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
18df0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
18e00 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
18e10 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
18e20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
18e30 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
18e40 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
18e50 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
18e60 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
18e70 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
18e80 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
18e90 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
18ea0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
18eb0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
18ec0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
18ed0 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
18ee0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
18ef0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
18f00 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18f10 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
18f20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
18f30 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
18f40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18f50 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
18f60 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
18f70 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
18f80 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
18f90 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
18fa0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
18fb0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
18fc0 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
18fd0 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
18fe0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
18ff0 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
19000 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  VE_LOCK ){.    w
19010 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19020 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
19030 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
19040 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
19050 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
19060 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47  ED_LOCK && !winG
19070 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
19080 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
19090 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
190a0 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
190b0 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
190c0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
190d0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
190e0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
190f0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
19100 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
19110 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OCK, osGetLastEr
19120 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
19130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19140 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
19150 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
19160 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
19170 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
19180 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
19190 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
191a0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
191b0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
191c0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
191d0 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
191e0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
191f0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
19200 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
19210 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
19220 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
19230 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
19240 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
19250 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
19260 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
19270 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
19280 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
19290 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
192a0 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
192b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
192c0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
192d0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
192e0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
192f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19300 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
19310 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
19320 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
19330 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
19340 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
19350 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
19360 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
19370 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
19380 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
19390 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
193a0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
193b0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
193c0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
193d0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
193e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
193f0 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
19400 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
19410 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
19420 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
19430 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
19440 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
19450 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
19460 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
19470 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
19480 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
19490 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
194a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
194b0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
194c0 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
194d0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
194e0 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
194f0 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
19500 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19510 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
19520 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
19530 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68  qlite3_vfs *, ch
19540 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  ar **);.static i
19550 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
19560 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  t void *);.stati
19570 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
19580 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
19590 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
195a0 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
195b0 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
195c0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
195d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
195e0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
195f0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19600 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
19610 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
19620 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
19630 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
19640 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
19650 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
19660 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
19670 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
19680 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
19690 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
196a0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
196b0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
196c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
196d0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
196e0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
196f0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
19700 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
19710 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19720 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
19730 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 41 53 54  case SQLITE_LAST
19740 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20  _ERRNO: {.      
19750 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 69  *(int*)pArg = (i
19760 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  nt)pFile->lastEr
19770 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rno;.      OSTRA
19780 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
19790 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
197a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
197b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
197c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
197d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
197e0 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
197f0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
19800 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
19810 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 4f 53  *)pArg;.      OS
19820 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19830 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
19840 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
19850 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
19860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
19870 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
19880 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
19890 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  T: {.      if( p
198a0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
198b0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
198c0 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53 7a 3b 0a  e3_int64 oldSz;.
198d0 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
198e0 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 69 64 2c   winFileSize(id,
198f0 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20 20 20 20   &oldSz);.      
19900 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19910 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
19920 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
19930 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69 74 65 33  ewSz = *(sqlite3
19940 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b 0a 20 20  _int64*)pArg;.  
19950 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 77 53          if( newS
19960 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20 20 20 20  z>oldSz ){.     
19970 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49         SimulateI
19980 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
19990 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
199a0 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 69 64  = winTruncate(id
199b0 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20 20 20 20  , newSz);.      
199c0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
199d0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
199e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
199f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4f 53      }.        OS
19a00 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
19a10 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c  le=%p, rc=%s\n",
19a20 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74   pFile->h, sqlit
19a30 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
19a40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19a50 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19a60 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19a70 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
19a80 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
19a90 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
19aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19ab0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
19ac0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
19ad0 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20  IST_WAL: {.     
19ae0 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69 6c   winModeBit(pFil
19af0 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45 52 53 49  e, WINFILE_PERSI
19b00 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
19b10 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
19b20 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
19b30 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
19b40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
19b50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
19b60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
19b70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
19b80 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
19b90 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  VERWRITE: {.    
19ba0 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70 46 69    winModeBit(pFi
19bb0 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57  le, WINFILE_PSOW
19bc0 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20  , (int*)pArg);. 
19bd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19be0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19bf0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
19c00 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
19c10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19c20 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
19c30 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  e SQLITE_FCNTL_V
19c40 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  FSNAME: {.      
19c50 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
19c60 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
19c70 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66  "%s", pFile->pVf
19c80 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
19c90 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
19ca0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
19cb0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
19cc0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
19cd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19ce0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
19cf0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
19d00 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a 20 20 20  _AV_RETRY: {.   
19d10 20 20 20 69 6e 74 20 2a 61 20 3d 20 28 69 6e 74     int *a = (int
19d20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 66  *)pArg;.      if
19d30 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20 20 20 20  ( a[0]>0 ){.    
19d40 20 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72      winIoerrRetr
19d50 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20  y = a[0];.      
19d60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
19d70 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [0] = winIoerrRe
19d80 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  try;.      }.   
19d90 20 20 20 69 66 28 20 61 5b 31 5d 3e 30 20 29 7b     if( a[1]>0 ){
19da0 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72  .        winIoer
19db0 72 52 65 74 72 79 44 65 6c 61 79 20 3d 20 61 5b  rRetryDelay = a[
19dc0 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
19dd0 0a 20 20 20 20 20 20 20 20 61 5b 31 5d 20 3d 20  .        a[1] = 
19de0 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
19df0 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ay;.      }.    
19e00 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19e10 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
19e20 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
19e30 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
19e40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19e50 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
19e60 49 54 45 5f 54 45 53 54 0a 20 20 20 20 63 61 73  ITE_TEST.    cas
19e70 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
19e80 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 3a  IN32_SET_HANDLE:
19e90 20 7b 0a 20 20 20 20 20 20 4c 50 48 41 4e 44 4c   {.      LPHANDL
19ea0 45 20 70 68 46 69 6c 65 20 3d 20 28 4c 50 48 41  E phFile = (LPHA
19eb0 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20 20 20 20  NDLE)pArg;.     
19ec0 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46 69 6c 65   HANDLE hOldFile
19ed0 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 20   = pFile->h;.   
19ee0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2a 70     pFile->h = *p
19ef0 68 46 69 6c 65 3b 0a 20 20 20 20 20 20 2a 70 68  hFile;.      *ph
19f00 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69 6c 65 3b  File = hOldFile;
19f10 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
19f20 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c 65 3d 25  "FCNTL oldFile=%
19f30 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70 2c 20 72  p, newFile=%p, r
19f40 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
19f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
19f60 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  OldFile, pFile->
19f70 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
19f80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19f90 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
19fa0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
19fb0 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
19fc0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
19fd0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  le = 0;.      in
19fe0 74 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d  t rc = winGetTem
19ff0 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66  pname(pFile->pVf
1a000 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a 20 20 20  s, &zTFile);.   
1a010 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1a020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1a030 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20  *(char**)pArg = 
1a040 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a  zTFile;.      }.
1a050 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a060 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1a070 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
1a080 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
1a090 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1a0a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a0b0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1a0c0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63  MAP_SIZE>0.    c
1a0d0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1a0e0 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20  _MMAP_SIZE: {.  
1a0f0 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74      i64 newLimit
1a100 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a   = *(i64*)pArg;.
1a110 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53        int rc = S
1a120 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1a130 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c  if( newLimit>sql
1a140 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a150 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20  .mxMmap ){.     
1a160 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71     newLimit = sq
1a170 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a180 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20  g.mxMmap;.      
1a190 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  }.      *(i64*)p
1a1a0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
1a1b0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
1a1c0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
1a1d0 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
1a1e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
1a1f0 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
1a200 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
1a210 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1a220 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
1a230 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
1a240 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
1a250 7b 0a 20 20 20 20 20 20 20 20 20 20 77 69 6e 55  {.          winU
1a260 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
1a270 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1a280 77 69 6e 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  winMapfile(pFile
1a290 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
1a2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f  .      }.      O
1a2b0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
1a2c0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
1a2d0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69  , pFile->h, sqli
1a2e0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29  te3ErrName(rc)))
1a2f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1a300 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
1a310 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
1a320 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1a330 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  c=SQLITE_NOTFOUN
1a340 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  D\n", pFile->h))
1a350 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a360 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f  E_NOTFOUND;.}../
1a370 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1a380 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62  sector size in b
1a390 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65  ytes of the unde
1a3a0 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76  rlying block dev
1a3b0 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  ice for.** the s
1a3c0 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54  pecified file. T
1a3d0 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c  his is almost al
1a3e0 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20  ways 512 bytes, 
1a3f0 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61  but may be.** la
1a400 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65  rger for some de
1a410 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  vices..**.** SQL
1a420 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73  ite code assumes
1a430 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   this function c
1a440 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61  annot fail. It a
1a450 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
1a460 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73  .** if two files
1a470 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20   are created in 
1a480 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79  the same file-sy
1a490 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28  stem directory (
1a4a0 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61  i.e..** a databa
1a4b0 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e  se and its journ
1a4c0 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68  al file) that th
1a4d0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
1a4e0 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d  ll be the.** sam
1a4f0 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73  e for both..*/.s
1a500 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 65 63  tatic int winSec
1a510 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
1a520 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 28 76 6f  file *id){.  (vo
1a530 69 64 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  id)id;.  return 
1a540 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
1a550 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f  ECTOR_SIZE;.}../
1a560 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 76 65  *.** Return a ve
1a570 63 74 6f 72 20 6f 66 20 64 65 76 69 63 65 20 63  ctor of device c
1a580 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e 0a  haracteristics..
1a590 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1a5a0 6e 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  nDeviceCharacter
1a5b0 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1a5c0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77 69 6e 46  ile *id){.  winF
1a5d0 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e 46 69 6c  ile *p = (winFil
1a5e0 65 2a 29 69 64 3b 0a 20 20 72 65 74 75 72 6e 20  e*)id;.  return 
1a5f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 55 4e 44  SQLITE_IOCAP_UND
1a600 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e 5f 4f 50  ELETABLE_WHEN_OP
1a610 45 4e 20 7c 0a 20 20 20 20 20 20 20 20 20 28 28  EN |.         ((
1a620 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  p->ctrlFlags & W
1a630 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f 53 51 4c  INFILE_PSOW)?SQL
1a640 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
1a650 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 30 29  AFE_OVERWRITE:0)
1a660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f  ;.}../*.** Windo
1a670 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 6c 65 74  ws will only let
1a680 20 79 6f 75 20 63 72 65 61 74 65 20 66 69 6c 65   you create file
1a690 20 76 69 65 77 20 6d 61 70 70 69 6e 67 73 0a 2a   view mappings.*
1a6a0 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  * on allocation 
1a6b0 73 69 7a 65 20 67 72 61 6e 75 6c 61 72 69 74 79  size granularity
1a6c0 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a 2a 2a 20   boundaries..** 
1a6d0 44 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  During sqlite3_o
1a6e0 73 5f 69 6e 69 74 28 29 20 77 65 20 64 6f 20 61  s_init() we do a
1a6f0 20 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 29   GetSystemInfo()
1a700 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68 65 20 67  .** to get the g
1a710 72 61 6e 75 6c 61 72 69 74 79 20 73 69 7a 65 2e  ranularity size.
1a720 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59 53 54 45  .*/.static SYSTE
1a730 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73 49 6e 66  M_INFO winSysInf
1a740 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  o;..#ifndef SQLI
1a750 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a  TE_OMIT_WAL../*.
1a760 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
1a770 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
1a780 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
1a790 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
1a7a0 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
1a7b0 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
1a7c0 6f 74 65 63 74 20 74 68 65 20 77 69 6e 4c 6f 63  otect the winLoc
1a7d0 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 75 73  kInfo objects us
1a7e0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 66 69  ed by.** this fi
1a7f0 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68 69 63 68  le, all of which
1a800 20 6d 61 79 20 62 65 20 73 68 61 72 65 64 20 62   may be shared b
1a810 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
1a820 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
1a830 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  on winShmMutexHe
1a840 6c 64 28 29 20 69 73 20 75 73 65 64 20 74 6f 20  ld() is used to 
1a850 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
1a860 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 0a 2a  e global mutex.*
1a870 2a 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72  * is held when r
1a880 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75  equired. This fu
1a890 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75  nction is only u
1a8a0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
1a8b0 73 73 65 72 74 28 29 0a 2a 2a 20 73 74 61 74 65  ssert().** state
1a8c0 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
1a8d0 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  *   winShmEnterM
1a8e0 75 74 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73  utex().**     as
1a8f0 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65  sert( winShmMute
1a900 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a 20 20 20  xHeld() );.**   
1a910 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78  winShmLeaveMutex
1a920 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
1a930 64 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74  d winShmEnterMut
1a940 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
1a950 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1a960 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1a970 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1a980 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
1a990 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53  static void winS
1a9a0 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  hmLeaveMutex(voi
1a9b0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
1a9c0 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1a9d0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1a9e0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1a9f0 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 6e 64 65  VFS1));.}.#ifnde
1aa00 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
1aa10 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74 65 78 48  int winShmMutexH
1aa20 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20 72 65  eld(void) {.  re
1aa30 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74  turn sqlite3_mut
1aa40 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65 33 4d  ex_held(sqlite3M
1aa50 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
1aa60 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
1aa70 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  S1));.}.#endif..
1aa80 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65  /*.** Object use
1aa90 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61  d to represent a
1aaa0 20 73 69 6e 67 6c 65 20 66 69 6c 65 20 6f 70 65   single file ope
1aab0 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 20  ned and mmapped 
1aac0 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a 20 73 68  to provide.** sh
1aad0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 57 68  ared memory.  Wh
1aae0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
1aaf0 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
1ab00 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 6c 6f  e the same.** lo
1ab10 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61 63 68 20  g-summary, each 
1ab20 74 68 72 65 61 64 20 68 61 73 20 69 74 73 20 6f  thread has its o
1ab30 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62 6a 65 63  wn winFile objec
1ab40 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 0a  t, but they all.
1ab50 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ** point to a si
1ab60 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  ngle instance of
1ab70 20 74 68 69 73 20 6f 62 6a 65 63 74 2e 20 20 49   this object.  I
1ab80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65  n other words, e
1ab90 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ach.** log-summa
1aba0 72 79 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 6c  ry is opened onl
1abb0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
1abc0 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e 53 68 6d  ss..**.** winShm
1abd0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1abe0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
1abf0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
1ac00 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
1ac10 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
1ac20 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
1ac30 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
1ac40 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
1ac50 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20 20 70 4e   nRef.**      pN
1ac60 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ext.**.** The fo
1ac70 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1ac80 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
1ac90 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
1aca0 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
1acb0 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
1acc0 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
1acd0 20 45 69 74 68 65 72 20 77 69 6e 53 68 6d 4e 6f   Either winShmNo
1ace0 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
1acf0 20 68 65 6c 64 20 6f 72 20 77 69 6e 53 68 6d 4e   held or winShmN
1ad00 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a  ode.nRef==0 and.
1ad10 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65  ** winShmMutexHe
1ad20 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
1ad30 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
1ad40 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
1ad50 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
1ad60 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2f  structure..**.*/
1ad70 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f  .struct winShmNo
1ad80 64 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  de {.  sqlite3_m
1ad90 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20  utex *mutex;    
1ada0 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63    /* Mutex to ac
1adb0 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74  cess this object
1adc0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
1add0 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  ename;          
1ade0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
1adf0 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  file */.  winFil
1ae00 65 20 68 46 69 6c 65 3b 20 20 20 20 20 20 20 20  e hFile;        
1ae10 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
1ae20 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f 70 65 6e  dle from winOpen
1ae30 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a 52 65 67   */..  int szReg
1ae40 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1ae50 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61    /* Size of sha
1ae60 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
1ae70 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67  ns */.  int nReg
1ae80 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ion;            
1ae90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72     /* Size of ar
1aea0 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  ray apRegion */.
1aeb0 20 20 73 74 72 75 63 74 20 53 68 6d 52 65 67 69    struct ShmRegi
1aec0 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  on {.    HANDLE 
1aed0 68 4d 61 70 3b 20 20 20 20 20 20 20 20 20 20 20  hMap;           
1aee0 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65    /* File handle
1aef0 20 66 72 6f 6d 20 43 72 65 61 74 65 46 69 6c 65   from CreateFile
1af00 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 20 20 76  Mapping */.    v
1af10 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20 7d 20 2a  oid *pMap;.  } *
1af20 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57 4f 52 44  aRegion;.  DWORD
1af30 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20   lastErrno;     
1af40 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 69 6e        /* The Win
1af50 64 6f 77 73 20 65 72 72 6e 6f 20 66 72 6f 6d 20  dows errno from 
1af60 74 68 65 20 6c 61 73 74 20 49 2f 4f 20 65 72 72  the last I/O err
1af70 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 52 65  or */..  int nRe
1af80 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1af90 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1afa0 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20   winShm objects 
1afb0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73  pointing to this
1afc0 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 46   */.  winShm *pF
1afd0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
1afe0 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68 6d 20 6f   /* All winShm o
1aff0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1b000 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
1b010 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78 74 3b 20  ShmNode *pNext; 
1b020 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
1b030 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 77  in list of all w
1b040 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1b050 73 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  s */.#if defined
1b060 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1b070 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1b080 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1b090 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20    u8 nextShmId; 
1b0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0b0 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 77  Next available w
1b0c0 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  inShm.id value *
1b0d0 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
1b0e0 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61 72 72 61  ** A global arra
1b0f0 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e  y of all winShmN
1b100 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a 2a 2a 0a  ode objects..**.
1b110 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d 4d 75 74  ** The winShmMut
1b120 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
1b130 20 74 72 75 65 20 77 68 69 6c 65 20 72 65 61 64   true while read
1b140 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
1b150 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  his list..*/.sta
1b160 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  tic winShmNode *
1b170 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d  winShmNodeList =
1b180 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63   0;../*.** Struc
1b190 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
1b1a0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
1b1b0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
1b1c0 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
1b1d0 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
1b1e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
1b1f0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1b200 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
1b210 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
1b220 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
1b230 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
1b240 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
1b250 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 77 69  ter:.**.**    wi
1b260 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 0a 2a 2a  nShm.pShmNode.**
1b270 20 20 20 20 77 69 6e 53 68 6d 2e 69 64 0a 2a 2a      winShm.id.**
1b280 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69  .** All other fi
1b290 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72  elds are read/wr
1b2a0 69 74 65 2e 20 20 54 68 65 20 77 69 6e 53 68 6d  ite.  The winShm
1b2b0 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  .pShmNode->mutex
1b2c0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
1b2d0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
1b2e0 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
1b2f0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
1b300 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20 77 69 6e  t winShm {.  win
1b310 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
1b320 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75  e;      /* The u
1b330 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e 53 68 6d  nderlying winShm
1b340 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  Node object */. 
1b350 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78 74 3b 20   winShm *pNext; 
1b360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b370 65 78 74 20 77 69 6e 53 68 6d 20 77 69 74 68 20  ext winShm with 
1b380 74 68 65 20 73 61 6d 65 20 77 69 6e 53 68 6d 4e  the same winShmN
1b390 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
1b3a0 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
1b3b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
1b3c0 6f 6c 64 69 6e 67 20 74 68 65 20 77 69 6e 53 68  olding the winSh
1b3d0 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20  mNode mutex */. 
1b3e0 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b 3b   u16 sharedMask;
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1b400 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
1b410 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31  cks held */.  u1
1b420 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  6 exclMask;     
1b430 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
1b440 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
1b450 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23 69 66 20  cks held */.#if 
1b460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1b470 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1b480 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1b490 54 52 41 43 45 29 0a 20 20 75 38 20 69 64 3b 20  TRACE).  u8 id; 
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69      /* Id of thi
1b4c0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74  s connection wit
1b4d0 68 20 69 74 73 20 77 69 6e 53 68 6d 4e 6f 64 65  h its winShmNode
1b4e0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
1b4f0 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75  *.** Constants u
1b500 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a  sed for locking.
1b510 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53  */.#define WIN_S
1b520 48 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53  HM_BASE   ((22+S
1b530 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
1b540 2a 34 29 20 20 20 20 20 20 20 20 2f 2a 20 66 69  *4)        /* fi
1b550 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
1b560 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f 53 48 4d  .#define WIN_SHM
1b570 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f 53 48 4d  _DMS    (WIN_SHM
1b580 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d  _BASE+SQLITE_SHM
1b590 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64  _NLOCK)  /* dead
1b5a0 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f  man switch */../
1b5b0 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64 76 69 73  *.** Apply advis
1b5c0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
1b5d0 6c 20 6e 20 62 79 74 65 73 20 62 65 67 69 6e 6e  l n bytes beginn
1b5e0 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a 2a 2f 0a  ing at ofst..*/.
1b5f0 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 55 4e 4c  #define _SHM_UNL
1b600 43 4b 20 20 31 0a 23 64 65 66 69 6e 65 20 5f 53  CK  1.#define _S
1b610 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23 64 65 66  HM_RDLCK  2.#def
1b620 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 20  ine _SHM_WRLCK  
1b630 33 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  3.static int win
1b640 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20  ShmSystemLock(. 
1b650 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 46 69   winShmNode *pFi
1b660 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70 6c 79 20  le,    /* Apply 
1b670 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70  locks to this op
1b680 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  en shared-memory
1b690 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
1b6a0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
1b6b0 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55 4e 4c 43      /* _SHM_UNLC
1b6c0 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20 6f  K, _SHM_RDLCK, o
1b6d0 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20 2a 2f 0a  r _SHM_WRLCK */.
1b6e0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1b6f0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1b700 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
1b710 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f 75 6e 6c  to be locked/unl
1b720 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  ocked */.  int n
1b730 42 79 74 65 20 20 20 20 20 20 20 20 20 20 20 20  Byte            
1b740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1b750 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  tes to lock or u
1b760 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e  nlock */.){.  in
1b770 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1b780 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1b790 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f 55 6e 6c  de form Lock/Unl
1b7a0 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a 2f 0a 0a  ockFileEx() */..
1b7b0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
1b7c0 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62  he winShmNode ob
1b7d0 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a  ject is serializ
1b7e0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1b7f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
1b800 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b810 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c  (pFile->mutex) |
1b820 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30  | pFile->nRef==0
1b830 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
1b840 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25  "SHM-LOCK file=%
1b850 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f 66 66 73  p, lock=%d, offs
1b860 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25 64 5c 6e  et=%d, size=%d\n
1b870 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
1b880 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6c 6f  ile->hFile.h, lo
1b890 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c 20 6e 42  ckType, ofst, nB
1b8a0 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  yte));..  /* Rel
1b8b0 65 61 73 65 2f 41 63 71 75 69 72 65 20 74 68 65  ease/Acquire the
1b8c0 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
1b8d0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b  ck */.  if( lock
1b8e0 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e 4c 43 4b  Type==_SHM_UNLCK
1b8f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   ){.    rc = win
1b900 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
1b910 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f 66 73 74  e->hFile.h, ofst
1b920 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a  , 0, nByte, 0);.
1b930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1b940 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
1b950 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
1b960 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 64  s */.    DWORD d
1b970 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b 46 49 4c  wFlags = LOCKFIL
1b980 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
1b990 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  LY;.    if( lock
1b9a0 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 57 52 4c  Type == _SHM_WRL
1b9b0 43 4b 20 29 20 64 77 46 6c 61 67 73 20 7c 3d 20  CK ) dwFlags |= 
1b9c0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
1b9d0 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  VE_LOCK;.    rc 
1b9e0 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
1b9f0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 64  File->hFile.h, d
1ba00 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c 20 30 2c  wFlags, ofst, 0,
1ba10 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 7d 0a   nByte, 0);.  }.
1ba20 0a 20 20 69 66 28 20 72 63 21 3d 20 30 20 29 7b  .  if( rc!= 0 ){
1ba30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ba40 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
1ba50 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
1ba60 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61 73 74 45  no =  osGetLastE
1ba70 72 72 6f 72 28 29 3b 0a 20 20 20 20 72 63 20 3d  rror();.    rc =
1ba80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1ba90 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  }..  OSTRACE(("S
1baa0 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c  HM-LOCK file=%p,
1bab0 20 66 75 6e 63 3d 25 73 2c 20 65 72 72 6e 6f 3d   func=%s, errno=
1bac0 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  %lu, rc=%s\n",. 
1bad0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1bae0 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f 63 6b 54  >hFile.h, (lockT
1baf0 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55 4e 4c 43  ype == _SHM_UNLC
1bb00 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f 63 6b 46  K) ? "winUnlockF
1bb10 69 6c 65 22 20 3a 0a 20 20 20 20 20 20 20 20 20  ile" :.         
1bb20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c 65 22 2c    "winLockFile",
1bb30 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1bb40 6f 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  o, sqlite3ErrNam
1bb50 65 28 72 63 29 29 29 3b 0a 0a 20 20 72 65 74 75  e(rc)));..  retu
1bb60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  rn rc;.}../* For
1bb70 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
1bb80 74 6f 20 56 46 53 20 6d 65 74 68 6f 64 73 20 2a  to VFS methods *
1bb90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1bba0 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
1bbb0 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71  *,const char*,sq
1bbc0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1bbd0 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  int*);.static in
1bbe0 74 20 77 69 6e 44 65 6c 65 74 65 28 73 71 6c 69  t winDelete(sqli
1bbf0 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e 73 74 20  te3_vfs *,const 
1bc00 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a 2f 2a 0a  char*,int);../*.
1bc10 2a 2a 20 50 75 72 67 65 20 74 68 65 20 77 69 6e  ** Purge the win
1bc20 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
1bc30 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
1bc40 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f 64 65 2e  with winShmNode.
1bc50 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54  nRef==0..**.** T
1bc60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53  his is not a VFS
1bc70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1bc80 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75  ethod; it is a u
1bc90 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20  tility function 
1bca0 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53  called.** by VFS
1bcb0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d   shared-memory m
1bcc0 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  ethods..*/.stati
1bcd0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 50 75 72  c void winShmPur
1bce0 67 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ge(sqlite3_vfs *
1bcf0 70 56 66 73 2c 20 69 6e 74 20 64 65 6c 65 74 65  pVfs, int delete
1bd00 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53 68 6d 4e  Flag){.  winShmN
1bd10 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77 69 6e 53  ode **pp;.  winS
1bd20 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20 61 73 73  hmNode *p;.  ass
1bd30 65 72 74 28 20 77 69 6e 53 68 6d 4d 75 74 65 78  ert( winShmMutex
1bd40 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f 53 54 52  Held() );.  OSTR
1bd50 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 20  ACE(("SHM-PURGE 
1bd60 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65 74 65 46  pid=%lu, deleteF
1bd70 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  lag=%d\n",.     
1bd80 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1bd90 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 64  ntProcessId(), d
1bda0 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a 20 20 70  eleteFlag));.  p
1bdb0 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f 64 65 4c  p = &winShmNodeL
1bdc0 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 28 70  ist;.  while( (p
1bdd0 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b 0a 20 20   = *pp)!=0 ){.  
1bde0 20 20 69 66 28 20 70 2d 3e 6e 52 65 66 3d 3d 30    if( p->nRef==0
1bdf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
1be00 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 75  .      if( p->mu
1be10 74 65 78 20 29 7b 20 73 71 6c 69 74 65 33 5f 6d  tex ){ sqlite3_m
1be20 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74  utex_free(p->mut
1be30 65 78 29 3b 20 7d 0a 20 20 20 20 20 20 66 6f 72  ex); }.      for
1be40 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69  (i=0; i<p->nRegi
1be50 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  on; i++){.      
1be60 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20 6f 73 55    BOOL bRc = osU
1be70 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70  nmapViewOfFile(p
1be80 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 70 4d 61  ->aRegion[i].pMa
1be90 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  p);.        OSTR
1bea0 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d  ACE(("SHM-PURGE-
1beb0 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72  UNMAP pid=%lu, r
1bec0 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c  egion=%d, rc=%s\
1bed0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1bee0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1bef0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c  tProcessId(), i,
1bf00 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66   bRc ? "ok" : "f
1bf10 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20  ailed"));.      
1bf20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c    UNUSED_VARIABL
1bf30 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20  E_VALUE(bRc);.  
1bf40 20 20 20 20 20 20 62 52 63 20 3d 20 6f 73 43 6c        bRc = osCl
1bf50 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 61 52 65  oseHandle(p->aRe
1bf60 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29 3b 0a 20  gion[i].hMap);. 
1bf70 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
1bf80 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c 4f 53 45  "SHM-PURGE-CLOSE
1bf90 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f 6e   pid=%lu, region
1bfa0 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%d, rc=%s\n",. 
1bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfc0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
1bfd0 65 73 73 49 64 28 29 2c 20 69 2c 20 62 52 63 20  essId(), i, bRc 
1bfe0 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
1bff0 22 29 29 3b 0a 20 20 20 20 20 20 20 20 55 4e 55  "));.        UNU
1c000 53 45 44 5f 56 41 52 49 41 42 4c 45 5f 56 41 4c  SED_VARIABLE_VAL
1c010 55 45 28 62 52 63 29 3b 0a 20 20 20 20 20 20 7d  UE(bRc);.      }
1c020 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 46  .      if( p->hF
1c030 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26 26 20 70  ile.h!=NULL && p
1c040 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e 56 41 4c  ->hFile.h!=INVAL
1c050 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
1c060 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c  ){.        Simul
1c070 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1c080 28 31 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e  (1);.        win
1c090 43 6c 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66  Close((sqlite3_f
1c0a0 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69 6c 65 29  ile *)&p->hFile)
1c0b0 3b 0a 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61  ;.        Simula
1c0c0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1c0d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
1c0e0 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67    if( deleteFlag
1c0f0 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69 6d 75   ){.        Simu
1c100 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1c110 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  n(1);.        sq
1c120 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
1c130 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20  Malloc();.      
1c140 20 20 77 69 6e 44 65 6c 65 74 65 28 70 56 66 73    winDelete(pVfs
1c150 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  , p->zFilename, 
1c160 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
1c170 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1c180 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20 53 69  oc();.        Si
1c190 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1c1a0 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ign(0);.      }.
1c1b0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
1c1c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
1c1d0 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 52 65 67  te3_free(p->aReg
1c1e0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
1c1f0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
1c200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
1c210 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b 0a 20 20   = &p->pNext;.  
1c220 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
1c230 20 4f 70 65 6e 20 74 68 65 20 73 68 61 72 65 64   Open the shared
1c240 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73  -memory area ass
1c250 6f 63 69 61 74 65 64 20 77 69 74 68 20 64 61 74  ociated with dat
1c260 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64  abase file pDbFd
1c270 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65  ..**.** When ope
1c280 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65  ning a new share
1c290 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69  d-memory file, i
1c2a0 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61  f no other insta
1c2b0 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20  nces of that.** 
1c2c0 66 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74  file are current
1c2d0 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73  ly open, in this
1c2e0 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f   process or in o
1c2f0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20  ther processes, 
1c300 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65  then.** the file
1c310 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74   must be truncat
1c320 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  ed to zero lengt
1c330 68 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65  h or have its he
1c340 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2f  ader cleared..*/
1c350 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f  .static int winO
1c360 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
1c370 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 29 7b  winFile *pDbFd){
1c380 0a 20 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d  .  struct winShm
1c390 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1c3a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1c3b0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
1c3c0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
1c3d0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68   winShmNode *pSh
1c3e0 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20 2f 2a 20  mNode = 0;   /* 
1c3f0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d  The underlying m
1c400 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
1c410 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1c440 64 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 77  de */.  struct w
1c450 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 77 3b  inShmNode *pNew;
1c460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
1c470 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 77 69  wly allocated wi
1c480 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e  nShmNode */.  in
1c490 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
1c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c4b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 4e 61 6d   /* Size of zNam
1c4c0 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
1c4d0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
1c4e0 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  pShm==0 );    /*
1c4f0 20 4e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20   Not previously 
1c500 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20  opened */..  /* 
1c510 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
1c520 6f 72 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74  or the new sqlit
1c530 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20  e3_shm object.  
1c540 41 6c 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65  Also speculative
1c550 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
1c560 20 73 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77   space for a new
1c570 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61 6e 64 20   winShmNode and 
1c580 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  filename..  */. 
1c590 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c   p = sqlite3Mall
1c5a0 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1c5b0 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30  p) );.  if( p==0
1c5c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1c5d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
1c5e0 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c  T;.  nName = sql
1c5f0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 44 62  ite3Strlen30(pDb
1c600 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
1c610 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ew = sqlite3Mall
1c620 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a  ocZero( sizeof(*
1c630 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e 61 6d  pShmNode) + nNam
1c640 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66 28 20  e + 17 );.  if( 
1c650 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pNew==0 ){.    s
1c660 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1c670 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1c680 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
1c690 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e  PT;.  }.  pNew->
1c6a0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
1c6b0 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73  r*)&pNew[1];.  s
1c6c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1c6d0 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e  nName+15, pNew->
1c6e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73  zFilename, "%s-s
1c6f0 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  hm", pDbFd->zPat
1c700 68 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 69 6c  h);.  sqlite3Fil
1c710 65 53 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e  eSuffix3(pDbFd->
1c720 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69  zPath, pNew->zFi
1c730 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c  lename);..  /* L
1c740 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  ook to see if th
1c750 65 72 65 20 69 73 20 61 6e 20 65 78 69 73 74 69  ere is an existi
1c760 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68  ng winShmNode th
1c770 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  at can be used..
1c780 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68    ** If no match
1c790 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63  ing winShmNode c
1c7a0 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73 2c  urrently exists,
1c7b0 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   create a new on
1c7c0 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  e..  */.  winShm
1c7d0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1c7e0 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77  for(pShmNode = w
1c7f0 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70  inShmNodeList; p
1c800 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64  ShmNode; pShmNod
1c810 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78  e=pShmNode->pNex
1c820 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e  t){.    /* TBD n
1c830 65 65 64 20 74 6f 20 63 6f 6d 65 20 75 70 20 77  eed to come up w
1c840 69 74 68 20 62 65 74 74 65 72 20 6d 61 74 63 68  ith better match
1c850 20 68 65 72 65 2e 20 20 50 65 72 68 61 70 73 0a   here.  Perhaps.
1c860 20 20 20 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f      ** use FILE_
1c870 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f  ID_BOTH_DIR_INFO
1c880 20 53 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   Structure..    
1c890 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  */.    if( sqlit
1c8a0 65 33 53 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f  e3StrICmp(pShmNo
1c8b0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  de->zFilename, p
1c8c0 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d  New->zFilename)=
1c8d0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
1c8e0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
1c8f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1c900 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
1c910 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20  e{.    pShmNode 
1c920 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77  = pNew;.    pNew
1c930 20 3d 20 30 3b 0a 20 20 20 20 28 28 77 69 6e 46   = 0;.    ((winF
1c940 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d  ile*)(&pShmNode-
1c950 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e  >hFile))->h = IN
1c960 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1c970 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  UE;.    pShmNode
1c980 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d  ->pNext = winShm
1c990 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 69  NodeList;.    wi
1c9a0 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70  nShmNodeList = p
1c9b0 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53  ShmNode;..    pS
1c9c0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
1c9d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1c9e0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1c9f0 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
1ca00 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
1ca10 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1ca20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1ca30 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
1ca40 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
1ca50 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  r;.    }..    rc
1ca60 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
1ca70 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
1ca80 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1ca90 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
1caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1cab0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1cac0 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
1cad0 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1cae0 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
1caf0 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
1cb00 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1cb10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1cb20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1cb30 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
1cb40 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1cb50 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1cb60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cb70 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
1cb80 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1cb90 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1cba0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1cbb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1cbc0 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1cbd0 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1cbe0 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1cbf0 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1cc00 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1cc10 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1cc20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20  length..    */. 
1cc30 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
1cc40 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1cc50 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
1cc60 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1cc70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cc80 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1cc90 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1cca0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1ccb0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1ccc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ccd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1cce0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1ccf0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1cd00 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1cd10 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1cd30 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1cd40 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1cd50 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1cd60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1cd70 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1cd80 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1cd90 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1cda0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1cdb0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1cdc0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1cdd0 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1cde0 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1cdf0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1ce00 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1ce10 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1ce20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1ce30 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1ce40 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
1ce50 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1ce60 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1ce70 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1ce80 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1ce90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1cea0 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 70  VE_OS_TRACE).  p
1ceb0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1cec0 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1ced0 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1cee0 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1cef0 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
1cf00 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1cf10 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
1cf20 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
1cf30 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
1cf40 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
1cf50 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
1cf60 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
1cf70 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1cf80 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1cf90 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1cfa0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1cfb0 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
1cfc0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
1cfd0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
1cfe0 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
1cff0 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
1d000 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
1d010 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
1d020 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
1d030 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
1d040 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
1d050 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
1d060 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
1d070 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
1d080 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  ex.  ** mutex.. 
1d090 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1d0a0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1d0b0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
1d0c0 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
1d0d0 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
1d0e0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
1d0f0 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
1d100 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1d110 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1d120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1d130 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
1d140 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
1d150 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
1d160 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1d170 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1d180 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
1d190 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
1d1a0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1d1b0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
1d1c0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1d1d0 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1d1e0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1d1f0 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
1d200 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1d210 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1d220 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1d230 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1d240 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1d250 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1d260 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1d270 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67  rlying.** storag
1d280 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
1d290 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
1d2a0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
1d2b0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1d2c0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1d2d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1d2e0 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1d2f0 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
1d300 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
1d310 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
1d320 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
1d330 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
1d340 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
1d350 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1d360 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
1d370 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1d380 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1d390 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1d3a0 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
1d3b0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1d3c0 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
1d3d0 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
1d3e0 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1d3f0 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
1d400 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1d410 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
1d420 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1d430 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
1d440 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
1d450 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1d460 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1d470 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d480 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1d490 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
1d4a0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1d4b0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1d4c0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1d4d0 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1d4e0 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1d4f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1d500 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1d510 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1d520 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1d530 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1d540 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1d550 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1d560 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1d570 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1d580 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1d590 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1d5a0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1d5b0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1d5c0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1d5d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1d5e0 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1d5f0 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1d600 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1d610 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1d620 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1d630 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1d640 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
1d650 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
1d660 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
1d670 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
1d680 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1d690 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
1d6a0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1d6b0 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
1d6c0 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
1d6d0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
1d6e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d6f0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1d700 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
1d710 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
1d720 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
1d730 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
1d740 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
1d750 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1d760 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1d770 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1d780 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1d790 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d7b0 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
1d7c0 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1d7d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
1d800 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
1d810 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1d820 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
1d830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
1d840 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1d850 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
1d860 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
1d870 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
1d880 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1d890 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
1d8a0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
1d8b0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1d8c0 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1d8d0 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1d8e0 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1d8f0 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
1d900 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d920 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1d930 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1d940 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1d950 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
1d960 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1d970 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d990 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1d9a0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d9d0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1d9e0 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1d9f0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
1da00 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1da10 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1da20 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1da30 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1da40 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1da50 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1da60 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1da70 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1da80 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1da90 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1daa0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1dab0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1dac0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1dad0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1dae0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1daf0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1db00 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1db10 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1db20 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1db30 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1db40 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1db50 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1db60 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1db70 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1db80 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1db90 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1dba0 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1dbb0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1dbc0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1dbd0 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1dbe0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1dbf0 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1dc00 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1dc10 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1dc20 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1dc30 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1dc40 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1dc50 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1dc60 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1dc70 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1dc80 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1dc90 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1dca0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1dcb0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1dcc0 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1dcd0 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1dce0 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1dcf0 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1dd00 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1dd10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1dd20 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1dd30 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1dd40 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1dd50 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1dd60 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1dd70 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1dd80 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1dd90 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1dda0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1ddb0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1ddc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1ddd0 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1dde0 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1ddf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1de00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1de10 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1de20 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1de30 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1de40 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1de50 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1de60 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1de70 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1de80 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1de90 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1dea0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1deb0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1dec0 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1ded0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1dee0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1def0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1df00 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1df10 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1df20 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1df30 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1df40 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1df50 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1df60 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1df70 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1df80 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1df90 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1dfa0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1dfb0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1dfc0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1dfd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1dfe0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1dff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1e000 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1e010 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1e020 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1e030 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1e040 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1e050 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1e060 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e070 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1e080 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1e090 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1e0a0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1e0b0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1e0c0 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1e0d0 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1e0e0 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1e0f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1e100 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e110 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1e120 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1e130 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1e140 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e150 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e160 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1e170 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1e180 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1e190 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1e1a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1e1b0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1e1c0 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1e1d0 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1e1e0 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1e1f0 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1e200 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1e210 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1e220 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1e230 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1e240 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1e250 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1e260 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1e270 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1e280 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e290 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1e2a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1e2b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1e2c0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1e2d0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1e2e0 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
1e2f0 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
1e300 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
1e310 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
1e320 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
1e330 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
1e340 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e350 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1e360 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1e370 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1e380 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
1e390 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1e3a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1e3b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1e3c0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1e3d0 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1e3e0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1e3f0 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1e400 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1e410 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1e420 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1e430 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1e440 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1e450 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d  OCK pid=%lu, id=
1e460 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25  %d, sharedMask=%
1e470 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30  03x, exclMask=%0
1e480 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  3x, rc=%s\n",.  
1e490 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1e4a0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1e4b0 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72  , p->id, p->shar
1e4c0 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1e4d0 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
1e4e0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1e4f0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1e500 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
1e510 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
1e520 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
1e530 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
1e540 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41   memory..**.** A
1e550 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
1e560 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
1e570 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
1e580 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
1e590 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
1e5a0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
1e5b0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
1e5c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1e5d0 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
1e5e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1e5f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1e600 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
1e610 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1e620 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1e630 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1e640 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72  sqlite3MemoryBar
1e650 72 69 65 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d  rier();   /* com
1e660 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65  piler-defined me
1e670 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a  mory barrier */.
1e680 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1e690 65 78 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  ex();       /* A
1e6a0 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
1e6b0 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 77  edundancy */.  w
1e6c0 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1e6d0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1e6e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1e6f0 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
1e700 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
1e710 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
1e720 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
1e730 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1e740 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
1e750 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
1e760 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a  emory regions.**
1e770 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1e780 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1e790 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1e7a0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1e7b0 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73  zRegion.** bytes
1e7c0 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1e7d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1e7e0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1e7f0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1e800 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1e810 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1e820 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1e830 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1e840 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1e850 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1e860 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1e870 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1e880 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1e890 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1e8a0 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1e8b0 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1e8c0 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1e8d0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1e8e0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1e8f0 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57  urned. If.** isW
1e900 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1e910 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1e920 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1e930 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1e940 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  yet.** been allo
1e950 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1e960 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1e970 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1e980 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1e990 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1e9a0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1e9b0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1e9c0 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1e9d0 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1e9e0 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1e9f0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1ea00 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a   this processes.
1ea10 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1ea20 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1ea30 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1ea40 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1ea50 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65  the mapped.** me
1ea60 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
1ea70 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
1ea80 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1ea90 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1eaa0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1eab0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1eac0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1ead0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1eae0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eb00 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1eb10 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1eb20 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1eb30 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1eb40 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1eb50 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20  int isWrite,    
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1eb80 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1eb90 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1eba0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1ebb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1ebc0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1ebd0 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1ebe0 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1ebf0 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a  *)fd;.  winShm *
1ec00 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53  pShm = pDbFd->pS
1ec10 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1ec20 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1ec30 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1ec40 3b 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29  ;..  if( !pShm )
1ec50 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1ec60 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1ec70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1ec80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1ec90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53  eturn rc;.    pS
1eca0 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  hm = pDbFd->pShm
1ecb0 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
1ecc0 20 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64   = pShm->pShmNod
1ecd0 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
1ece0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1ecf0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
1ed00 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
1ed10 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1ed20 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
1ed30 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
1ed40 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1ed50 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1ed60 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
1ed70 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
1ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1ed90 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
1eda0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1edb0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1edc0 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1edd0 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1ede0 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1edf0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1ee00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ee10 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
1ee20 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
1ee30 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
1ee40 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1ee50 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1ee60 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1ee70 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
1ee80 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1ee90 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1eea0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
1eeb0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1eec0 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
1eed0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
1eee0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
1eef0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
1ef00 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1ef10 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1ef20 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1ef30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
1ef40 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1ef50 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1ef60 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
1ef70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ef80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1ef90 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1efa0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1efb0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1efc0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1efe0 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
1eff0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1f000 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1f010 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
1f020 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
1f030 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1f040 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1f050 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1f060 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
1f070 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1f080 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
1f090 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1f0a0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1f0b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1f0c0 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1f0d0 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1f0e0 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
1f0f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
1f100 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1f110 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1f120 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1f130 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1f140 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1f150 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
1f160 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1f170 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1f180 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1f190 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1f1a0 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
1f1b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f1c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f1d0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1f1e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1f1f0 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1f200 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f220 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
1f230 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1f240 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1f250 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1f260 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1f270 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1f280 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1f290 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1f2a0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1f2b0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1f2c0 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
1f2d0 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
1f2e0 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20  realloc64(.     
1f2f0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1f300 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1f310 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1f320 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1f330 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1f340 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1f350 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1f360 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1f370 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1f380 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1f390 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1f3a0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1f3b0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1f3c0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1f3d0 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1f3e0 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1f3f0 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1f400 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1f410 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1f420 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1f430 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1f440 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1f450 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1f460 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1f470 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1f480 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1f490 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1f4a0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1f4b0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1f4c0 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1f4d0 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1f4e0 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1f4f0 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1f500 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1f510 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1f520 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1f530 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1f540 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1f550 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1f560 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1f570 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
1f580 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
1f590 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
1f5a0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1f5b0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
1f5c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
1f5d0 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
1f5e0 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
1f5f0 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
1f600 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
1f610 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
1f620 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
1f630 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
1f640 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
1f650 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
1f660 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f670 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f680 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1f690 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
1f6a0 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
1f6b0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1f6c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
1f6d0 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
1f6e0 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
1f6f0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
1f700 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
1f710 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
1f720 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
1f730 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
1f740 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
1f750 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1f760 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
1f770 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
1f780 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
1f790 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
1f7a0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
1f7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
1f7c0 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
1f7d0 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
1f7e0 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
1f7f0 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
1f800 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
1f810 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
1f820 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
1f830 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
1f840 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
1f850 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
1f860 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
1f870 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
1f880 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
1f890 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
1f8a0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
1f8b0 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
1f8c0 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
1f8d0 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
1f8e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f8f0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
1f900 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
1f910 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
1f920 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
1f930 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
1f940 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
1f950 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
1f960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f970 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
1f980 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
1f990 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
1f9a0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
1f9b0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1f9c0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1f9d0 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
1f9e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
1fa10 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
1fa20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
1fa30 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
1fa40 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
1fa50 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
1fa60 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
1fa70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
1fa80 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
1fa90 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
1faa0 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
1fab0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
1fac0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
1fad0 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
1fae0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
1faf0 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
1fb00 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
1fb10 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
1fb20 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
1fb30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
1fb40 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
1fb50 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
1fb60 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
1fb70 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
1fb80 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
1fb90 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
1fba0 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
1fbb0 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
1fbc0 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
1fbd0 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
1fbe0 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
1fbf0 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
1fc00 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
1fc10 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
1fc20 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1fc30 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1fc40 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
1fc50 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
1fc60 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
1fc70 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
1fc80 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
1fc90 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
1fca0 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
1fcb0 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
1fcc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1fcd0 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
1fce0 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
1fcf0 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
1fd00 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
1fd10 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
1fd20 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1fd30 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
1fd40 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
1fd50 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
1fd60 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
1fd70 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
1fd80 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
1fd90 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
1fda0 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
1fdb0 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
1fdc0 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
1fdd0 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
1fde0 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
1fdf0 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
1fe00 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1fe10 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1fe20 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
1fe30 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
1fe40 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
1fe50 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1fe60 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
1fe70 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
1fe80 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1fe90 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
1fea0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
1feb0 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
1fec0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
1fed0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
1fee0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
1fef0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
1ff00 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
1ff10 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
1ff20 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
1ff30 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
1ff40 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
1ff50 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
1ff60 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
1ff70 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
1ff80 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
1ff90 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
1ffa0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
1ffb0 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
1ffc0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
1ffd0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
1ffe0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
1fff0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20010 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
20020 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
20030 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
20040 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
20050 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
20060 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
20070 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
20080 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
20090 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
200a0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
200b0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
200c0 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
200d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
200e0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
200f0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
20100 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
20110 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
20120 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
20130 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20140 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
20150 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20160 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20170 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
20180 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
20190 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
201a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
201b0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
201c0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
201e0 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
201f0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20200 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
20210 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
20220 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20230 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20240 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
20250 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
20260 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20270 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20280 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
20290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
202a0 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
202b0 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
202c0 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
202d0 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
202e0 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
202f0 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
20300 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
20310 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
20320 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
20330 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
20340 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
20350 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
20360 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
20370 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
20380 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
20390 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
203a0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
203b0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
203c0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
203d0 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
203e0 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
203f0 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
20400 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
20410 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
20420 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
20430 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
20440 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
20450 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
20460 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
20470 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
20480 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
20490 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
204a0 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
204b0 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
204c0 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
204d0 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
204e0 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
204f0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
20500 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
20510 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
20520 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20530 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
20540 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
20550 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
20560 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
20570 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
20580 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
20590 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
205a0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
205b0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
205c0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
205d0 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
205e0 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
205f0 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
20600 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
20610 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
20620 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
20630 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
20640 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
20650 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
20660 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
20670 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
20680 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
20690 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
206a0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
206b0 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
206c0 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
206d0 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
206e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
206f0 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
20700 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
20710 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
20720 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
20730 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
20740 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
20750 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
20760 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
20770 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
20780 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
20790 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
207a0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
207b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
207c0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
207d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
207e0 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
207f0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
20800 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
20810 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
20820 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
20830 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
20840 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
20850 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
20860 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
20870 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
20880 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
20890 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
208a0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
208b0 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
208c0 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
208d0 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
208e0 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
208f0 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
20900 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
20910 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66 64  pfile(pFd);.#ifd
20920 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ef SQLITE_MMAP_R
20930 45 41 44 57 52 49 54 45 0a 20 20 20 20 69 66 28  EADWRITE.    if(
20940 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
20950 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
20960 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)==0 ){.      p
20970 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
20980 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66  ADWRITE;.      f
20990 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50  lags |= FILE_MAP
209a0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 65  _WRITE;.    }.#e
209b0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
209c0 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
209d0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
209e0 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
209f0 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
20a00 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
20a10 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
20a20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
20a30 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
20a40 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
20a50 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
20a60 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
20a70 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a90 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
20aa0 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
20ab0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
20ae0 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
20af0 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
20b00 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
20b10 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
20b20 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  I) && SQLITE_WIN
20b30 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50  32_CREATEFILEMAP
20b40 50 49 4e 47 41 0a 20 20 20 20 70 46 64 2d 3e 68  PINGA.    pFd->h
20b50 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
20b60 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
20b70 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
20b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
20bb0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
20bc0 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20be0 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
20bf0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
20c00 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
20c10 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
20c20 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
20c30 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
20c40 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
20c50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
20c60 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20c70 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
20c80 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
20c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ca0 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
20cb0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
20cc0 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
20cd0 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
20ce0 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
20cf0 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
20d00 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
20d10 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
20d20 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
20d30 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
20d40 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
20d50 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
20d60 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20d70 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
20d80 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
20d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20da0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
20db0 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
20dc0 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
20dd0 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
20de0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
20df0 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
20e00 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
20e10 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
20e20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
20e30 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
20e40 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
20e50 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
20e60 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
20e70 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
20e80 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
20e90 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
20ea0 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
20eb0 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
20ec0 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
20ed0 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
20ee0 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
20ef0 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
20f00 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
20f10 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
20f20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
20f30 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
20f40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
20f50 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
20f60 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
20f70 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
20f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f90 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
20fa0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
20fb0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
20fc0 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
20fd0 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
20fe0 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
20ff0 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
21000 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
21010 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
21020 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
21030 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
21040 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21050 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21060 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
21070 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
21080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21090 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
210a0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
210b0 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
210c0 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
210d0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
210e0 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
210f0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
21100 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
21110 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
21120 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
21130 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21140 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
21150 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
21160 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
21170 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
21180 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
21190 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
211a0 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
211b0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
211c0 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
211d0 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
211e0 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
211f0 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
21200 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
21210 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
21220 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
21230 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
21240 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
21250 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
21260 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
21270 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
21280 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
21290 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
212a0 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
212b0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
212c0 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
212d0 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
212e0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
212f0 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
21300 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
21310 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
21320 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
21330 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
21340 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
21350 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
21360 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
21370 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73  tually.** releas
21380 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
21390 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
213a0 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
213b0 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
213c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
213d0 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
213e0 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
213f0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
21400 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
21410 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
21420 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
21430 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21440 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21450 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
21460 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
21470 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
21480 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
21490 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
214a0 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
214b0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
214c0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
214d0 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
214e0 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
214f0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21500 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
21510 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
21520 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
21530 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
21540 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
21550 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
21560 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21570 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21580 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
21590 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
215a0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215c0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
215d0 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
215e0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
215f0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
21600 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
21610 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
21620 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
21630 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
21640 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
21650 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
21660 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
21670 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
21680 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
21690 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
216a0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
216b0 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
216c0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
216d0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
216e0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
216f0 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
21700 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
21710 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21720 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
21730 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
21740 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
21750 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
21760 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65  ases a.** refere
21770 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
21780 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
21790 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
217a0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
217b0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
217c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
217d0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
217e0 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
217f0 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
21800 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
21810 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
21820 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ) invocation..**
21830 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
21840 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
21850 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
21860 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
21870 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20  ng called.** to 
21880 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
21890 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
218a0 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
218b0 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
218c0 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ing.** may now b
218d0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
218e0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
218f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21900 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
21910 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
21920 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
21930 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
21940 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
21950 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
21960 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
21970 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
21980 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
21990 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
219a0 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
219b0 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
219c0 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
219d0 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65  tanding.  ** xFe
219e0 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
219f0 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
21a00 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
21a10 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
21a20 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
21a30 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
21a40 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
21a50 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
21a60 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
21a70 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
21a80 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
21a90 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
21aa0 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
21ab0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
21ac0 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
21ad0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
21ae0 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
21af0 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
21b00 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
21b10 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
21b20 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
21b30 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
21b40 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
21b50 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
21b60 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
21b70 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
21b80 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
21b90 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
21ba0 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
21bb0 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
21bc0 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
21bd0 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
21be0 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
21bf0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
21c00 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
21c10 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
21c20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
21c30 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20  an be omitted - 
21c40 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72  potentially impr
21c50 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72  oving.    ** per
21c60 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20  formance.  */.  
21c70 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
21c80 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
21c90 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
21ca0 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut>=0 );.#endif.
21cb0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
21cc0 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21cd0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
21ce0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
21cf0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
21d00 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29  ProcessId(), fd)
21d10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21d20 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21d30 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
21d40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
21d50 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
21d60 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
21d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d80 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
21d90 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
21da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
21dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
21e10 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
21e20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
21e30 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
21e40 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
21e50 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
21e60 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61  or win32..*/.sta
21e70 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
21e80 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e  3_io_methods win
21e90 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33  IoMethod = {.  3
21ea0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21ec0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
21ed0 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  winClose,       
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77  /* xClose */.  w
21f00 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  inRead,         
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f20 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e  * xRead */.  win
21f30 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f50 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54  xWrite */.  winT
21f60 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
21f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21f80 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69  Truncate */.  wi
21f90 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  nSync,          
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21fb0 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46   xSync */.  winF
21fc0 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
21fe0 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69  FileSize */.  wi
21ff0 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nLock,          
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22010 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55   xLock */.  winU
22020 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
22030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22040 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43  Unlock */.  winC
22050 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22060 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
22070 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22080 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f  k */.  winFileCo
22090 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
220a0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
220b0 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53  ontrol */.  winS
220c0 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
220d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
220e0 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
220f0 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
22100 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20  eristics,       
22110 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
22120 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77  teristics */.  w
22130 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  inShmMap,       
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22150 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77  * xShmMap */.  w
22160 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  inShmLock,      
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22180 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20  * xShmLock */.  
22190 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20  winShmBarrier,  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
221c0 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c  /.  winShmUnmap,
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
221f0 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20   */.  winFetch, 
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
22220 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20  */.  winUnfetch 
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
22250 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   */.};../*******
22260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222a0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
222b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222c0 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
222d0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
222e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222f0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
22300 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
22310 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
22320 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
22330 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
22340 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
22350 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
22360 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43  YGWIN__)./*.** C
22370 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d  onvert a filenam
22380 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20  e from whatever 
22390 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
223a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
223b0 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20  ** supports for 
223c0 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55  filenames into U
223d0 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
223e0 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20  hold the result 
223f0 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
22400 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
22410 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22420 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
22430 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
22440 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74  char *winConvert
22450 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  ToUtf8Filename(c
22460 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
22470 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
22480 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
22490 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
224a0 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
224b0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
224c0 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
224d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
224e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
224f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
22500 76 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33  verted = sqlite3
22510 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
22520 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  tf8(zFilename);.
22530 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20    }.#endif.  /* 
22540 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64  caller will hand
22550 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  le out of memory
22560 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f   */.  return zCo
22570 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65 6e 64 69  nverted;.}.#endi
22580 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
22590 20 61 20 55 54 46 2d 38 20 66 69 6c 65 6e 61 6d   a UTF-8 filenam
225a0 65 20 69 6e 74 6f 20 77 68 61 74 65 76 65 72 20  e into whatever 
225b0 66 6f 72 6d 20 74 68 65 20 75 6e 64 65 72 6c 79  form the underly
225c0 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  ing.** operating
225d0 20 73 79 73 74 65 6d 20 77 61 6e 74 73 20 66 69   system wants fi
225e0 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20 53 70 61  lenames in.  Spa
225f0 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
22600 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f 62 74 61  esult.** is obta
22610 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
22620 20 61 6e 64 20 6d 75 73 74 20 62 65 20 66 72 65   and must be fre
22630 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ed by the callin
22640 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  g.** function..*
22650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
22660 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
22670 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e 73 74 20  8Filename(const 
22680 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
22690 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  {.  void *zConve
226a0 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20  rted = 0;.  if( 
226b0 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  osIsNT() ){.    
226c0 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
226d0 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46  Utf8ToUnicode(zF
226e0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23 69  ilename);.  }.#i
226f0 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
22700 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
22710 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65  e{.    zConverte
22720 64 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  d = sqlite3_win3
22730 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 28 7a  2_utf8_to_mbcs(z
22740 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 23  Filename);.  }.#
22750 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
22760 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
22770 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
22780 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
22790 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
227a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
227b0 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
227c0 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46  he specified UTF
227d0 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72  -8 string buffer
227e0 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20  .** ends with a 
227f0 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
22800 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72  tor character or
22810 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73   one was success
22820 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74  fully.** added t
22830 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o it..*/.static 
22840 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  int winMakeEndIn
22850 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c  DirSep(int nBuf,
22860 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
22870 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20  if( zBuf ){.    
22880 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  int nLen = sqlit
22890 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
228a0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30  ;.    if( nLen>0
228b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69   ){.      if( wi
228c0 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e  nIsDirSep(zBuf[n
228d0 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
228e0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
228f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65     }else if( nLe
22900 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20  n+1<nBuf ){.    
22910 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d      zBuf[nLen] =
22920 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b   winGetDirSep();
22930 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
22940 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en+1] = '\0';.  
22950 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
22960 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22970 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22980 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
22990 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
229a0 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ame and store th
229b0 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e  e resulting poin
229c0 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a  ter into pzBuf..
229d0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
229e0 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66  eturned in pzBuf
229f0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76   must be freed v
22a00 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ia sqlite3_free(
22a10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
22a20 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
22a30 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
22a40 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29  s, char **pzBuf)
22a50 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
22a60 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
22a70 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
22a80 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
22a90 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
22aa0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
22ab0 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
22ac0 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
22ad0 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74  int nPre = sqlit
22ae0 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54  e3Strlen30(SQLIT
22af0 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
22b00 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c  IX);.  int nMax,
22b10 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65   nBuf, nDir, nLe
22b20 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
22b30 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
22b40 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
22b50 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
22b60 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
22b70 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
22b80 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
22b90 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
22ba0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
22bb0 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
22bc0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
22bd0 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ing..  */.  Simu
22be0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
22bf0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
22c00 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
22c10 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  te a temporary b
22c20 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
22c30 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
22c40 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ed file.  ** nam
22c50 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  e for the tempor
22c60 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ary file.  If th
22c70 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e  is fails, we can
22c80 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20  not continue..  
22c90 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73  */.  nMax = pVfs
22ca0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42  ->mxPathname; nB
22cb0 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20  uf = nMax + 2;. 
22cc0 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d   zBuf = sqlite3M
22cd0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20  allocZero( nBuf 
22ce0 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  );.  if( !zBuf )
22cf0 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
22d00 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22d10 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
22d20 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  MEM\n"));.    re
22d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
22d40 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
22d50 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
22d60 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
22d70 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
22d80 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68  tory.  First, ch
22d90 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  eck if one.  ** 
22da0 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69  has been explici
22db0 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61  tly set by the a
22dc0 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65  pplication; othe
22dd0 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f  rwise, use the o
22de0 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  ne.  ** configur
22df0 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74  ed by the operat
22e00 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ing system..  */
22e10 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d  .  nDir = nMax -
22e20 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20   (nPre + 15);.  
22e30 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29  assert( nDir>0 )
22e40 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
22e50 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
22e60 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65  {.    int nDirLe
22e70 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
22e80 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  n30(sqlite3_temp
22e90 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
22ea0 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29   if( nDirLen>0 )
22eb0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e  {.      if( !win
22ec0 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33  IsDirSep(sqlite3
22ed0 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b  _temp_directory[
22ee0 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  nDirLen-1]) ){. 
22ef0 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b         nDirLen++
22f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22f10 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72  if( nDirLen>nDir
22f20 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22f30 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
22f40 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
22f50 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
22f60 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
22f70 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  n"));.        re
22f80 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
22f90 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
22fa0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
22fb0 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e1", 0);.      }
22fc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
22fd0 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
22fe0 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  uf, "%s", sqlite
22ff0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
23000 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  );.    }.  }.#if
23010 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
23020 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20  N__).  else{.   
23030 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
23040 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
23050 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
23060 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
23070 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
23080 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
23090 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
230a0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
230b0 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
230c0 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d  , /* getenv("TEM
230d0 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
230e0 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52   /* getenv("USER
230f0 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20  PROFILE") */.   
23100 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
23110 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70         "/usr/tmp
23120 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22  ",.       "/tmp"
23130 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20  ,.       ".",.  
23140 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
23150 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
23160 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
23170 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
23180 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23190 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Dir = 0;..    if
231a0 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
231b0 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
231c0 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
231d0 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
231e0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
231f0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
23200 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
23210 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
23220 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
23230 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  TMP");.    if( !
23240 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69  azDirs[3] ) azDi
23250 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[3] = getenv("
23260 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  TEMP");.    if( 
23270 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44  !azDirs[4] ) azD
23280 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28  irs[4] = getenv(
23290 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
232a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
232b0 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
232c0 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
232d0 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
232e0 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ]){.      void *
232f0 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
23300 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
23310 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23320 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73  /* If the path s
23330 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
23340 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77  ve letter follow
23350 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a  ed by the colon.
23360 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74        ** charact
23370 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73  er, assume it is
23380 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76   already a nativ
23390 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74  e Win32 path; ot
233a0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
233b0 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e  * it must be con
233c0 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69  verted to a nati
233d0 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69  ve Win32 path vi
233e0 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49  a the Cygwin API
233f0 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20  .      ** prior 
23400 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20  to using it..   
23410 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23420 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
23430 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29  AndColon(zDir) )
23440 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
23450 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
23460 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
23470 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  e(zDir);.       
23480 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64   if( !zConverted
23490 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
234a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
234b0 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
234c0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
234d0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
234e0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
234f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23500 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23510 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
23520 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23530 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
23540 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
23550 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23560 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
23570 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  %s", zDir);.    
23580 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23590 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
235a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
235b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
235c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
235d0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
235e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
235f0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
23600 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
23610 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20  ( nMax+1 );.    
23620 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
23630 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
23640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23650 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
23660 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23670 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
23680 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
23690 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
236a0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
236b0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
236c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
236d0 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
236e0 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
236f0 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20       osIsNT() ? 
23700 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
23710 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
23720 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20  O_WIN_A, zDir,. 
23730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
23740 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b  Converted, nMax+
23750 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1)<0 ){.        
23760 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23770 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
23780 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23790 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
237a0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
237b0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
237c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
237d0 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
237e0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
237f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
23800 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OERR_CONVPATH, (
23810 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
23820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23830 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
23840 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69  tTempname2", zDi
23850 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
23860 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
23870 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
23880 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
23890 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
238a0 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64   know the candid
238b0 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78  ate directory ex
238c0 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a  ists and should.
238d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
238e0 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  used.  However, 
238f0 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63  we may need to c
23900 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e  onvert the strin
23910 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  g containing.   
23920 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61         ** its na
23930 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69  me into UTF-8 (i
23940 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46  .e. if it is UTF
23950 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  -16 right now)..
23960 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23970 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74         char *zUt
23980 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
23990 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43  oUtf8Filename(zC
239a0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
239b0 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
239c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
239d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
239e0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
239f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
23a00 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
23a10 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23a20 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23a30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23a40 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
23a50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23a60 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
23a70 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
23a80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23a90 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
23aa0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
23ab0 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
23ac0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
23ad0 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
23ae0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23af0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
23b00 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23b10 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23b20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
23b30 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
23b40 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53    }.  }.#elif !S
23b50 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
23b60 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
23b70 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
23b80 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
23b90 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
23ba0 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
23bb0 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
23bc0 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73  llocZero( nMax*s
23bd0 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
23be0 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61      if( !zWidePa
23bf0 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
23c00 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23c10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23c20 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23c30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23c40 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
23c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23c60 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
23c70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
23c80 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
23c90 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
23ca0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23cb0 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
23cc0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23cd0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
23ce0 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
23cf0 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
23d00 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
23d10 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
23d20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
23d30 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
23d40 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
23d50 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
23d60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23d70 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
23d80 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
23d90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
23da0 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
23db0 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
23dc0 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
23dd0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
23de0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
23df0 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
23e00 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
23e10 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
23e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
23e30 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
23e40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23e50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23e60 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
23e70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23e80 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
23e90 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23ea0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
23eb0 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
23ec0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23ed0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
23ee0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
23ef0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
23f00 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
23f10 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
23f20 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
23f30 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
23f40 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
23f50 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
23f60 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
23f70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23f80 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
23f90 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23fa0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23fb0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
23fc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23fd0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
23fe0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
23ff0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
24000 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61  hA(nMax, zMbcsPa
24010 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
24020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
24030 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
24040 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24050 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24060 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
24070 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24080 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24090 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
240a0 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
240b0 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
240e0 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e3", 0);.    }. 
240f0 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
24100 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
24110 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
24120 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
24130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24140 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
24150 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
24160 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
24170 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
24180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
241a0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
241b0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
241c0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
241d0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
241e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
241f0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
24200 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  PT;.    }.  }.#e
24210 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
24220 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 20 2a 2f  IN32_HAS_ANSI */
24230 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
24240 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f 0a 0a  TE_OS_WINRT */..
24250 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20    /*.  ** Check 
24260 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
24270 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
24280 74 6f 72 79 20 65 6e 64 73 20 77 69 74 68 20 61  tory ends with a
24290 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 20 20  n appropriate.  
242a0 2a 2a 20 73 65 70 61 72 61 74 6f 72 2e 20 20 49  ** separator.  I
242b0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6e  f it does not an
242c0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 65  d there is not e
242d0 6e 6f 75 67 68 20 73 70 61 63 65 20 6c 65 66 74  nough space left
242e0 20 74 6f 20 61 64 64 0a 20 20 2a 2a 20 6f 6e 65   to add.  ** one
242f0 2c 20 66 61 69 6c 2e 0a 20 20 2a 2f 0a 20 20 69  , fail..  */.  i
24300 66 28 20 21 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  f( !winMakeEndIn
24310 44 69 72 53 65 70 28 6e 44 69 72 2b 31 2c 20 7a  DirSep(nDir+1, z
24320 42 75 66 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Buf) ){.    sqli
24330 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24340 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
24350 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
24360 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
24370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
24380 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24390 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
243a0 74 54 65 6d 70 6e 61 6d 65 34 22 2c 20 30 29 3b  tTempname4", 0);
243b0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
243c0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6f  Check that the o
243d0 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73 20  utput buffer is 
243e0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f 72  large enough for
243f0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
24400 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d 65 20 69 6e  ile.  ** name in
24410 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
24420 6f 72 6d 61 74 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ormat:.  **.  **
24430 20 20 20 22 3c 74 65 6d 70 6f 72 61 72 79 5f 64     "<temporary_d
24440 69 72 65 63 74 6f 72 79 3e 2f 65 74 69 6c 71 73  irectory>/etilqs
24450 5f 58 58 58 58 58 58 58 58 58 58 58 58 58 58 58  _XXXXXXXXXXXXXXX
24460 5c 30 5c 30 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20  \0\0".  **.  ** 
24470 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  If not, return S
24480 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 20 54 68  QLITE_ERROR.  Th
24490 65 20 6e 75 6d 62 65 72 20 31 37 20 69 73 20 75  e number 17 is u
244a0 73 65 64 20 68 65 72 65 20 69 6e 20 6f 72 64 65  sed here in orde
244b0 72 20 74 6f 0a 20 20 2a 2a 20 61 63 63 6f 75 6e  r to.  ** accoun
244c0 74 20 66 6f 72 20 74 68 65 20 73 70 61 63 65 20  t for the space 
244d0 75 73 65 64 20 62 79 20 74 68 65 20 31 35 20 63  used by the 15 c
244e0 68 61 72 61 63 74 65 72 20 72 61 6e 64 6f 6d 20  haracter random 
244f0 73 75 66 66 69 78 20 61 6e 64 20 74 68 65 0a 20  suffix and the. 
24500 20 2a 2a 20 74 77 6f 20 74 72 61 69 6c 69 6e 67   ** two trailing
24510 20 4e 55 4c 20 63 68 61 72 61 63 74 65 72 73 2e   NUL characters.
24520 20 20 54 68 65 20 66 69 6e 61 6c 20 64 69 72 65    The final dire
24530 63 74 6f 72 79 20 73 65 70 61 72 61 74 6f 72 20  ctory separator 
24540 63 68 61 72 61 63 74 65 72 0a 20 20 2a 2a 20 68  character.  ** h
24550 61 73 20 61 6c 72 65 61 64 79 20 61 64 64 65 64  as already added
24560 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61   if it was not a
24570 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2e 0a  lready present..
24580 20 20 2a 2f 0a 20 20 6e 4c 65 6e 20 3d 20 73 71    */.  nLen = sq
24590 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
245a0 75 66 29 3b 0a 20 20 69 66 28 20 28 6e 4c 65 6e  uf);.  if( (nLen
245b0 20 2b 20 6e 50 72 65 20 2b 20 31 37 29 20 3e 20   + nPre + 17) > 
245c0 6e 42 75 66 20 29 7b 0a 20 20 20 20 73 71 6c 69  nBuf ){.    sqli
245d0 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
245e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
245f0 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
24600 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22 29 29  QLITE_ERROR\n"))
24610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e  ;.    return win
24620 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
24630 45 52 52 4f 52 2c 20 30 2c 20 22 77 69 6e 47 65  ERROR, 0, "winGe
24640 74 54 65 6d 70 6e 61 6d 65 35 22 2c 20 30 29 3b  tTempname5", 0);
24650 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
24660 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 36  snprintf(nBuf-16
24670 2d 6e 4c 65 6e 2c 20 7a 42 75 66 2b 6e 4c 65 6e  -nLen, zBuf+nLen
24680 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49  , SQLITE_TEMP_FI
24690 4c 45 5f 50 52 45 46 49 58 29 3b 0a 0a 20 20 6a  LE_PREFIX);..  j
246a0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
246b0 33 30 28 7a 42 75 66 29 3b 0a 20 20 73 71 6c 69  30(zBuf);.  sqli
246c0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
246d0 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
246e0 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69  for(i=0; i<15; i
246f0 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 7a 42  ++, j++){.    zB
24700 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43  uf[j] = (char)zC
24710 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64  hars[ ((unsigned
24720 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28   char)zBuf[j])%(
24730 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
24740 29 20 5d 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b  ) ];.  }.  zBuf[
24750 6a 5d 20 3d 20 30 3b 0a 20 20 7a 42 75 66 5b 6a  j] = 0;.  zBuf[j
24760 2b 31 5d 20 3d 20 30 3b 0a 20 20 2a 70 7a 42 75  +1] = 0;.  *pzBu
24770 66 20 3d 20 7a 42 75 66 3b 0a 0a 20 20 4f 53 54  f = zBuf;..  OST
24780 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
24790 4e 41 4d 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  NAME name=%s, rc
247a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 7a  =SQLITE_OK\n", z
247b0 42 75 66 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Buf));.  return 
247c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
247d0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
247e0 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  if the named fil
247f0 65 20 69 73 20 72 65 61 6c 6c 79 20 61 20 64 69  e is really a di
24800 72 65 63 74 6f 72 79 2e 20 20 52 65 74 75 72 6e  rectory.  Return
24810 20 66 61 6c 73 65 20 69 66 0a 2a 2a 20 69 74 20   false if.** it 
24820 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  is something oth
24830 65 72 20 74 68 61 6e 20 61 20 64 69 72 65 63 74  er than a direct
24840 6f 72 79 2c 20 6f 72 20 69 66 20 74 68 65 72 65  ory, or if there
24850 20 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20   is any kind of 
24860 6d 65 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61  memory.** alloca
24870 74 69 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  tion failure..*/
24880 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49  .static int winI
24890 73 44 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20  sDir(const void 
248a0 2a 7a 43 6f 6e 76 65 72 74 65 64 29 7b 0a 20 20  *zConverted){.  
248b0 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e  DWORD attr;.  in
248c0 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
248d0 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20  D lastErrno;..  
248e0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
248f0 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b      int cnt = 0;
24900 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f  .    WIN32_FILE_
24910 41 54 54 52 49 42 55 54 45 5f 44 41 54 41 20 73  ATTRIBUTE_DATA s
24920 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65  AttrData;.    me
24930 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
24940 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
24950 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c  Data));.    whil
24960 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46  e( !(rc = osGetF
24970 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
24980 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
24990 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
249a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249b0 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f     GetFileExInfo
249c0 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20  Standard,.      
249d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249e0 20 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74         &sAttrDat
249f0 61 29 29 20 26 26 20 77 69 6e 52 65 74 72 79 49  a)) && winRetryI
24a00 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74  oerr(&cnt, &last
24a10 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69  Errno) ){}.    i
24a20 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
24a30 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 49 6e 76  return 0; /* Inv
24a40 61 6c 69 64 20 6e 61 6d 65 3f 20 2a 2f 0a 20 20  alid name? */.  
24a50 20 20 7d 0a 20 20 20 20 61 74 74 72 20 3d 20 73    }.    attr = s
24a60 41 74 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41  AttrData.dwFileA
24a70 74 74 72 69 62 75 74 65 73 3b 0a 23 69 66 20 53  ttributes;.#if S
24a80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 3d 3d  QLITE_OS_WINCE==
24a90 30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  0.  }else{.    a
24aa0 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
24ab0 74 74 72 69 62 75 74 65 73 41 28 28 63 68 61 72  ttributesA((char
24ac0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23  *)zConverted);.#
24ad0 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
24ae0 72 6e 20 28 61 74 74 72 21 3d 49 4e 56 41 4c 49  rn (attr!=INVALI
24af0 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45  D_FILE_ATTRIBUTE
24b00 53 29 20 26 26 20 28 61 74 74 72 26 46 49 4c 45  S) && (attr&FILE
24b10 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
24b20 54 4f 52 59 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TORY);.}../*.** 
24b30 4f 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  Open a file..*/.
24b40 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4f 70  static int winOp
24b50 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  en(.  sqlite3_vf
24b60 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
24b70 2f 2a 20 55 73 65 64 20 74 6f 20 67 65 74 20 6d  /* Used to get m
24b80 61 78 69 6d 75 6d 20 70 61 74 68 20 6e 61 6d 65  aximum path name
24b90 20 6c 65 6e 67 74 68 20 2a 2f 0a 20 20 63 6f 6e   length */.  con
24ba0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
24bb0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
24bc0 66 20 74 68 65 20 66 69 6c 65 20 28 55 54 46 2d  f the file (UTF-
24bd0 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  8) */.  sqlite3_
24be0 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
24bf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 53    /* Write the S
24c00 51 4c 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  QLite file handl
24c10 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  e here */.  int 
24c20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
24c30 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 6d 6f        /* Open mo
24c40 64 65 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e  de flags */.  in
24c50 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
24c60 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
24c70 73 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a  s return flags *
24c80 2f 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 3b  /.){.  HANDLE h;
24c90 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
24ca0 6e 6f 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  no = 0;.  DWORD 
24cb0 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 3b  dwDesiredAccess;
24cc0 0a 20 20 44 57 4f 52 44 20 64 77 53 68 61 72 65  .  DWORD dwShare
24cd0 4d 6f 64 65 3b 0a 20 20 44 57 4f 52 44 20 64 77  Mode;.  DWORD dw
24ce0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
24cf0 69 6f 6e 3b 0a 20 20 44 57 4f 52 44 20 64 77 46  ion;.  DWORD dwF
24d00 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
24d10 73 20 3d 20 30 3b 0a 23 69 66 20 53 51 4c 49 54  s = 0;.#if SQLIT
24d20 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
24d30 20 69 73 54 65 6d 70 20 3d 20 30 3b 0a 23 65 6e   isTemp = 0;.#en
24d40 64 69 66 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  dif.  winFile *p
24d50 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
24d60 29 69 64 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  )id;.  void *zCo
24d70 6e 76 65 72 74 65 64 3b 20 20 20 20 20 20 20 20  nverted;        
24d80 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d        /* Filenam
24d90 65 20 69 6e 20 4f 53 20 65 6e 63 6f 64 69 6e 67  e in OS encoding
24da0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
24db0 20 2a 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 4e   *zUtf8Name = zN
24dc0 61 6d 65 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ame; /* Filename
24dd0 20 69 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 69   in UTF-8 encodi
24de0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  ng */.  int cnt 
24df0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72  = 0;..  /* If ar
24e00 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
24e10 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
24e20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24e30 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
24e40 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
24e50 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
24e60 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
24e70 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
24e80 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
24e90 2a 7a 54 6d 70 6e 61 6d 65 20 3d 20 30 3b 20 2f  *zTmpname = 0; /
24ea0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
24eb0 66 69 6c 65 6e 61 6d 65 2c 20 69 66 20 6e 65 63  filename, if nec
24ec0 65 73 73 61 72 79 2e 20 2a 2f 0a 0a 20 20 69 6e  essary. */..  in
24ed0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
24ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24ef0 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20  Function Return 
24f00 43 6f 64 65 20 2a 2f 0a 23 69 66 20 21 64 65 66  Code */.#if !def
24f10 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
24f20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
24f30 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
24f40 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
24f50 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
24f60 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64   to open */.#end
24f70 69 66 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c  if..  int isExcl
24f80 75 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20  usive  = (flags 
24f90 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  & SQLITE_OPEN_EX
24fa0 43 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20  CLUSIVE);.  int 
24fb0 69 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28  isDelete     = (
24fc0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
24fd0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
24fe0 45 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61  E);.  int isCrea
24ff0 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20  te     = (flags 
25000 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  & SQLITE_OPEN_CR
25010 45 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52  EATE);.  int isR
25020 65 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61  eadonly   = (fla
25030 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
25040 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _READONLY);.  in
25050 74 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d  t isReadWrite  =
25060 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25070 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29  _OPEN_READWRITE)
25080 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
25090 47 0a 20 20 69 6e 74 20 69 73 4f 70 65 6e 4a 6f  G.  int isOpenJo
250a0 75 72 6e 61 6c 20 3d 20 28 69 73 43 72 65 61 74  urnal = (isCreat
250b0 65 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65  e && (.        e
250c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
250d0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
250e0 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
250f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25100 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
25110 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25120 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 23 65  PEN_WAL.  ));.#e
25130 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28  ndif..  OSTRACE(
25140 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
25150 70 46 69 6c 65 3d 25 70 2c 20 66 6c 61 67 73 3d  pFile=%p, flags=
25160 25 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d 25 70  %x, pOutFlags=%p
25170 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
25180 7a 55 74 66 38 4e 61 6d 65 2c 20 69 64 2c 20 66  zUtf8Name, id, f
25190 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
251a0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
251b0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61  he following sta
251c0 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65  tements are true
251d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61  :.  **.  **   (a
251e0 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66  ) Exactly one of
251f0 20 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61   the READWRITE a
25200 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67  nd READONLY flag
25210 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61  s must be set, a
25220 6e 64 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  nd.  **   (b) if
25230 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
25240 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
25250 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
25260 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
25270 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
25280 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
25290 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
252a0 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
252b0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
252c0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
252d0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
252e0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
252f0 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
25300 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
25310 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
25320 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
25330 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
25340 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
25350 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
25360 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
25370 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
25380 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
25390 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
253a0 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
253b0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
253c0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
253d0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
253e0 6c 20 61 72 65 20 6e 65 76 65 72 0a 20 20 2a 2a  l are never.  **
253f0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
25400 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
25410 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
25420 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
25430 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25440 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
25450 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
25460 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
25470 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25480 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
25490 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
254a0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
254b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
254c0 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
254d0 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
254e0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
254f0 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
25500 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
25510 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
25520 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
25530 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
25540 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
25550 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
25560 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
25570 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
25580 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
25590 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
255a0 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
255b0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
255c0 4e 5f 54 45 4d 50 5f 44 42 0a 20 20 20 20 20 20  N_TEMP_DB.      
255d0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
255e0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
255f0 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  NAL || eType==SQ
25600 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
25610 4f 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c  OURNAL.       ||
25620 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25630 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
25640 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
25650 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
25660 55 52 4e 41 4c 0a 20 20 20 20 20 20 20 7c 7c 20  URNAL.       || 
25670 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25680 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
25690 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
256a0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
256b0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
256c0 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  =0 );.  memset(p
256d0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
256e0 77 69 6e 46 69 6c 65 29 29 3b 0a 20 20 70 46 69  winFile));.  pFi
256f0 6c 65 2d 3e 68 20 3d 20 49 4e 56 41 4c 49 44 5f  le->h = INVALID_
25700 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 0a 23  HANDLE_VALUE;..#
25710 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25720 52 54 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e  RT.  if( !zUtf8N
25730 61 6d 65 20 26 26 20 21 73 71 6c 69 74 65 33 5f  ame && !sqlite3_
25740 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
25750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
25760 67 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 0a  g(SQLITE_ERROR,.
25770 20 20 20 20 20 20 20 20 22 73 71 6c 69 74 65 33          "sqlite3
25780 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
25790 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20  variable should 
257a0 62 65 20 73 65 74 20 66 6f 72 20 57 69 6e 52 54  be set for WinRT
257b0 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ");.  }.#endif..
257c0 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63 6f    /* If the seco
257d0 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  nd argument to t
257e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
257f0 4e 55 4c 4c 2c 20 67 65 6e 65 72 61 74 65 20 61  NULL, generate a
25800 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
25810 66 69 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65  file name to use
25820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 55 74  .  */.  if( !zUt
25830 66 38 4e 61 6d 65 20 29 7b 0a 20 20 20 20 61 73  f8Name ){.    as
25840 73 65 72 74 28 20 69 73 44 65 6c 65 74 65 20 26  sert( isDelete &
25850 26 20 21 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  & !isOpenJournal
25860 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e   );.    rc = win
25870 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
25880 2c 20 26 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20  , &zTmpname);.  
25890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
258a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  _OK ){.      OST
258b0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
258c0 3d 25 73 2c 20 72 63 3d 25 73 22 2c 20 7a 55 74  =%s, rc=%s", zUt
258d0 66 38 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  f8Name, sqlite3E
258e0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
258f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25900 20 20 20 7d 0a 20 20 20 20 7a 55 74 66 38 4e 61     }.    zUtf8Na
25910 6d 65 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20  me = zTmpname;. 
25920 20 7d 0a 0a 20 20 2f 2a 20 44 61 74 61 62 61 73   }..  /* Databas
25930 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
25940 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d  double-zero term
25950 69 6e 61 74 65 64 20 69 66 20 74 68 65 79 20 61  inated if they a
25960 72 65 20 6e 6f 74 0a 20 20 2a 2a 20 55 52 49 73  re not.  ** URIs
25970 20 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73   with parameters
25980 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63  .  Hence, they c
25990 61 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73  an always be pas
259a0 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71  sed into.  ** sq
259b0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
259c0 74 65 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  ter()..  */.  as
259d0 73 65 72 74 28 20 28 65 54 79 70 65 21 3d 53 51  sert( (eType!=SQ
259e0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
259f0 42 29 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  B) || (flags & S
25a00 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
25a10 7c 7c 0a 20 20 20 20 20 20 20 7a 55 74 66 38 4e  ||.       zUtf8N
25a20 61 6d 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ame[sqlite3Strle
25a30 6e 33 30 28 7a 55 74 66 38 4e 61 6d 65 29 2b 31  n30(zUtf8Name)+1
25a40 5d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 6f  ]==0 );..  /* Co
25a50 6e 76 65 72 74 20 74 68 65 20 66 69 6c 65 6e 61  nvert the filena
25a60 6d 65 20 74 6f 20 74 68 65 20 73 79 73 74 65 6d  me to the system
25a70 20 65 6e 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20   encoding. */.  
25a80 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
25a90 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
25aa0 69 6c 65 6e 61 6d 65 28 7a 55 74 66 38 4e 61 6d  ilename(zUtf8Nam
25ab0 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
25ac0 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73  rted==0 ){.    s
25ad0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
25ae0 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54 52 41  name);.    OSTRA
25af0 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25  CE(("OPEN name=%
25b00 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  s, rc=SQLITE_IOE
25b10 52 52 5f 4e 4f 4d 45 4d 22 2c 20 7a 55 74 66 38  RR_NOMEM", zUtf8
25b20 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
25b30 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
25b40 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
25b50 0a 20 20 69 66 28 20 77 69 6e 49 73 44 69 72 28  .  if( winIsDir(
25b60 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
25b70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
25b80 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
25b90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
25ba0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
25bb0 52 41 43 45 28 28 22 4f 50 45 4e 20 6e 61 6d 65  RACE(("OPEN name
25bc0 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 43  =%s, rc=SQLITE_C
25bd0 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 2c 20  ANTOPEN_ISDIR", 
25be0 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a 20 20 20  zUtf8Name));.   
25bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25c00 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3b 0a 20  ANTOPEN_ISDIR;. 
25c10 20 7d 0a 0a 20 20 69 66 28 20 69 73 52 65 61 64   }..  if( isRead
25c20 57 72 69 74 65 20 29 7b 0a 20 20 20 20 64 77 44  Write ){.    dwD
25c30 65 73 69 72 65 64 41 63 63 65 73 73 20 3d 20 47  esiredAccess = G
25c40 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47 45  ENERIC_READ | GE
25c50 4e 45 52 49 43 5f 57 52 49 54 45 3b 0a 20 20 7d  NERIC_WRITE;.  }
25c60 65 6c 73 65 7b 0a 20 20 20 20 64 77 44 65 73 69  else{.    dwDesi
25c70 72 65 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45  redAccess = GENE
25c80 52 49 43 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  RIC_READ;.  }.. 
25c90 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   /* SQLITE_OPEN_
25ca0 45 58 43 4c 55 53 49 56 45 20 69 73 20 75 73 65  EXCLUSIVE is use
25cb0 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
25cc0 68 61 74 20 61 20 6e 65 77 20 66 69 6c 65 20 69  hat a new file i
25cd0 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 2e 20  s.  ** created. 
25ce0 53 51 4c 69 74 65 20 64 6f 65 73 6e 27 74 20 75  SQLite doesn't u
25cf0 73 65 20 69 74 20 74 6f 20 69 6e 64 69 63 61 74  se it to indicat
25d00 65 20 22 65 78 63 6c 75 73 69 76 65 20 61 63 63  e "exclusive acc
25d10 65 73 73 22 0a 20 20 2a 2a 20 61 73 20 69 74 20  ess".  ** as it 
25d20 69 73 20 75 73 75 61 6c 6c 79 20 75 6e 64 65 72  is usually under
25d30 73 74 6f 6f 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  stood..  */.  if
25d40 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29 7b  ( isExclusive ){
25d50 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 73 20  .    /* Creates 
25d60 61 20 6e 65 77 20 66 69 6c 65 2c 20 6f 6e 6c 79  a new file, only
25d70 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
25d80 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 20 2a  already exist. *
25d90 2f 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  /.    /* If the 
25da0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 69 74 20  file exists, it 
25db0 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 64 77  fails. */.    dw
25dc0 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
25dd0 69 6f 6e 20 3d 20 43 52 45 41 54 45 5f 4e 45 57  ion = CREATE_NEW
25de0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
25df0 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20 2f 2a  Create ){.    /*
25e00 20 4f 70 65 6e 20 65 78 69 73 74 69 6e 67 20 66   Open existing f
25e10 69 6c 65 2c 20 6f 72 20 63 72 65 61 74 65 20 69  ile, or create i
25e20 66 20 69 74 20 64 6f 65 73 6e 27 74 20 65 78 69  f it doesn't exi
25e30 73 74 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61  st */.    dwCrea
25e40 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20  tionDisposition 
25e50 3d 20 4f 50 45 4e 5f 41 4c 57 41 59 53 3b 0a 20  = OPEN_ALWAYS;. 
25e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f   }else{.    /* O
25e70 70 65 6e 73 20 61 20 66 69 6c 65 2c 20 6f 6e 6c  pens a file, onl
25e80 79 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  y if it exists. 
25e90 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f  */.    dwCreatio
25ea0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f  nDisposition = O
25eb0 50 45 4e 5f 45 58 49 53 54 49 4e 47 3b 0a 20 20  PEN_EXISTING;.  
25ec0 7d 0a 0a 20 20 64 77 53 68 61 72 65 4d 6f 64 65  }..  dwShareMode
25ed0 20 3d 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45   = FILE_SHARE_RE
25ee0 41 44 20 7c 20 46 49 4c 45 5f 53 48 41 52 45 5f  AD | FILE_SHARE_
25ef0 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 69 73  WRITE;..  if( is
25f00 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 53 51  Delete ){.#if SQ
25f10 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
25f20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
25f30 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
25f40 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e 3b 0a  TRIBUTE_HIDDEN;.
25f50 20 20 20 20 69 73 54 65 6d 70 20 3d 20 31 3b 0a      isTemp = 1;.
25f60 23 65 6c 73 65 0a 20 20 20 20 64 77 46 6c 61 67  #else.    dwFlag
25f70 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
25f80 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
25f90 54 45 4d 50 4f 52 41 52 59 0a 20 20 20 20 20 20  TEMPORARY.      
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f           | FILE_
25fc0 41 54 54 52 49 42 55 54 45 5f 48 49 44 44 45 4e  ATTRIBUTE_HIDDEN
25fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45  | FILE_FLAG_DELE
26000 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 23 65 6e  TE_ON_CLOSE;.#en
26010 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
26020 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
26030 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54  butes = FILE_ATT
26040 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 3b 0a 20  RIBUTE_NORMAL;. 
26050 20 7d 0a 20 20 2f 2a 20 52 65 70 6f 72 74 73 20   }.  /* Reports 
26060 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 65  from the interne
26070 74 20 61 72 65 20 74 68 61 74 20 70 65 72 66 6f  t are that perfo
26080 72 6d 61 6e 63 65 20 69 73 20 61 6c 77 61 79 73  rmance is always
26090 0a 20 20 2a 2a 20 62 65 74 74 65 72 20 69 66 20  .  ** better if 
260a0 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
260b0 5f 41 43 43 45 53 53 20 69 73 20 75 73 65 64 2e  _ACCESS is used.
260c0 20 20 54 69 63 6b 65 74 20 23 32 36 39 39 2e 20    Ticket #2699. 
260d0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  */.#if SQLITE_OS
260e0 5f 57 49 4e 43 45 0a 20 20 64 77 46 6c 61 67 73  _WINCE.  dwFlags
260f0 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 7c 3d  AndAttributes |=
26100 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
26110 4d 5f 41 43 43 45 53 53 3b 0a 23 65 6e 64 69 66  M_ACCESS;.#endif
26120 0a 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ..  if( osIsNT()
26130 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   ){.#if SQLITE_O
26140 53 5f 57 49 4e 52 54 0a 20 20 20 20 43 52 45 41  S_WINRT.    CREA
26150 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45 44  TEFILE2_EXTENDED
26160 5f 50 41 52 41 4d 45 54 45 52 53 20 65 78 74 65  _PARAMETERS exte
26170 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 3b 0a  ndedParameters;.
26180 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61      extendedPara
26190 6d 65 74 65 72 73 2e 64 77 53 69 7a 65 20 3d 20  meters.dwSize = 
261a0 73 69 7a 65 6f 66 28 43 52 45 41 54 45 46 49 4c  sizeof(CREATEFIL
261b0 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
261c0 4d 45 54 45 52 53 29 3b 0a 20 20 20 20 65 78 74  METERS);.    ext
261d0 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e  endedParameters.
261e0 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
261f0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64   =.            d
26200 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
26210 74 65 73 20 26 20 46 49 4c 45 5f 41 54 54 52 49  tes & FILE_ATTRI
26220 42 55 54 45 5f 4d 41 53 4b 3b 0a 20 20 20 20 65  BUTE_MASK;.    e
26230 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
26240 73 2e 64 77 46 69 6c 65 46 6c 61 67 73 20 3d 20  s.dwFileFlags = 
26250 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
26260 75 74 65 73 20 26 20 46 49 4c 45 5f 46 4c 41 47  utes & FILE_FLAG
26270 5f 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e  _MASK;.    exten
26280 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77  dedParameters.dw
26290 53 65 63 75 72 69 74 79 51 6f 73 46 6c 61 67 73  SecurityQosFlags
262a0 20 3d 20 53 45 43 55 52 49 54 59 5f 41 4e 4f 4e   = SECURITY_ANON
262b0 59 4d 4f 55 53 3b 0a 20 20 20 20 65 78 74 65 6e  YMOUS;.    exten
262c0 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 6c 70  dedParameters.lp
262d0 53 65 63 75 72 69 74 79 41 74 74 72 69 62 75 74  SecurityAttribut
262e0 65 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 65  es = NULL;.    e
262f0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
26300 73 2e 68 54 65 6d 70 6c 61 74 65 46 69 6c 65 20  s.hTemplateFile 
26310 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 77 68 69 6c  = NULL;.    whil
26320 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65  e( (h = osCreate
26330 46 69 6c 65 32 28 28 4c 50 43 57 53 54 52 29 7a  File2((LPCWSTR)z
26340 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
26350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26360 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
26370 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
263a0 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263c0 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73     dwCreationDis
263d0 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20  position,.      
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 20 20 20 20 20 20 20 20 26 65 78 74 65 6e 64 65          &extende
26400 64 50 61 72 61 6d 65 74 65 72 73 29 29 3d 3d 49  dParameters))==I
26410 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
26420 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20 20  LUE &&.         
26430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26440 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f 65       winRetryIoe
26450 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
26460 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
26470 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a         /* Noop *
26480 2f 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  /.    }.#else.  
26490 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
264a0 43 72 65 61 74 65 46 69 6c 65 57 28 28 4c 50 43  CreateFileW((LPC
264b0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
264c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
264e0 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
26510 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
26520 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26540 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
26550 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26570 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
26580 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
265b0 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
265c0 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
265f0 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26600 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26610 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
26620 2a 2f 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  */.    }.#endif.
26630 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
26640 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
26650 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 77 68 69  .  else{.    whi
26660 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
26670 65 46 69 6c 65 41 28 28 4c 50 43 53 54 52 29 7a  eFileA((LPCSTR)z
26680 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20  Converted,.     
26690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266a0 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69 72           dwDesir
266b0 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20  edAccess,.      
266c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266d0 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65 4d          dwShareM
266e0 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20  ode, NULL,.     
266f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26700 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61 74           dwCreat
26710 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
26740 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74  FlagsAndAttribut
26750 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
26760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26770 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49    NULL))==INVALI
26780 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
26790 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
267c0 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
267d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
267e0 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
267f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
26800 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c  winLogIoerr(cnt,
26810 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 0a 20 20 4f   __LINE__);..  O
26820 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69  STRACE(("OPEN fi
26830 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20  le=%p, name=%s, 
26840 61 63 63 65 73 73 3d 25 6c 78 2c 20 72 63 3d 25  access=%lx, rc=%
26850 73 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61  s\n", h, zUtf8Na
26860 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 64  me,.           d
26870 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20  wDesiredAccess, 
26880 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  (h==INVALID_HAND
26890 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69  LE_VALUE) ? "fai
268a0 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a  led" : "ok"));..
268b0 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44    if( h==INVALID
268c0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b  _HANDLE_VALUE ){
268d0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
268e0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
268f0 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
26900 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
26910 45 4e 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EN, pFile->lastE
26920 72 72 6e 6f 2c 20 22 77 69 6e 4f 70 65 6e 22 2c  rrno, "winOpen",
26930 20 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 20   zUtf8Name);.   
26940 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
26950 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 73  onverted);.    s
26960 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
26970 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 69  name);.    if( i
26980 73 52 65 61 64 57 72 69 74 65 20 26 26 20 21 69  sReadWrite && !i
26990 73 45 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20  sExclusive ){.  
269a0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4f 70      return winOp
269b0 65 6e 28 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20  en(pVfs, zName, 
269c0 69 64 2c 0a 20 20 20 20 20 20 20 20 20 28 28 66  id,.         ((f
269d0 6c 61 67 73 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  lags|SQLITE_OPEN
269e0 5f 52 45 41 44 4f 4e 4c 59 29 20 26 0a 20 20 20  _READONLY) &.   
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 20 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    ~(SQLITE_OPEN_
26a10 43 52 45 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50  CREATE|SQLITE_OP
26a20 45 4e 5f 52 45 41 44 57 52 49 54 45 29 29 2c 0a  EN_READWRITE)),.
26a30 20 20 20 20 20 20 20 20 20 70 4f 75 74 46 6c 61           pOutFla
26a40 67 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gs);.    }else{.
26a50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
26a60 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
26a70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  T;.    }.  }..  
26a80 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
26a90 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64 57  .    if( isReadW
26aa0 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2a 70  rite ){.      *p
26ab0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
26ac0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
26ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26ae0 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
26af0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
26b00 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ONLY;.    }.  }.
26b10 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
26b20 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d 65 3d  N file=%p, name=
26b30 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78 2c 20  %s, access=%lx, 
26b40 70 4f 75 74 46 6c 61 67 73 3d 25 70 2c 20 2a 70  pOutFlags=%p, *p
26b50 4f 75 74 46 6c 61 67 73 3d 25 64 2c 20 22 0a 20  OutFlags=%d, ". 
26b60 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 25 73            "rc=%s
26b70 5c 6e 22 2c 20 68 2c 20 7a 55 74 66 38 4e 61 6d  \n", h, zUtf8Nam
26b80 65 2c 20 64 77 44 65 73 69 72 65 64 41 63 63 65  e, dwDesiredAcce
26b90 73 73 2c 20 70 4f 75 74 46 6c 61 67 73 2c 20 70  ss, pOutFlags, p
26ba0 4f 75 74 46 6c 61 67 73 20 3f 0a 20 20 20 20 20  OutFlags ?.     
26bb0 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
26bc0 20 3a 20 30 2c 20 28 68 3d 3d 49 4e 56 41 4c 49   : 0, (h==INVALI
26bd0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
26be0 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
26bf0 22 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  "));..#if SQLITE
26c00 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 66 28 20  _OS_WINCE.  if( 
26c10 69 73 52 65 61 64 57 72 69 74 65 20 26 26 20 65  isReadWrite && e
26c20 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26c30 4e 5f 4d 41 49 4e 5f 44 42 0a 20 20 20 20 20 20  N_MAIN_DB.      
26c40 20 26 26 20 28 72 63 20 3d 20 77 69 6e 63 65 43   && (rc = winceC
26c50 72 65 61 74 65 4c 6f 63 6b 28 7a 4e 61 6d 65 2c  reateLock(zName,
26c60 20 70 46 69 6c 65 29 29 21 3d 53 51 4c 49 54 45   pFile))!=SQLITE
26c70 5f 4f 4b 0a 20 20 29 7b 0a 20 20 20 20 6f 73 43  _OK.  ){.    osC
26c80 6c 6f 73 65 48 61 6e 64 6c 65 28 68 29 3b 0a 20  loseHandle(h);. 
26c90 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
26ca0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
26cb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
26cc0 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 4f 53 54  mpname);.    OST
26cd0 52 41 43 45 28 28 22 4f 50 45 4e 2d 43 45 2d 4c  RACE(("OPEN-CE-L
26ce0 4f 43 4b 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  OCK name=%s, rc=
26cf0 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 2c 20 73 71  %s\n", zName, sq
26d00 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
26d10 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  ));.    return r
26d20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 73 54  c;.  }.  if( isT
26d30 65 6d 70 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  emp ){.    pFile
26d40 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
26d50 20 3d 20 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20   = zConverted;. 
26d60 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
26d70 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
26d80 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
26d90 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66    }..  sqlite3_f
26da0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
26db0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20   pFile->pMethod 
26dc0 3d 20 26 77 69 6e 49 6f 4d 65 74 68 6f 64 3b 0a  = &winIoMethod;.
26dd0 20 20 70 46 69 6c 65 2d 3e 70 56 66 73 20 3d 20    pFile->pVfs = 
26de0 70 56 66 73 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  pVfs;.  pFile->h
26df0 20 3d 20 68 3b 0a 20 20 69 66 28 20 69 73 52 65   = h;.  if( isRe
26e00 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 70 46  adonly ){.    pF
26e10 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
26e20 3d 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59  = WINFILE_RDONLY
26e30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
26e40 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28  te3_uri_boolean(
26e50 7a 4e 61 6d 65 2c 20 22 70 73 6f 77 22 2c 20 53  zName, "psow", S
26e60 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
26e70 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
26e80 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
26e90 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f 50 53  gs |= WINFILE_PS
26ea0 4f 57 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  OW;.  }.  pFile-
26eb0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f  >lastErrno = NO_
26ec0 45 52 52 4f 52 3b 0a 20 20 70 46 69 6c 65 2d 3e  ERROR;.  pFile->
26ed0 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23  zPath = zName;.#
26ee0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
26ef0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 46 69 6c  AP_SIZE>0.  pFil
26f00 65 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a  e->hMap = NULL;.
26f10 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67    pFile->pMapReg
26f20 69 6f 6e 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65  ion = 0;.  pFile
26f30 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a  ->mmapSize = 0;.
26f40 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
26f50 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 70  eActual = 0;.  p
26f60 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
26f70 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
26f80 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
26f90 23 65 6e 64 69 66 0a 0a 20 20 4f 70 65 6e 43 6f  #endif..  OpenCo
26fa0 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
26fb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26fc0 20 44 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65   Delete the name
26fd0 64 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  d file..**.** No
26fe0 74 65 20 74 68 61 74 20 57 69 6e 64 6f 77 73 20  te that Windows 
26ff0 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  does not allow a
27000 20 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65   file to be dele
27010 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
27020 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 68 61 73  r.** process has
27030 20 69 74 20 6f 70 65 6e 2e 20 20 53 6f 6d 65 74   it open.  Somet
27040 69 6d 65 73 20 61 20 76 69 72 75 73 20 73 63 61  imes a virus sca
27050 6e 6e 65 72 20 6f 72 20 69 6e 64 65 78 69 6e 67  nner or indexing
27060 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 77 69 6c 6c   program.** will
27070 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20   open a journal 
27080 66 69 6c 65 20 73 68 6f 72 74 6c 79 20 61 66 74  file shortly aft
27090 65 72 20 69 74 20 69 73 20 63 72 65 61 74 65 64  er it is created
270a0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 6f 0a   in order to do.
270b0 2a 2a 20 77 68 61 74 65 76 65 72 20 69 74 20 64  ** whatever it d
270c0 6f 65 73 2e 20 20 57 68 69 6c 65 20 74 68 69 73  oes.  While this
270d0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
270e0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 0a 2a 2a  s holding the.**
270f0 20 66 69 6c 65 20 6f 70 65 6e 2c 20 77 65 20 77   file open, we w
27100 69 6c 6c 20 62 65 20 75 6e 61 62 6c 65 20 74 6f  ill be unable to
27110 20 64 65 6c 65 74 65 20 69 74 2e 20 20 54 6f 20   delete it.  To 
27120 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
27130 0a 2a 2a 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  .** problem, we 
27140 64 65 6c 61 79 20 31 30 30 20 6d 69 6c 6c 69 73  delay 100 millis
27150 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 74  econds and try t
27160 6f 20 64 65 6c 65 74 65 20 61 67 61 69 6e 2e 20  o delete again. 
27170 20 55 70 0a 2a 2a 20 74 6f 20 4d 58 5f 44 45 4c   Up.** to MX_DEL
27180 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 73 20 64  ETION_ATTEMPTs d
27190 65 6c 65 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  eletion attempts
271a0 20 61 72 65 20 72 75 6e 20 62 65 66 6f 72 65 20   are run before 
271b0 67 69 76 69 6e 67 0a 2a 2a 20 75 70 20 61 6e 64  giving.** up and
271c0 20 72 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   returning an er
271d0 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
271e0 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 0a 20 20  nt winDelete(.  
271f0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
27200 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  s,          /* N
27210 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
27220 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
27230 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
27240 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
27250 65 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  e to delete */. 
27260 20 69 6e 74 20 73 79 6e 63 44 69 72 20 20 20 20   int syncDir    
27270 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27280 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
27290 32 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 63 6e  2 */.){.  int cn
272a0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 0;.  int rc;
272b0 0a 20 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20  .  DWORD attr;. 
272c0 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
272d0 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a 43   = 0;.  void *zC
272e0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55 53  onverted;.  UNUS
272f0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
27300 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
27310 41 4d 45 54 45 52 28 73 79 6e 63 44 69 72 29 3b  AMETER(syncDir);
27320 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
27330 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
27340 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
27350 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c  .  OSTRACE(("DEL
27360 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 73 79 6e  ETE name=%s, syn
27370 63 44 69 72 3d 25 64 5c 6e 22 2c 20 7a 46 69 6c  cDir=%d\n", zFil
27380 65 6e 61 6d 65 2c 20 73 79 6e 63 44 69 72 29 29  ename, syncDir))
27390 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  ;..  zConverted 
273a0 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
273b0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69  Utf8Filename(zFi
273c0 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
273d0 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
273e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 45      OSTRACE(("DE
273f0 4c 45 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63  LETE name=%s, rc
27400 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
27410 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  MEM\n", zFilenam
27420 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
27430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
27440 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
27450 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
27460 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c 49     do {.#if SQLI
27470 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
27480 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
27490 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
274a0 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65 6d  rData;.      mem
274b0 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20  set(&sAttrData, 
274c0 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44  0, sizeof(sAttrD
274d0 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66 20  ata));.      if 
274e0 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  ( osGetFileAttri
274f0 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65 72  butesExW(zConver
27500 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49 6e  ted, GetFileExIn
27510 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 73                &s
27540 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20 20  AttrData) ){.   
27550 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74 74       attr = sAtt
27560 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  rData.dwFileAttr
27570 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 65  ibutes;.      }e
27580 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61 73  lse{.        las
27590 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
275a0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
275b0 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f     if( lastErrno
275c0 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54  ==ERROR_FILE_NOT
275d0 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20  _FOUND.         
275e0 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  || lastErrno==ER
275f0 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
27600 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
27610 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27620 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20  R_DELETE_NOENT; 
27630 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f  /* Already gone?
27640 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
27650 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  e{.          rc 
27660 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
27670 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27680 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27690 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74 74  .#else.      att
276a0 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  r = osGetFileAtt
276b0 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65 72  ributesW(zConver
276c0 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ted);.#endif.   
276d0 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49 4e     if ( attr==IN
276e0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
276f0 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20 20  BUTES ){.       
27700 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47   lastErrno = osG
27710 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
27720 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45         if( lastE
27730 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45  rrno==ERROR_FILE
27740 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20  _NOT_FOUND.     
27750 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f      || lastErrno
27760 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54  ==ERROR_PATH_NOT
27770 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20 20  _FOUND ){.      
27780 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27790 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
277a0 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20 67  NT; /* Already g
277b0 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20  one? */.        
277c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
277d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
277e0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
277f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27800 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
27810 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42  attr&FILE_ATTRIB
27820 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29 7b  UTE_DIRECTORY ){
27830 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
27840 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 46  LITE_ERROR; /* F
27850 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20 20  iles only. */.  
27860 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27870 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20     }.      if ( 
27880 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a 43  osDeleteFileW(zC
27890 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20  onverted) ){.   
278a0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
278b0 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64 20  _OK; /* Deleted 
278c0 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  OK. */.        b
278d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
278e0 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65 74      if ( !winRet
278f0 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c  ryIoerr(&cnt, &l
27900 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20  astErrno) ){.   
27910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27920 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d 6f  _ERROR; /* No mo
27930 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a 20  re retries. */. 
27940 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27950 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c      }.    } whil
27960 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  e(1);.  }.#ifdef
27970 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
27980 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
27990 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61 74     do {.      at
279a0 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
279b0 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76 65  tributesA(zConve
279c0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66 20  rted);.      if 
279d0 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f  ( attr==INVALID_
279e0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
279f0 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45  ){.        lastE
27a00 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
27a10 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
27a20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d   if( lastErrno==
27a30 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
27a40 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c  OUND.         ||
27a50 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f   lastErrno==ERRO
27a60 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44  R_PATH_NOT_FOUND
27a70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
27a80 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
27a90 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a  DELETE_NOENT; /*
27aa0 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a   Already gone? *
27ab0 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  /.        }else{
27ac0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27ad0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
27ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27af0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27b00 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26 46       if ( attr&F
27b10 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
27b20 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20  RECTORY ){.     
27b30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
27b40 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f  RROR; /* Files o
27b50 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nly. */.        
27b60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27b70 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65       if ( osDele
27b80 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72 74  teFileA(zConvert
27b90 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ed) ){.        r
27ba0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
27bb0 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f  * Deleted OK. */
27bc0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
27bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27be0 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72   ( !winRetryIoer
27bf0 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
27c00 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  no) ){.        r
27c10 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
27c20 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74  ; /* No more ret
27c30 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ries. */.       
27c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27c50 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a      } while(1);.
27c60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
27c70 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49 54   rc && rc!=SQLIT
27c80 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
27c90 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20 3d  OENT ){.    rc =
27ca0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
27cb0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
27cc0 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69  , lastErrno, "wi
27cd0 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65 6e  nDelete", zFilen
27ce0 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
27cf0 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 63     winLogIoerr(c
27d00 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  nt, __LINE__);. 
27d10 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
27d20 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
27d30 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45 54   OSTRACE(("DELET
27d40 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73  E name=%s, rc=%s
27d50 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
27d60 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
27d70 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
27d80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
27d90 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  k the existence 
27da0 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
27db0 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
27dc0 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a 20  int winAccess(. 
27dd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
27de0 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  fs,         /* N
27df0 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33 32  ot used on win32
27e00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
27e10 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
27e20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65   /* Name of file
27e30 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69   to check */.  i
27e40 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
27e50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70            /* Typ
27e60 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61 6b  e of test to mak
27e70 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a  e on this file *
27e80 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  /.  int *pResOut
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27ea0 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a 2f  * OUT: Result */
27eb0 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74 72  .){.  DWORD attr
27ec0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
27ed0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
27ee0 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a 7a  o = 0;.  void *z
27ef0 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e 55  Converted;.  UNU
27f00 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
27f10 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  fs);..  Simulate
27f20 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
27f30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
27f40 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43  ESS; );.  OSTRAC
27f50 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d  E(("ACCESS name=
27f60 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 52  %s, flags=%x, pR
27f70 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20 20  esOut=%p\n",.   
27f80 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
27f90 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  e, flags, pResOu
27fa0 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72 74  t));..  zConvert
27fb0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
27fc0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
27fd0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66  zFilename);.  if
27fe0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
27ff0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
28000 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c  "ACCESS name=%s,
28010 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
28020 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c 65  _NOMEM\n", zFile
28030 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  name));.    retu
28040 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
28050 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
28060 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
28070 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  {.    int cnt = 
28080 30 3b 0a 20 20 20 20 57 49 4e 33 32 5f 46 49 4c  0;.    WIN32_FIL
28090 45 5f 41 54 54 52 49 42 55 54 45 5f 44 41 54 41  E_ATTRIBUTE_DATA
280a0 20 73 41 74 74 72 44 61 74 61 3b 0a 20 20 20 20   sAttrData;.    
280b0 6d 65 6d 73 65 74 28 26 73 41 74 74 72 44 61 74  memset(&sAttrDat
280c0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74  a, 0, sizeof(sAt
280d0 74 72 44 61 74 61 29 29 3b 0a 20 20 20 20 77 68  trData));.    wh
280e0 69 6c 65 28 20 21 28 72 63 20 3d 20 6f 73 47 65  ile( !(rc = osGe
280f0 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45  tFileAttributesE
28100 78 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  xW((LPCWSTR)zCon
28110 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20  verted,.        
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 20 20 20 47 65 74 46 69 6c 65 45 78 49 6e       GetFileExIn
28140 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20 20  foStandard,.    
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
28170 61 74 61 29 29 20 26 26 20 77 69 6e 52 65 74 72  ata)) && winRetr
28180 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61  yIoerr(&cnt, &la
28190 73 74 45 72 72 6e 6f 29 20 29 7b 7d 0a 20 20 20  stErrno) ){}.   
281a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
281b0 20 2f 2a 20 46 6f 72 20 61 6e 20 53 51 4c 49 54   /* For an SQLIT
281c0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 20  E_ACCESS_EXISTS 
281d0 71 75 65 72 79 2c 20 74 72 65 61 74 20 61 20 7a  query, treat a z
281e0 65 72 6f 2d 6c 65 6e 67 74 68 20 66 69 6c 65 0a  ero-length file.
281f0 20 20 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69        ** as if i
28200 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  t does not exist
28210 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
28220 20 69 66 28 20 20 20 20 66 6c 61 67 73 3d 3d 53   if(    flags==S
28230 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
28240 53 54 53 0a 20 20 20 20 20 20 20 20 20 20 26 26  STS.          &&
28250 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
28260 53 69 7a 65 48 69 67 68 3d 3d 30 0a 20 20 20 20  SizeHigh==0.    
28270 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
28280 74 61 2e 6e 46 69 6c 65 53 69 7a 65 4c 6f 77 3d  ta.nFileSizeLow=
28290 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74  =0 ){.        at
282a0 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c  tr = INVALID_FIL
282b0 45 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20  E_ATTRIBUTES;.  
282c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
282d0 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
282e0 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
282f0 75 74 65 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  utes;.      }.  
28300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
28310 69 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20  inLogIoerr(cnt, 
28320 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
28330 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d   if( lastErrno!=
28340 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46  ERROR_FILE_NOT_F
28350 4f 55 4e 44 20 26 26 20 6c 61 73 74 45 72 72 6e  OUND && lastErrn
28360 6f 21 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o!=ERROR_PATH_NO
28370 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
28380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
28390 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
283a0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
283b0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
283c0 4f 45 52 52 5f 41 43 43 45 53 53 2c 20 6c 61 73  OERR_ACCESS, las
283d0 74 45 72 72 6e 6f 2c 20 22 77 69 6e 41 63 63 65  tErrno, "winAcce
283e0 73 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ss",.           
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
28410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28420 20 61 74 74 72 20 3d 20 49 4e 56 41 4c 49 44 5f   attr = INVALID_
28430 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 3b  FILE_ATTRIBUTES;
28440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
28450 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
28460 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
28470 20 20 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72    else{.    attr
28480 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   = osGetFileAttr
28490 69 62 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a  ibutesA((char*)z
284a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a  Converted);.  }.
284b0 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
284c0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
284d0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c 61  );.  switch( fla
284e0 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  gs ){.    case S
284f0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
28500 44 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  D:.    case SQLI
28510 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
28520 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74 74  :.      rc = att
28530 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r!=INVALID_FILE_
28540 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
28550 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
28560 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f  e SQLITE_ACCESS_
28570 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20  READWRITE:.     
28580 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41   rc = attr!=INVA
28590 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
285a0 54 45 53 20 26 26 0a 20 20 20 20 20 20 20 20 20  TES &&.         
285b0 20 20 20 20 28 61 74 74 72 20 26 20 46 49 4c 45      (attr & FILE
285c0 5f 41 54 54 52 49 42 55 54 45 5f 52 45 41 44 4f  _ATTRIBUTE_READO
285d0 4e 4c 59 29 3d 3d 30 3b 0a 20 20 20 20 20 20 62  NLY)==0;.      b
285e0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
285f0 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t:.      assert(
28600 21 22 49 6e 76 61 6c 69 64 20 66 6c 61 67 73 20  !"Invalid flags 
28610 61 72 67 75 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a  argument");.  }.
28620 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 63 3b    *pResOut = rc;
28630 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43  .  OSTRACE(("ACC
28640 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 70 52 65  ESS name=%s, pRe
28650 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65 73 4f 75  sOut=%p, *pResOu
28660 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49 54 45 5f  t=%d, rc=SQLITE_
28670 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
28680 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 52 65    zFilename, pRe
28690 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74 29 29  sOut, *pResOut))
286a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
286b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
286c0 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
286d0 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
286e0 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72 74   path name start
286f0 73 20 77 69 74 68 20 61 20 64 72 69 76 65 20 6c  s with a drive l
28700 65 74 74 65 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65  etter.** followe
28710 64 20 62 79 20 61 20 63 6f 6c 6f 6e 20 63 68 61  d by a colon cha
28720 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  racter..*/.stati
28730 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
28740 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
28750 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28760 50 61 74 68 6e 61 6d 65 0a 29 7b 0a 20 20 72 65  Pathname.){.  re
28770 74 75 72 6e 20 28 20 73 71 6c 69 74 65 33 49 73  turn ( sqlite3Is
28780 61 6c 70 68 61 28 7a 50 61 74 68 6e 61 6d 65 5b  alpha(zPathname[
28790 30 5d 29 20 26 26 20 7a 50 61 74 68 6e 61 6d 65  0]) && zPathname
287a0 5b 31 5d 3d 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f  [1]==':' );.}../
287b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e  *.** Returns non
287c0 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73 70 65  -zero if the spe
287d0 63 69 66 69 65 64 20 70 61 74 68 20 6e 61 6d 65  cified path name
287e0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
287f0 76 65 72 62 61 74 69 6d 2e 20 20 49 66 0a 2a 2a  verbatim.  If.**
28800 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
28810 75 72 6e 65 64 20 66 72 6f 6d 20 74 68 69 73 20  urned from this 
28820 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 20 63 61  function, the ca
28830 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d  lling function m
28840 75 73 74 20 73 69 6d 70 6c 79 0a 2a 2a 20 75 73  ust simply.** us
28850 65 20 74 68 65 20 70 72 6f 76 69 64 65 64 20 70  e the provided p
28860 61 74 68 20 6e 61 6d 65 20 76 65 72 62 61 74 69  ath name verbati
28870 6d 20 2d 4f 52 2d 20 72 65 73 6f 6c 76 65 20 69  m -OR- resolve i
28880 74 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61  t into a full pa
28890 74 68 20 6e 61 6d 65 0a 2a 2a 20 75 73 69 6e 67  th name.** using
288a0 20 74 68 65 20 47 65 74 46 75 6c 6c 50 61 74 68   the GetFullPath
288b0 4e 61 6d 65 20 57 69 6e 33 32 20 41 50 49 20 66  Name Win32 API f
288c0 75 6e 63 74 69 6f 6e 20 28 69 66 20 61 76 61 69  unction (if avai
288d0 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  lable)..*/.stati
288e0 63 20 42 4f 4f 4c 20 77 69 6e 49 73 56 65 72 62  c BOOL winIsVerb
288f0 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 0a 20 20  atimPathname(.  
28900 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
28910 68 6e 61 6d 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20  hname.){.  /*.  
28920 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 6e  ** If the path n
28930 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20  ame starts with 
28940 61 20 66 6f 72 77 61 72 64 20 73 6c 61 73 68 20  a forward slash 
28950 6f 72 20 61 20 62 61 63 6b 73 6c 61 73 68 2c 20  or a backslash, 
28960 69 74 20 69 73 20 65 69 74 68 65 72 0a 20 20 2a  it is either.  *
28970 2a 20 61 20 6c 65 67 61 6c 20 55 4e 43 20 6e 61  * a legal UNC na
28980 6d 65 2c 20 61 20 76 6f 6c 75 6d 65 20 72 65 6c  me, a volume rel
28990 61 74 69 76 65 20 70 61 74 68 2c 20 6f 72 20 61  ative path, or a
289a0 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 20  n absolute path 
289b0 6e 61 6d 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a  name in the.  **
289c0 20 22 55 6e 69 78 22 20 66 6f 72 6d 61 74 20 6f   "Unix" format o
289d0 6e 20 57 69 6e 64 6f 77 73 2e 20 20 54 68 65 72  n Windows.  Ther
289e0 65 20 69 73 20 6e 6f 20 65 61 73 79 20 77 61 79  e is no easy way
289f0 20 74 6f 20 64 69 66 66 65 72 65 6e 74 69 61 74   to differentiat
28a00 65 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  e between.  ** t
28a10 68 65 20 66 69 6e 61 6c 20 74 77 6f 20 63 61 73  he final two cas
28a20 65 73 3b 20 74 68 65 72 65 66 6f 72 65 2c 20 77  es; therefore, w
28a30 65 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 66  e return the saf
28a40 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
28a50 6f 66 20 54 52 55 45 0a 20 20 2a 2a 20 73 6f 20  of TRUE.  ** so 
28a60 74 68 61 74 20 63 61 6c 6c 65 72 73 20 6f 66 20  that callers of 
28a70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
28a80 6c 6c 20 73 69 6d 70 6c 79 20 75 73 65 20 69 74  ll simply use it
28a90 20 76 65 72 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a   verbatim..  */.
28aa0 20 20 69 66 20 28 20 77 69 6e 49 73 44 69 72 53    if ( winIsDirS
28ab0 65 70 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29  ep(zPathname[0])
28ac0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
28ad0 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  RUE;.  }..  /*. 
28ae0 20 2a 2a 20 49 66 20 74 68 65 20 70 61 74 68 20   ** If the path 
28af0 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74 68  name starts with
28b00 20 61 20 6c 65 74 74 65 72 20 61 6e 64 20 61 20   a letter and a 
28b10 63 6f 6c 6f 6e 20 69 74 20 69 73 20 65 69 74 68  colon it is eith
28b20 65 72 20 61 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a  er a volume.  **
28b30 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6f   relative path o
28b40 72 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  r an absolute pa
28b50 74 68 2e 20 20 43 61 6c 6c 65 72 73 20 6f 66 20  th.  Callers of 
28b60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
28b70 73 74 20 6e 6f 74 0a 20 20 2a 2a 20 61 74 74 65  st not.  ** atte
28b80 6d 70 74 20 74 6f 20 74 72 65 61 74 20 69 74 20  mpt to treat it 
28b90 61 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  as a relative pa
28ba0 74 68 20 6e 61 6d 65 20 28 69 2e 65 2e 20 74 68  th name (i.e. th
28bb0 65 79 20 73 68 6f 75 6c 64 20 73 69 6d 70 6c 79  ey should simply
28bc0 20 75 73 65 0a 20 20 2a 2a 20 69 74 20 76 65 72   use.  ** it ver
28bd0 62 61 74 69 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69  batim)..  */.  i
28be0 66 20 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65  f ( winIsDriveLe
28bf0 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61  tterAndColon(zPa
28c00 74 68 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72  thname) ){.    r
28c10 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a  eturn TRUE;.  }.
28c20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 77 65  .  /*.  ** If we
28c30 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
28c40 6e 74 2c 20 74 68 65 20 70 61 74 68 20 6e 61 6d  nt, the path nam
28c50 65 20 73 68 6f 75 6c 64 20 61 6c 6d 6f 73 74 20  e should almost 
28c60 63 65 72 74 61 69 6e 6c 79 20 62 65 20 61 20 70  certainly be a p
28c70 75 72 65 6c 79 0a 20 20 2a 2a 20 72 65 6c 61 74  urely.  ** relat
28c80 69 76 65 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ive one (i.e. no
28c90 74 20 61 20 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f  t a UNC name, no
28ca0 74 20 61 62 73 6f 6c 75 74 65 2c 20 61 6e 64 20  t absolute, and 
28cb0 6e 6f 74 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74  not volume relat
28cc0 69 76 65 29 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  ive)..  */.  ret
28cd0 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a  urn FALSE;.}../*
28ce0 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
28cf0 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
28d00 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
28d10 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 66 75  e.  Write the fu
28d20 6c 6c 0a 2a 2a 20 70 61 74 68 6e 61 6d 65 20 69  ll.** pathname i
28d30 6e 74 6f 20 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75  nto zOut[].  zOu
28d40 74 5b 5d 20 77 69 6c 6c 20 62 65 20 61 74 20 6c  t[] will be at l
28d50 65 61 73 74 20 70 56 66 73 2d 3e 6d 78 50 61 74  east pVfs->mxPat
28d60 68 6e 61 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69  hname.** bytes i
28d70 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
28d80 63 20 69 6e 74 20 77 69 6e 46 75 6c 6c 50 61 74  c int winFullPat
28d90 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
28da0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28db0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
28dc0 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
28dd0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
28de0 2a 7a 52 65 6c 61 74 69 76 65 2c 20 20 20 20 20  *zRelative,     
28df0 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72     /* Possibly r
28e00 65 6c 61 74 69 76 65 20 69 6e 70 75 74 20 70 61  elative input pa
28e10 74 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 75 6c  th */.  int nFul
28e20 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
28e30 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
28e40 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69   output buffer i
28e50 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61  n bytes */.  cha
28e60 72 20 2a 7a 46 75 6c 6c 20 20 20 20 20 20 20 20  r *zFull        
28e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
28e80 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29  tput buffer */.)
28e90 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  {..#if defined(_
28ea0 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
28eb0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
28ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
28ed0 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  R );.  UNUSED_PA
28ee0 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b 0a  RAMETER(nFull);.
28ef0 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c 3e    assert( nFull>
28f00 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  =pVfs->mxPathnam
28f10 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c 69  e );.  if ( sqli
28f20 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
28f30 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72 62  ry && !winIsVerb
28f40 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65  atimPathname(zRe
28f50 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f  lative) ){.    /
28f60 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57  *.    ** NOTE: W
28f70 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
28f80 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70 61  th a relative pa
28f90 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  th name and the 
28fa0 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20  data.    **     
28fb0 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20    directory has 
28fc0 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65  been set.  There
28fd0 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73 20  fore, use it as 
28fe0 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a  the basis.    **
28ff0 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65         for conve
29000 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69  rting the relati
29010 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20  ve path name to 
29020 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20  an absolute.    
29030 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20  **       one by 
29040 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64  prepending the d
29050 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e  ata directory an
29060 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20 2a  d a slash..    *
29070 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74  /.    char *zOut
29080 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
29090 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61  Zero( pVfs->mxPa
290a0 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20  thname+1 );.    
290b0 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20  if( !zOut ){.   
290c0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
290d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
290e0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
290f0 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74   cygwin_conv_pat
29100 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  h(.            (
29110 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f 50  osIsNT() ? CCP_P
29120 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20  OSIX_TO_WIN_W : 
29130 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
29140 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _A) |.          
29150 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c 20    CCP_RELATIVE, 
29160 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c  zRelative, zOut,
29170 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29180 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20  e+1)<0 ){.      
29190 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
291a0 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
291b0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
291c0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
291d0 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72  VPATH, (DWORD)er
291e0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
29200 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22  inFullPathname1"
29210 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
29220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63    }else{.      c
29230 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e  har *zUtf8 = win
29240 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c  ConvertToUtf8Fil
29250 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20  ename(zOut);.   
29260 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b     if( !zUtf8 ){
29270 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29280 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20  _free(zOut);.   
29290 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
292a0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
292b0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
292c0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
292d0 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
292e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
292f0 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25 73  , zFull, "%s%c%s
29300 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29310 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29320 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
29330 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
29340 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  , zUtf8);.      
29350 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
29360 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
29370 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
29380 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
29390 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
293a0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
293b0 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
293c0 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
293d0 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
293e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
293f0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
29400 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67     }.    if( cyg
29410 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20  win_conv_path(. 
29420 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73             (osIs
29430 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58  NT() ? CCP_POSIX
29440 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f  _TO_WIN_W : CCP_
29450 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c  POSIX_TO_WIN_A),
29460 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 52 65  .            zRe
29470 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56  lative, zOut, pV
29480 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
29490 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )<0 ){.      sql
294a0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
294b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69  .      return wi
294c0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
294d0 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41  _CANTOPEN_CONVPA
294e0 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f  TH, (DWORD)errno
294f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29500 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
29510 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a  ullPathname2", z
29520 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
29530 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
29540 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e   *zUtf8 = winCon
29550 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61  vertToUtf8Filena
29560 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  me(zOut);.      
29570 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20  if( !zUtf8 ){.  
29580 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29590 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20  ee(zOut);.      
295a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
295b0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
295c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
295d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
295e0 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
295f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
29600 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74 66  Full, "%s", zUtf
29610 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
29620 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
29630 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29640 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  e(zOut);.    }. 
29650 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
29660 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23  TE_OK;.#endif..#
29670 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if (SQLITE_OS_WI
29680 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
29690 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66 69  _WINRT) && !defi
296a0 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a  ned(__CYGWIN__).
296b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
296c0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
296d0 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20 57  _ERROR );.  /* W
296e0 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e 63  inCE has no conc
296f0 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69 76  ept of a relativ
29700 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20 73  e pathname, or s
29710 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f 0a  o I am told. */.
29720 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20 6e    /* WinRT has n
29730 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72 74  o way to convert
29740 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
29750 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 20   to an absolute 
29760 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73  one. */.  if ( s
29770 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
29780 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
29790 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
297a0 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
297b0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
297c0 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
297d0 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
297e0 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
297f0 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
29800 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
29810 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
29820 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
29830 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
29840 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
29850 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
29860 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
29870 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
29880 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
29890 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
298a0 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
298b0 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
298c0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
298d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
298e0 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
298f0 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
29900 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
29930 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
29940 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
29950 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ive);.  }else{. 
29960 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29970 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70  ntf(MIN(nFull, p
29980 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29  Vfs->mxPathname)
29990 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a  , zFull, "%s", z
299a0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a 20  Relative);.  }. 
299b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
299c0 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  K;.#endif..#if !
299d0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
299e0 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
299f0 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28  NRT && !defined(
29a00 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57  __CYGWIN__).  DW
29a10 4f 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69  ORD nByte;.  voi
29a20 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
29a30 20 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 0a 20 20   char *zOut;..  
29a40 2f 2a 20 49 66 20 74 68 69 73 20 70 61 74 68 20  /* If this path 
29a50 6e 61 6d 65 20 62 65 67 69 6e 73 20 77 69 74 68  name begins with
29a60 20 22 2f 58 3a 22 2c 20 77 68 65 72 65 20 22 58   "/X:", where "X
29a70 22 20 69 73 20 61 6e 79 20 61 6c 70 68 61 62 65  " is any alphabe
29a80 74 69 63 0a 20 20 2a 2a 20 63 68 61 72 61 63 74  tic.  ** charact
29a90 65 72 2c 20 64 69 73 63 61 72 64 20 74 68 65 20  er, discard the 
29aa0 69 6e 69 74 69 61 6c 20 22 2f 22 20 66 72 6f 6d  initial "/" from
29ab0 20 74 68 65 20 70 61 74 68 6e 61 6d 65 2e 0a 20   the pathname.. 
29ac0 20 2a 2f 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   */.  if( zRelat
29ad0 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 77  ive[0]=='/' && w
29ae0 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
29af0 6e 64 43 6f 6c 6f 6e 28 7a 52 65 6c 61 74 69 76  ndColon(zRelativ
29b00 65 2b 31 29 20 29 7b 0a 20 20 20 20 7a 52 65 6c  e+1) ){.    zRel
29b10 61 74 69 76 65 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  ative++;.  }..  
29b20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73  /* It's odd to s
29b30 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72  imulate an io-er
29b40 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65  ror here, but re
29b50 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73  ally this is jus
29b60 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  t.  ** using the
29b70 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73   io-error infras
29b80 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74  tructure to test
29b90 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e   that SQLite han
29ba0 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66  dles this.  ** f
29bb0 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e  unction failing.
29bc0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
29bd0 6f 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f  ould fail if, fo
29be0 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20  r example, the. 
29bf0 20 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b   ** current work
29c00 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61  ing directory ha
29c10 73 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e  s been unlinked.
29c20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65  .  */.  Simulate
29c30 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
29c40 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
29c50 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
29c60 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
29c70 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
29c80 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
29c90 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
29ca0 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
29cb0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
29cc0 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
29cd0 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
29ce0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
29cf0 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
29d00 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
29d10 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
29d20 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
29d30 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
29d40 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
29d50 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
29d60 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
29d70 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
29d80 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
29d90 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
29da0 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
29db0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29dc0 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
29dd0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29de0 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
29df0 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
29e00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29e10 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
29e20 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
29e30 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
29e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
29e50 4f 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65  OK;.  }.  zConve
29e60 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
29e70 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
29e80 65 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  e(zRelative);.  
29e90 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d  if( zConverted==
29ea0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
29eb0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
29ec0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  EM_BKPT;.  }.  i
29ed0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
29ee0 20 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b     LPWSTR zTemp;
29ef0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47  .    nByte = osG
29f00 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28  etFullPathNameW(
29f10 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72  (LPCWSTR)zConver
29f20 74 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ted, 0, 0, 0);. 
29f30 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
29f40 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29f50 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
29f60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29f70 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
29f80 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
29f90 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
29fa0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fc0 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
29fd0 65 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e1", zRelative);
29fe0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65  .    }.    nByte
29ff0 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70   += 3;.    zTemp
2a000 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2a010 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65  Zero( nByte*size
2a020 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a  of(zTemp[0]) );.
2a030 20 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30      if( zTemp==0
2a040 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2a050 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65  3_free(zConverte
2a060 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  d);.      return
2a070 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2a080 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
2a090 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2a0a0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
2a0b0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2a0c0 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70  ed, nByte, zTemp
2a0d0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  , 0);.    if( nB
2a0e0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
2a0f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2a100 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2a110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
2a120 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mp);.      retur
2a130 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
2a140 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55  LITE_CANTOPEN_FU
2a150 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73  LLPATH, osGetLas
2a160 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20  tError(),.      
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e     "winFullPathn
2a190 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65  ame2", zRelative
2a1a0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
2a1b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2a1c0 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20  rted);.    zOut 
2a1d0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
2a1e0 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73  f8(zTemp);.    s
2a1f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2a200 70 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  p);.  }.#ifdef S
2a210 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
2a220 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20  ANSI.  else{.   
2a230 20 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20   char *zTemp;.  
2a240 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
2a250 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68  ullPathNameA((ch
2a260 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ar*)zConverted, 
2a270 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2a280 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2a290 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a2a0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2a2b0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2a2c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2a2d0 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2a2e0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2a2f0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a300 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a310 46 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20  FullPathname3", 
2a320 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a330 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2a340 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2a350 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2a360 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2a370 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2a380 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2a390 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2a3a0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2a3b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2a3c0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2a3d0 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2a3e0 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2a3f0 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a  PathNameA((char*
2a400 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79  )zConverted, nBy
2a410 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20  te, zTemp, 0);. 
2a420 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20     if( nByte==0 
2a430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a440 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2a450 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2a460 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2a470 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2a480 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2a490 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2a4a0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2a4b0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a4d0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20  FullPathname4", 
2a4e0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a4f0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2a500 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
2a510 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c 69 74      zOut = sqlit
2a520 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
2a530 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20  _utf8(zTemp);.  
2a540 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a550 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  Temp);.  }.#endi
2a560 66 0a 20 20 69 66 28 20 7a 4f 75 74 20 29 7b 0a  f.  if( zOut ){.
2a570 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a580 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2a590 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a5a0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2a5b0 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  zOut);.    sqlit
2a5c0 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
2a5d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a5e0 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
2a5f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a600 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2a610 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
2a620 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2a630 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2a640 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
2a650 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
2a660 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
2a670 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
2a680 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
2a690 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2a6a0 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
2a6b0 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
2a6c0 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
2a6d0 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65 6e 28 73  oid *winDlOpen(s
2a6e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2a6f0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2a700 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48 41 4e 44  ilename){.  HAND
2a710 4c 45 20 68 3b 0a 23 69 66 20 64 65 66 69 6e 65  LE h;.#if define
2a720 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20  d(__CYGWIN__).  
2a730 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70 56 66 73  int nFull = pVfs
2a740 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
2a750 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
2a760 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
2a770 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20 20 76 6f  o( nFull );.  vo
2a780 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d  id *zConverted =
2a790 20 30 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d   0;.  if( zFull=
2a7a0 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2a7b0 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2a7c0 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2a7d0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2a7e0 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2a7f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2a800 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
2a810 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
2a820 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 29 21  , nFull, zFull)!
2a830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a850 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53 54 52 41  Full);.    OSTRA
2a860 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65  CE(("DLOPEN name
2a870 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e  =%s, handle=%p\n
2a880 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76  ", zFilename, (v
2a890 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65  oid*)0));.    re
2a8a0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 43  turn 0;.  }.  zC
2a8b0 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f  onverted = winCo
2a8c0 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c  nvertFromUtf8Fil
2a8d0 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  ename(zFull);.  
2a8e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
2a8f0 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 76 6f 69  ll);.#else.  voi
2a900 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  d *zConverted = 
2a910 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
2a920 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
2a930 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  name);.  UNUSED_
2a940 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2a950 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a 43  .#endif.  if( zC
2a960 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20  onverted==0 ){. 
2a970 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f     OSTRACE(("DLO
2a980 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2a990 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2a9a0 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29  name, (void*)0))
2a9b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2a9c0 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e 54    }.  if( osIsNT
2a9d0 28 29 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  () ){.#if SQLITE
2a9e0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 68 20  _OS_WINRT.    h 
2a9f0 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61 67 65 64  = osLoadPackaged
2aa00 4c 69 62 72 61 72 79 28 28 4c 50 43 57 53 54 52  Library((LPCWSTR
2aa10 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 29 3b  )zConverted, 0);
2aa20 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 6f  .#else.    h = o
2aa30 73 4c 6f 61 64 4c 69 62 72 61 72 79 57 28 28 4c  sLoadLibraryW((L
2aa40 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2aa50 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23  d);.#endif.  }.#
2aa60 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
2aa70 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
2aa80 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f  se{.    h = osLo
2aa90 61 64 4c 69 62 72 61 72 79 41 28 28 63 68 61 72  adLibraryA((char
2aaa0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  *)zConverted);. 
2aab0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
2aac0 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d  ACE(("DLOPEN nam
2aad0 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c  e=%s, handle=%p\
2aae0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  n", zFilename, (
2aaf0 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20 73 71 6c  void*)h));.  sql
2ab00 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
2ab10 72 74 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  rted);.  return 
2ab20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73 74 61 74  (void*)h;.}.stat
2ab30 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 45 72 72  ic void winDlErr
2ab40 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2ab50 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2ab60 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
2ab70 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2ab80 45 52 28 70 56 66 73 29 3b 0a 20 20 77 69 6e 47  ER(pVfs);.  winG
2ab90 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f  etLastErrorMsg(o
2aba0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2abb0 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 29 3b   nBuf, zBufOut);
2abc0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
2abd0 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c 69 74 65  *winDlSym(sqlite
2abe0 33 5f 76 66 73 20 2a 70 56 66 73 2c 76 6f 69 64  3_vfs *pVfs,void
2abf0 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68 61 72 20   *pH,const char 
2ac00 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
2ac10 20 46 41 52 50 52 4f 43 20 70 72 6f 63 3b 0a 20   FARPROC proc;. 
2ac20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2ac30 52 28 70 56 66 73 29 3b 0a 20 20 70 72 6f 63 20  R(pVfs);.  proc 
2ac40 3d 20 6f 73 47 65 74 50 72 6f 63 41 64 64 72 65  = osGetProcAddre
2ac50 73 73 41 28 28 48 41 4e 44 4c 45 29 70 48 2c 20  ssA((HANDLE)pH, 
2ac60 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52 41 43 45  zSym);.  OSTRACE
2ac70 28 28 22 44 4c 53 59 4d 20 68 61 6e 64 6c 65 3d  (("DLSYM handle=
2ac80 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73 2c 20 61  %p, symbol=%s, a
2ac90 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c 0a 20 20  ddress=%p\n",.  
2aca0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
2acb0 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f 69 64 2a  pH, zSym, (void*
2acc0 29 70 72 6f 63 29 29 3b 0a 20 20 72 65 74 75 72  )proc));.  retur
2acd0 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f 69 64 29  n (void(*)(void)
2ace0 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74 69 63 20  )proc;.}.static 
2acf0 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f 73 65 28  void winDlClose(
2ad00 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2ad10 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  s, void *pHandle
2ad20 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2ad30 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6f  METER(pVfs);.  o
2ad40 73 46 72 65 65 4c 69 62 72 61 72 79 28 28 48 41  sFreeLibrary((HA
2ad50 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 20  NDLE)pHandle);. 
2ad60 20 4f 53 54 52 41 43 45 28 28 22 44 4c 43 4c 4f   OSTRACE(("DLCLO
2ad70 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c  SE handle=%p\n",
2ad80 20 28 76 6f 69 64 2a 29 70 48 61 6e 64 6c 65 29   (void*)pHandle)
2ad90 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66  );.}.#else /* if
2ada0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
2adb0 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64  D_EXTENSION is d
2adc0 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65  efined: */.  #de
2add0 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65 6e 20 20  fine winDlOpen  
2ade0 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  0.  #define winD
2adf0 6c 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69  lError 0.  #defi
2ae00 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20 20 30 0a  ne winDlSym   0.
2ae10 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 43    #define winDlC
2ae20 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  lose 0.#endif../
2ae30 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
2ae40 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 61 6e 64  ion for the rand
2ae50 6f 6d 6e 65 73 73 20 67 61 74 68 65 72 65 72 2e  omness gatherer.
2ae60 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
2ae70 63 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  ct EntropyGather
2ae80 65 72 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72  er EntropyGather
2ae90 65 72 3b 0a 73 74 72 75 63 74 20 45 6e 74 72 6f  er;.struct Entro
2aea0 70 79 47 61 74 68 65 72 65 72 20 7b 0a 20 20 75  pyGatherer {.  u
2aeb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 3b  nsigned char *a;
2aec0 20 20 20 2f 2a 20 47 61 74 68 65 72 20 65 6e 74     /* Gather ent
2aed0 72 6f 70 79 20 69 6e 74 6f 20 74 68 69 73 20 62  ropy into this b
2aee0 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
2aef0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  a;             /
2af00 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d 20 69 6e  * Size of a[] in
2af10 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
2af20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2af30 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69 6e 70 75  /* XOR next inpu
2af40 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a 2f 0a 20  t into a[i] */. 
2af50 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20 20 20 20   int nXor;      
2af60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2af70 66 20 58 4f 52 20 6f 70 65 72 61 74 69 6f 6e 73  f XOR operations
2af80 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66   done */.};..#if
2af90 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2afa0 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69 6e  _TEST) && !defin
2afb0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52  ed(SQLITE_OMIT_R
2afc0 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a 20 4d 69  ANDOMNESS)./* Mi
2afd0 78 20 73 7a 20 62 79 74 65 73 20 6f 66 20 65 6e  x sz bytes of en
2afe0 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e 20 2a 2f  tropy into p. */
2aff0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 6f 72  .static void xor
2b000 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70 79 47 61  Memory(EntropyGa
2b010 74 68 65 72 65 72 20 2a 70 2c 20 75 6e 73 69 67  therer *p, unsig
2b020 6e 65 64 20 63 68 61 72 20 2a 78 2c 20 69 6e 74  ned char *x, int
2b030 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b   sz){.  int j, k
2b040 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20 6b 3d 70  ;.  for(j=0, k=p
2b050 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b 2b 29 7b  ->i; j<sz; j++){
2b060 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b 5d 20 5e  .    p->a[k++] ^
2b070 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  = x[j];.    if( 
2b080 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20 3d 20 30  k>=p->na ) k = 0
2b090 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20 3d 20 6b  ;.  }.  p->i = k
2b0a0 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b 3d 20 73  ;.  p->nXor += s
2b0b0 7a 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  z;.}.#endif../*.
2b0c0 2a 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e  ** Write up to n
2b0d0 42 75 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e  Buf bytes of ran
2b0e0 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75  domness into zBu
2b0f0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
2b100 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 28 73   winRandomness(s
2b110 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b120 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2b130 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20 64 65 66   *zBuf){.#if def
2b140 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2b150 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2b160 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2b170 45 53 53 29 0a 20 20 55 4e 55 53 45 44 5f 50 41  ESS).  UNUSED_PA
2b180 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2b190 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2b1a0 20 6e 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   nBuf);.  return
2b1b0 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a 20 20 45   nBuf;.#else.  E
2b1c0 6e 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 65  ntropyGatherer e
2b1d0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2b1e0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 6d 65  ETER(pVfs);.  me
2b1f0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
2b200 75 66 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  uf);.#if defined
2b210 28 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d  (_MSC_VER) && _M
2b220 53 43 5f 56 45 52 3e 3d 31 34 30 30 0a 20 20 72  SC_VER>=1400.  r
2b230 61 6e 64 5f 73 28 28 69 6e 74 2a 29 7a 42 75 66  and_s((int*)zBuf
2b240 29 3b 20 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69  ); /* rand_s() i
2b250 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
2b260 77 69 74 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65  with MinGW */.#e
2b270 6e 64 69 66 0a 20 20 65 2e 61 20 3d 20 28 75 6e  ndif.  e.a = (un
2b280 73 69 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75  signed char*)zBu
2b290 66 3b 0a 20 20 65 2e 6e 61 20 3d 20 6e 42 75 66  f;.  e.na = nBuf
2b2a0 3b 0a 20 20 65 2e 6e 58 6f 72 20 3d 20 30 3b 0a  ;.  e.nXor = 0;.
2b2b0 20 20 65 2e 69 20 3d 20 30 3b 0a 20 20 7b 0a 20    e.i = 0;.  {. 
2b2c0 20 20 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b     SYSTEMTIME x;
2b2d0 0a 20 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d  .    osGetSystem
2b2e0 54 69 6d 65 28 26 78 29 3b 0a 20 20 20 20 78 6f  Time(&x);.    xo
2b2f0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2b300 69 67 6e 65 64 20 63 68 61 72 2a 29 26 78 2c 20  igned char*)&x, 
2b310 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 7d 0a  sizeof(x));.  }.
2b320 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 70 69    {.    DWORD pi
2b330 64 20 3d 20 6f 73 47 65 74 43 75 72 72 65 6e 74  d = osGetCurrent
2b340 50 72 6f 63 65 73 73 49 64 28 29 3b 0a 20 20 20  ProcessId();.   
2b350 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2b360 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2b370 70 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29  pid, sizeof(pid)
2b380 29 3b 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  );.  }.#if SQLIT
2b390 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 0a 20  E_OS_WINRT.  {. 
2b3a0 20 20 20 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74     ULONGLONG cnt
2b3b0 20 3d 20 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e   = osGetTickCoun
2b3c0 74 36 34 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65  t64();.    xorMe
2b3d0 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e  mory(&e, (unsign
2b3e0 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20 73  ed char*)&cnt, s
2b3f0 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 7d  izeof(cnt));.  }
2b400 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
2b410 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74  WORD cnt = osGet
2b420 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20  TickCount();.   
2b430 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2b440 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2b450 63 6e 74 2c 20 73 69 7a 65 6f 66 28 63 6e 74 29  cnt, sizeof(cnt)
2b460 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2b470 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49 4e 54 45  {.    LARGE_INTE
2b480 47 45 52 20 69 3b 0a 20 20 20 20 6f 73 51 75 65  GER i;.    osQue
2b490 72 79 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75  ryPerformanceCou
2b4a0 6e 74 65 72 28 26 69 29 3b 0a 20 20 20 20 78 6f  nter(&i);.    xo
2b4b0 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73  rMemory(&e, (uns
2b4c0 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 2c 20  igned char*)&i, 
2b4d0 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 7d 0a  sizeof(i));.  }.
2b4e0 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
2b4f0 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f  INCE && !SQLITE_
2b500 4f 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49  OS_WINRT && SQLI
2b510 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49  TE_WIN32_USE_UUI
2b520 44 0a 20 20 7b 0a 20 20 20 20 55 55 49 44 20 69  D.  {.    UUID i
2b530 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  d;.    memset(&i
2b540 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49  d, 0, sizeof(UUI
2b550 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43  D));.    osUuidC
2b560 72 65 61 74 65 28 26 69 64 29 3b 0a 20 20 20 20  reate(&id);.    
2b570 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2b580 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69  nsigned char*)&i
2b590 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29  d, sizeof(UUID))
2b5a0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64  ;.    memset(&id
2b5b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  , 0, sizeof(UUID
2b5c0 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72  ));.    osUuidCr
2b5d0 65 61 74 65 53 65 71 75 65 6e 74 69 61 6c 28 26  eateSequential(&
2b5e0 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f  id);.    xorMemo
2b5f0 72 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64  ry(&e, (unsigned
2b600 20 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65   char*)&id, size
2b610 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 7d 0a 23  of(UUID));.  }.#
2b620 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 65  endif.  return e
2b630 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20 6e 42 75  .nXor>nBuf ? nBu
2b640 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23 65 6e 64  f : e.nXor;.#end
2b650 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
2b660 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65  LITE_TEST) || de
2b670 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b680 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f  T_RANDOMNESS) */
2b690 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  .}.../*.** Sleep
2b6a0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
2b6b0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
2b6c0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
2b6d0 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  slept..*/.static
2b6e0 20 69 6e 74 20 77 69 6e 53 6c 65 65 70 28 73 71   int winSleep(sq
2b6f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2b700 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 29 7b 0a   int microsec){.
2b710 20 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f    sqlite3_win32_
2b720 73 6c 65 65 70 28 28 6d 69 63 72 6f 73 65 63 2b  sleep((microsec+
2b730 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20 55 4e  999)/1000);.  UN
2b740 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2b750 56 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Vfs);.  return (
2b760 28 6d 69 63 72 6f 73 65 63 2b 39 39 39 29 2f 31  (microsec+999)/1
2b770 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a 0a 2f 2a  000)*1000;.}../*
2b780 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2b790 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
2b7a0 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
2b7b0 20 76 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72   value, is inter
2b7c0 70 72 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65  preted as.** the
2b7d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
2b7e0 64 73 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e  ds since 1970 an
2b7f0 64 20 69 73 20 75 73 65 64 20 74 6f 20 73 65 74  d is used to set
2b800 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2b810 2a 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65  * sqlite3OsCurre
2b820 6e 74 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20  ntTime() during 
2b830 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
2b840 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
2b850 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
2b860 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a  nt_time = 0;  /*
2b870 20 46 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d   Fake system tim
2b880 65 20 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e  e in seconds sin
2b890 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64  ce 1970. */.#end
2b8a0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
2b8b0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
2b8c0 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
2b8d0 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
2b8e0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
2b8f0 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  Now.** the curre
2b900 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
2b910 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
2b920 20 6e 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36   number times 86
2b930 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a  _400_000.  In.**
2b940 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72   other words, wr
2b950 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20  ite into *piNow 
2b960 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
2b970 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  lliseconds since
2b980 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65   the Julian.** e
2b990 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20  poch of noon in 
2b9a0 47 72 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76  Greenwich on Nov
2b9b0 65 6d 62 65 72 20 32 34 2c 20 34 37 31 34 20 42  ember 24, 4714 B
2b9c0 2e 43 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  .C according to 
2b9d0 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63  the.** proleptic
2b9e0 20 47 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e   Gregorian calen
2b9f0 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75  dar..**.** On su
2ba00 63 63 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51  ccess, return SQ
2ba10 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e  LITE_OK.  Return
2ba20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
2ba30 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
2ba40 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  te.** cannot be 
2ba50 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
2ba60 20 69 6e 74 20 77 69 6e 43 75 72 72 65 6e 74 54   int winCurrentT
2ba70 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
2ba80 5f 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69  _vfs *pVfs, sqli
2ba90 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77  te3_int64 *piNow
2baa0 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54 49 4d 45  ){.  /* FILETIME
2bab0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 20   structure is a 
2bac0 36 34 2d 62 69 74 20 76 61 6c 75 65 20 72 65 70  64-bit value rep
2bad0 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 6e 75  resenting the nu
2bae0 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 31 30 30  mber of.     100
2baf0 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69 6e 74 65  -nanosecond inte
2bb00 72 76 61 6c 73 20 73 69 6e 63 65 20 4a 61 6e 75  rvals since Janu
2bb10 61 72 79 20 31 2c 20 31 36 30 31 20 28 3d 20 4a  ary 1, 1601 (= J
2bb20 44 20 32 33 30 35 38 31 33 2e 35 29 2e 0a 20 20  D 2305813.5)..  
2bb30 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45 20 66 74  */.  FILETIME ft
2bb40 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
2bb50 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 77   sqlite3_int64 w
2bb60 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2bb70 3d 20 32 33 30 35 38 31 33 35 2a 28 73 71 6c 69  = 23058135*(sqli
2bb80 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2bb90 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
2bba0 5f 54 45 53 54 0a 20 20 73 74 61 74 69 63 20 63  _TEST.  static c
2bbb0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
2bbc0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
2bbd0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
2bbe0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
2bbf0 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32 5e 33 32  #endif.  /* 2^32
2bc00 20 2d 20 74 6f 20 61 76 6f 69 64 20 75 73 65 20   - to avoid use 
2bc10 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72 6e 69 6e  of LL and warnin
2bc20 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a 20 20 73  gs in gcc */.  s
2bc30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2bc40 74 65 33 5f 69 6e 74 36 34 20 6d 61 78 33 32 42  te3_int64 max32B
2bc50 69 74 56 61 6c 75 65 20 3d 0a 20 20 20 20 20 20  itValue =.      
2bc60 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32  (sqlite3_int64)2
2bc70 30 30 30 30 30 30 30 30 30 20 2b 20 28 73 71 6c  000000000 + (sql
2bc80 69 74 65 33 5f 69 6e 74 36 34 29 32 30 30 30 30  ite3_int64)20000
2bc90 30 30 30 30 30 20 2b 0a 20 20 20 20 20 20 28 73  00000 +.      (s
2bca0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 39 34  qlite3_int64)294
2bcb0 39 36 37 32 39 36 3b 0a 0a 23 69 66 20 53 51 4c  967296;..#if SQL
2bcc0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 53  ITE_OS_WINCE.  S
2bcd0 59 53 54 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a  YSTEMTIME time;.
2bce0 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d    osGetSystemTim
2bcf0 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f 2a 20 69  e(&time);.  /* i
2bd00 66 20 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69  f SystemTimeToFi
2bd10 6c 65 54 69 6d 65 28 29 20 66 61 69 6c 73 2c 20  leTime() fails, 
2bd20 69 74 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e  it returns zero.
2bd30 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73 53 79 73   */.  if (!osSys
2bd40 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d  temTimeToFileTim
2bd50 65 28 26 74 69 6d 65 2c 26 66 74 29 29 7b 0a 20  e(&time,&ft)){. 
2bd60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2bd70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6c 73  _ERROR;.  }.#els
2bd80 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54  e.  osGetSystemT
2bd90 69 6d 65 41 73 46 69 6c 65 54 69 6d 65 28 20 26  imeAsFileTime( &
2bda0 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ft );.#endif..  
2bdb0 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46 69 6c 65  *piNow = winFile
2bdc0 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20 20 20 20  timeEpoch +.    
2bdd0 20 20 20 20 20 20 20 20 28 28 28 28 73 71 6c 69          ((((sqli
2bde0 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64 77 48  te3_int64)ft.dwH
2bdf0 69 67 68 44 61 74 65 54 69 6d 65 29 2a 6d 61 78  ighDateTime)*max
2be00 33 32 42 69 74 56 61 6c 75 65 29 20 2b 0a 20 20  32BitValue) +.  
2be10 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
2be20 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e 64  lite3_int64)ft.d
2be30 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f 28 73  wLowDateTime)/(s
2be40 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 31 30 30  qlite3_int64)100
2be50 30 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  00;..#ifdef SQLI
2be60 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
2be70 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2be80 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e 6f 77  me ){.    *piNow
2be90 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33   = 1000*(sqlite3
2bea0 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33 5f 63  _int64)sqlite3_c
2beb0 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20 75 6e  urrent_time + un
2bec0 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23 65 6e  ixEpoch;.  }.#en
2bed0 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  dif.  UNUSED_PAR
2bee0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2bef0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2bf00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
2bf10 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
2bf20 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
2bf30 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
2bf40 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
2bf50 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
2bf60 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
2bf70 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
2bf80 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
2bf90 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
2bfa0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
2bfb0 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
2bfc0 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2bfd0 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2bfe0 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
2bff0 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
2c000 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69 6e 74 20   *prNow){.  int 
2c010 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  rc;.  sqlite3_in
2c020 74 36 34 20 69 3b 0a 20 20 72 63 20 3d 20 77 69  t64 i;.  rc = wi
2c030 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  nCurrentTimeInt6
2c040 34 28 70 56 66 73 2c 20 26 69 29 3b 0a 20 20 69  4(pVfs, &i);.  i
2c050 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 2a 70  f( !rc ){.    *p
2c060 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30 30 30  rNow = i/8640000
2c070 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  0.0;.  }.  retur
2c080 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2c090 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
2c0a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  this function wo
2c0b0 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f 6d 62 69  rks like a combi
2c0c0 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 47 65 74  nation of.** Get
2c0d0 4c 61 73 74 45 72 72 6f 72 28 29 20 61 6e 64 20  LastError() and 
2c0e0 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 28 29 20  FormatMessage() 
2c0f0 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f 72 20 65  on Windows (or e
2c100 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73 74 72 65  rrno and.** stre
2c110 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55 6e 69 78  rror_r() on Unix
2c120 29 2e 20 41 66 74 65 72 20 61 6e 20 65 72 72 6f  ). After an erro
2c130 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 62 79  r is returned by
2c140 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e 63 74 69   an OS.** functi
2c150 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  on, SQLite calls
2c160 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
2c170 69 74 68 20 7a 42 75 66 20 70 6f 69 6e 74 69 6e  ith zBuf pointin
2c180 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66 66 65 72  g to.** a buffer
2c190 20 6f 66 20 6e 42 75 66 20 62 79 74 65 73 2e 20   of nBuf bytes. 
2c1a0 54 68 65 20 4f 53 20 6c 61 79 65 72 20 73 68 6f  The OS layer sho
2c1b0 75 6c 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  uld populate the
2c1c0 0a 2a 2a 20 62 75 66 66 65 72 20 77 69 74 68 20  .** buffer with 
2c1d0 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  a nul-terminated
2c1e0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 65   UTF-8 encoded e
2c1f0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
2c200 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 6c  describing the l
2c210 61 73 74 20 49 4f 20 65 72 72 6f 72 20 74 6f 20  ast IO error to 
2c220 68 61 76 65 20 6f 63 63 75 72 72 65 64 20 77 69  have occurred wi
2c230 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 69 6e 67  thin the calling
2c240 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  .** thread..**.*
2c250 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6d  * If the error m
2c260 65 73 73 61 67 65 20 69 73 20 74 6f 6f 20 6c 61  essage is too la
2c270 72 67 65 20 66 6f 72 20 74 68 65 20 73 75 70 70  rge for the supp
2c280 6c 69 65 64 20 62 75 66 66 65 72 2c 0a 2a 2a 20  lied buffer,.** 
2c290 69 74 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75  it should be tru
2c2a0 6e 63 61 74 65 64 2e 20 54 68 65 20 72 65 74 75  ncated. The retu
2c2b0 72 6e 20 76 61 6c 75 65 20 6f 66 20 78 47 65 74  rn value of xGet
2c2c0 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20 69 73 20  LastError.** is 
2c2d0 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f  zero if the erro
2c2e0 72 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69  r message fits i
2c2f0 6e 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72  n the buffer, or
2c300 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68   non-zero.** oth
2c310 65 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d  erwise (if the m
2c320 65 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63  essage was trunc
2c330 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e 2d 7a 65  ated). If non-ze
2c340 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a  ro is returned,.
2c350 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f  ** then it is no
2c360 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 69  t necessary to i
2c370 6e 63 6c 75 64 65 20 74 68 65 20 6e 75 6c 2d 74  nclude the nul-t
2c380 65 72 6d 69 6e 61 74 6f 72 20 63 68 61 72 61 63  erminator charac
2c390 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65 20 6f 75  ter.** in the ou
2c3a0 74 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  tput buffer..**.
2c3b0 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79 69 6e 67  ** Not supplying
2c3c0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2c3d0 65 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 61  e will have no a
2c3e0 64 76 65 72 73 65 20 65 66 66 65 63 74 0a 2a 2a  dverse effect.**
2c3f0 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49 74 20 69   on SQLite. It i
2c400 73 20 66 69 6e 65 20 74 6f 20 68 61 76 65 20 61  s fine to have a
2c410 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  n implementation
2c420 20 74 68 61 74 20 6e 65 76 65 72 0a 2a 2a 20 72   that never.** r
2c430 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 20  eturns an error 
2c440 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20  message:.**.**  
2c450 20 69 6e 74 20 78 47 65 74 4c 61 73 74 45 72 72   int xGetLastErr
2c460 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
2c470 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20  pVfs, int nBuf, 
2c480 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 2a 2a 20  char *zBuf){.** 
2c490 20 20 20 20 61 73 73 65 72 74 28 7a 42 75 66 5b      assert(zBuf[
2c4a0 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a 20 20 20  0]=='\0');.**   
2c4b0 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a 2a 20 20    return 0;.**  
2c4c0 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65 76 65 72   }.**.** However
2c4d0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   if an error mes
2c4e0 73 61 67 65 20 69 73 20 73 75 70 70 6c 69 65 64  sage is supplied
2c4f0 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 69 6e 63  , it will be inc
2c500 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20 62 79 20  orporated.** by 
2c510 73 71 6c 69 74 65 20 69 6e 74 6f 20 74 68 65 20  sqlite into the 
2c520 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 76  error message av
2c530 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
2c540 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  ser using.** sql
2c550 69 74 65 33 5f 65 72 72 6d 73 67 28 29 2c 20 70  ite3_errmsg(), p
2c560 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e 67 20 49  ossibly making I
2c570 4f 20 65 72 72 6f 72 73 20 65 61 73 69 65 72 20  O errors easier 
2c580 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a 73 74 61  to debug..*/.sta
2c590 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
2c5a0 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  stError(sqlite3_
2c5b0 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
2c5c0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
2c5d0 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
2c5e0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
2c5f0 74 75 72 6e 20 77 69 6e 47 65 74 4c 61 73 74 45  turn winGetLastE
2c600 72 72 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73  rrorMsg(osGetLas
2c610 74 45 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20  tError(), nBuf, 
2c620 7a 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zBuf);.}../*.** 
2c630 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20 64  Initialize and d
2c640 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20  einitialize the 
2c650 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
2c660 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 69   interface..*/.i
2c670 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e  nt sqlite3_os_in
2c680 69 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  it(void){.  stat
2c690 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77  ic sqlite3_vfs w
2c6a0 69 6e 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c  inVfs = {.    3,
2c6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6c0 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
2c6d0 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e  /.    sizeof(win
2c6e0 46 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a  File),     /* sz
2c6f0 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51  OsFile */.    SQ
2c700 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 50  LITE_WIN32_MAX_P
2c710 41 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78  ATH_BYTES, /* mx
2c720 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  Pathname */.    
2c730 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2c740 20 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f       /* pNext */
2c750 0a 20 20 20 20 22 77 69 6e 33 32 22 2c 20 20 20  .    "win32",   
2c760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e 61            /* zNa
2c770 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20  me */.    0,    
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c790 2a 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20  * pAppData */.  
2c7a0 20 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20    winOpen,      
2c7b0 20 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20         /* xOpen 
2c7c0 2a 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65  */.    winDelete
2c7d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
2c7e0 44 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69  Delete */.    wi
2c7f0 6e 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  nAccess,        
2c800 20 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f     /* xAccess */
2c810 0a 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68  .    winFullPath
2c820 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75  name,     /* xFu
2c830 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20  llPathname */.  
2c840 20 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20    winDlOpen,    
2c850 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65         /* xDlOpe
2c860 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72  n */.    winDlEr
2c870 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ror,          /*
2c880 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20   xDlError */.   
2c890 20 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20   winDlSym,      
2c8a0 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20        /* xDlSym 
2c8b0 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73  */.    winDlClos
2c8c0 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  e,          /* x
2c8d0 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77  DlClose */.    w
2c8e0 69 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  inRandomness,   
2c8f0 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65      /* xRandomne
2c900 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65  ss */.    winSle
2c910 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ep,            /
2c920 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20  * xSleep */.    
2c930 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20  winCurrentTime, 
2c940 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
2c950 54 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Time */.    winG
2c960 65 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20  etLastError,    
2c970 20 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f   /* xGetLastErro
2c980 72 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72  r */.    winCurr
2c990 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a  entTimeInt64, /*
2c9a0 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
2c9b0 36 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74  64 */.    winSet
2c9c0 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f  SystemCall,    /
2c9d0 2a 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  * xSetSystemCall
2c9e0 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79   */.    winGetSy
2c9f0 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20  stemCall,    /* 
2ca00 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a  xGetSystemCall *
2ca10 2f 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73  /.    winNextSys
2ca20 74 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e  temCall,   /* xN
2ca30 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  extSystemCall */
2ca40 0a 20 20 7d 3b 0a 23 69 66 20 64 65 66 69 6e 65  .  };.#if define
2ca50 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2ca60 41 53 5f 57 49 44 45 29 0a 20 20 73 74 61 74 69  AS_WIDE).  stati
2ca70 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 77 69  c sqlite3_vfs wi
2ca80 6e 4c 6f 6e 67 50 61 74 68 56 66 73 20 3d 20 7b  nLongPathVfs = {
2ca90 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20  .    3,         
2caa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2cab0 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a  rsion */.    siz
2cac0 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20  eof(winFile),   
2cad0 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
2cae0 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 4e  .    SQLITE_WINN
2caf0 54 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53  T_MAX_PATH_BYTES
2cb00 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20  , /* mxPathname 
2cb10 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2cb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2cb30 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e  Next */.    "win
2cb40 33 32 2d 6c 6f 6e 67 70 61 74 68 22 2c 20 20 20  32-longpath",   
2cb50 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20   /* zName */.   
2cb60 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
2cb70 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74        /* pAppDat
2cb80 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e  a */.    winOpen
2cb90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2cba0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69   xOpen */.    wi
2cbb0 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20  nDelete,        
2cbc0 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f     /* xDelete */
2cbd0 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20  .    winAccess, 
2cbe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
2cbf0 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46  cess */.    winF
2cc00 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20  ullPathname,    
2cc10 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d   /* xFullPathnam
2cc20 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70  e */.    winDlOp
2cc30 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  en,           /*
2cc40 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20   xDlOpen */.    
2cc50 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20  winDlError,     
2cc60 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72       /* xDlError
2cc70 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d   */.    winDlSym
2cc80 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2cc90 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69  xDlSym */.    wi
2cca0 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  nDlClose,       
2ccb0 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a     /* xDlClose *
2ccc0 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e  /.    winRandomn
2ccd0 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52  ess,       /* xR
2cce0 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20  andomness */.   
2ccf0 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20   winSleep,      
2cd00 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20        /* xSleep 
2cd10 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e  */.    winCurren
2cd20 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78  tTime,      /* x
2cd30 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
2cd40 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72     winGetLastErr
2cd50 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c  or,     /* xGetL
2cd60 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  astError */.    
2cd70 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  winCurrentTimeIn
2cd80 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74  t64, /* xCurrent
2cd90 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20  TimeInt64 */.   
2cda0 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c   winSetSystemCal
2cdb0 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73  l,    /* xSetSys
2cdc0 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77  temCall */.    w
2cdd0 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c  inGetSystemCall,
2cde0 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65      /* xGetSyste
2cdf0 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e  mCall */.    win
2ce00 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  NextSystemCall, 
2ce10 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d    /* xNextSystem
2ce20 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 65 6e  Call */.  };.#en
2ce30 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 75 62 6c 65  dif..  /* Double
2ce40 2d 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  -check that the 
2ce50 61 53 79 73 63 61 6c 6c 5b 5d 20 61 72 72 61 79  aSyscall[] array
2ce60 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 73 74 72   has been constr
2ce70 75 63 74 65 64 0a 20 20 2a 2a 20 63 6f 72 72 65  ucted.  ** corre
2ce80 63 74 6c 79 2e 20 20 53 65 65 20 74 69 63 6b 65  ctly.  See ticke
2ce90 74 20 5b 62 62 33 61 38 36 65 38 39 30 63 38 65  t [bb3a86e890c8e
2cea0 39 36 61 62 5d 20 2a 2f 0a 20 20 61 73 73 65 72  96ab] */.  asser
2ceb0 74 28 20 41 72 72 61 79 53 69 7a 65 28 61 53 79  t( ArraySize(aSy
2cec0 73 63 61 6c 6c 29 3d 3d 38 30 20 29 3b 0a 0a 20  scall)==80 );.. 
2ced0 20 2f 2a 20 67 65 74 20 6d 65 6d 6f 72 79 20 6d   /* get memory m
2cee0 61 70 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 67 72  ap allocation gr
2cef0 61 6e 75 6c 61 72 69 74 79 20 2a 2f 0a 20 20 6d  anularity */.  m
2cf00 65 6d 73 65 74 28 26 77 69 6e 53 79 73 49 6e 66  emset(&winSysInf
2cf10 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 59 53  o, 0, sizeof(SYS
2cf20 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a 23 69 66 20  TEM_INFO));.#if 
2cf30 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2cf40 20 20 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73    osGetNativeSys
2cf50 74 65 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49  temInfo(&winSysI
2cf60 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73  nfo);.#else.  os
2cf70 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  GetSystemInfo(&w
2cf80 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6e 64  inSysInfo);.#end
2cf90 69 66 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e  if.  assert( win
2cfa0 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
2cfb0 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3e  tionGranularity>
2cfc0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  0 );.  assert( w
2cfd0 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65  inSysInfo.dwPage
2cfe0 53 69 7a 65 3e 30 20 29 3b 0a 0a 20 20 73 71 6c  Size>0 );..  sql
2cff0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
2d000 72 28 26 77 69 6e 56 66 73 2c 20 31 29 3b 0a 0a  r(&winVfs, 1);..
2d010 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2d020 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
2d030 45 29 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  E).  sqlite3_vfs
2d040 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 4c 6f  _register(&winLo
2d050 6e 67 50 61 74 68 56 66 73 2c 20 30 29 3b 0a 23  ngPathVfs, 0);.#
2d060 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
2d070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 69 6e  SQLITE_OK;.}..in
2d080 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64  t sqlite3_os_end
2d090 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c 49  (void){.#if SQLI
2d0a0 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
2d0b0 28 20 73 6c 65 65 70 4f 62 6a 21 3d 4e 55 4c 4c  ( sleepObj!=NULL
2d0c0 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
2d0d0 61 6e 64 6c 65 28 73 6c 65 65 70 4f 62 6a 29 3b  andle(sleepObj);
2d0e0 0a 20 20 20 20 73 6c 65 65 70 4f 62 6a 20 3d 20  .    sleepObj = 
2d0f0 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  NULL;.  }.#endif
2d100 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2d110 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
2d120 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20  * SQLITE_OS_WIN 
2d130 2a 2f 0a                                         */.