/ Hex Artifact Content
Login

Artifact ccf29ddded3e41e506b6bd98c1171aa0963b23f2:


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 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
9dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
9dd0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 45  te3_log(SQLITE_E
9de0: 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20 74 6f  RROR, "failed to
9df0: 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28 25 6c   HeapCompact (%l
9e00: 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  u), heap=%p",.  
9e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e20: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9e30: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
9e40: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9e50: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
9e60: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69    }.#else.  sqli
9e70: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
9e80: 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c 65 64  OTFOUND, "failed
9e90: 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 2c   to HeapCompact,
9ea0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
9eb0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
9ec0: 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d 20 53  hHeap);.  rc = S
9ed0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
9ee0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 6e 4c  #endif.  if( pnL
9ef0: 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61 72 67  argest ) *pnLarg
9f00: 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74 3b 0a  est = nLargest;.
9f10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9f20: 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e 33 32  /*.** If a Win32
9f30: 20 6e 61 74 69 76 65 20 68 65 61 70 20 68 61 73   native heap has
9f40: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
9f50: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9f60: 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74 6f 0a  will attempt to.
9f70: 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64 20 72  ** destroy and r
9f80: 65 63 72 65 61 74 65 20 69 74 2e 20 20 49 66 20  ecreate it.  If 
9f90: 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69 76 65  the Win32 native
9fa0: 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69 73 6f   heap is not iso
9fb0: 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a 2a 20  lated and/or.** 
9fc0: 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f  the sqlite3_memo
9fd0: 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63 74 69  ry_used() functi
9fe0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 74 75  on does not retu
9ff0: 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54 45 5f  rn zero, SQLITE_
a000: 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  BUSY will.** be 
a010: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20  returned and no 
a020: 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65 20  changes will be 
a030: 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69 6e 33  made to the Win3
a040: 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e 0a 2a  2 native heap..*
a050: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 69  /.int sqlite3_wi
a060: 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70 28 29  n32_reset_heap()
a070: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 55  {.  int rc;.  MU
a080: 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
a090: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
a0a0: 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61 69 6e  r; ) /* The main
a0b0: 20 73 74 61 74 69 63 20 6d 75 74 65 78 20 2a 2f   static mutex */
a0c0: 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
a0d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a0e0: 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54 68 65  Mem; )    /* The
a0f0: 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63 20 6d   memsys static m
a100: 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  utex */.  MUTEX_
a110: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
a120: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
a130: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a140: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a150: 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  ; ).  MUTEX_LOGI
a160: 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65  C( pMem = sqlite
a170: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
a180: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
a190: 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69  C_MEM); ).  sqli
a1a0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a1b0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69  pMaster);.  sqli
a1c0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
a1d0: 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41  pMem);.  winMemA
a1e0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
a1f0: 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61  if( winMemGetHea
a200: 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e  p()!=NULL && win
a210: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26  MemGetOwned() &&
a220: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f   sqlite3_memory_
a230: 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20  used()==0 ){.   
a240: 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68   /*.    ** At th
a250: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20  is point, there 
a260: 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74  should be no out
a270: 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20  standing memory 
a280: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20  allocations on. 
a290: 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20     ** the heap. 
a2a0: 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74   Also, since bot
a2b0: 68 20 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64  h the master and
a2c0: 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72   memsys locks ar
a2d0: 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
a2e0: 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ** being held by
a2f0: 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75   us, no other fu
a300: 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f  nction (i.e. fro
a310: 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  m another thread
a320: 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20  ) should.    ** 
a330: 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20  be able to even 
a340: 61 63 63 65 73 73 20 74 68 65 20 68 65 61 70 2e  access the heap.
a350: 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73    Attempt to des
a360: 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74  troy and recreat
a370: 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f  e our.    ** iso
a380: 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69  lated Win32 nati
a390: 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20  ve heap now..   
a3a0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
a3b0: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21  winMemGetHeap()!
a3c0: 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73  =NULL );.    ass
a3d0: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77  ert( winMemGetOw
a3e0: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
a3f0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d  ert( sqlite3_mem
a400: 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b  ory_used()==0 );
a410: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64  .    winMemShutd
a420: 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74  own(winMemGetDat
a430: 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73  aPtr());.    ass
a440: 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65  ert( winMemGetHe
a450: 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20  ap()==NULL );.  
a460: 20 20 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65    assert( !winMe
a470: 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20  mGetOwned() );. 
a480: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
a490: 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29  e3_memory_used()
a4a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
a4b0: 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65  winMemInit(winMe
a4c0: 6d 47 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a  mGetDataPtr());.
a4d0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
a4e0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e  SQLITE_OK || win
a4f0: 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55  MemGetHeap()!=NU
a500: 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LL );.    assert
a510: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a520: 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  || winMemGetOwne
a530: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a540: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
a550: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f   || sqlite3_memo
a560: 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a  ry_used()==0 );.
a570: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a    }else{.    /*.
a580: 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32      ** The Win32
a590: 20 6e 61 74 69 76 65 20 68 65 61 70 20 63 61 6e   native heap can
a5a0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
a5b0: 62 65 63 61 75 73 65 20 69 74 20 6d 61 79 20 62  because it may b
a5c0: 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f  e in use..    */
a5d0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
a5e0: 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BUSY;.  }.  sql
a5f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a600: 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  (pMem);.  sqlite
a610: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d  3_mutex_leave(pM
a620: 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
a630: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
a640: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
a650: 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54  LLOC */../*.** T
a660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74  his function out
a670: 70 75 74 73 20 74 68 65 20 73 70 65 63 69 66 69  puts the specifi
a680: 65 64 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67  ed (ANSI) string
a690: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65   to the Win32 de
a6a0: 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76  bugger.** (if av
a6b0: 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f  ailable)..*/..vo
a6c0: 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  id sqlite3_win32
a6d0: 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e  _write_debug(con
a6e0: 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69  st char *zBuf, i
a6f0: 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72  nt nBuf){.  char
a700: 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f   zDbgBuf[SQLITE_
a710: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a720: 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20  ZE];.  int nMin 
a730: 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c  = MIN(nBuf, (SQL
a740: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a750: 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a  F_SIZE - 1)); /*
a760: 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69 76 65   may be negative
a770: 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c  . */.  if( nMin<
a780: 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20  -1 ) nMin = -1; 
a790: 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20  /* all negative 
a7a0: 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31  values become -1
a7b0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  . */.  assert( n
a7c0: 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d  Min==-1 || nMin=
a7d0: 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54  =0 || nMin<SQLIT
a7e0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a7f0: 53 49 5a 45 20 29 3b 0a 23 69 66 20 64 65 66 69  SIZE );.#if defi
a800: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
a810: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66 28  _HAS_ANSI).  if(
a820: 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20 6d   nMin>0 ){.    m
a830: 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20 30  emset(zDbgBuf, 0
a840: 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44  , SQLITE_WIN32_D
a850: 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20 20  BG_BUF_SIZE);.  
a860: 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75 66    memcpy(zDbgBuf
a870: 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a 20  , zBuf, nMin);. 
a880: 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67     osOutputDebug
a890: 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66 29  StringA(zDbgBuf)
a8a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  ;.  }else{.    o
a8b0: 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69  sOutputDebugStri
a8c0: 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a 23  ngA(zBuf);.  }.#
a8d0: 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  elif defined(SQL
a8e0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
a8f0: 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44 62  DE).  memset(zDb
a900: 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f  gBuf, 0, SQLITE_
a910: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a920: 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d 75  ZE);.  if ( osMu
a930: 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68 61  ltiByteToWideCha
a940: 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73 41  r(.          osA
a950: 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29  reFileApisANSI()
a960: 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f 4f   ? CP_ACP : CP_O
a970: 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a 20  EMCP, 0, zBuf,. 
a980: 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20 28           nMin, (
a990: 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c 20  LPWSTR)zDbgBuf, 
a9a0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47  SQLITE_WIN32_DBG
a9b0: 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f 66  _BUF_SIZE/sizeof
a9c0: 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a 20  (WCHAR))<=0 ){. 
a9d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
a9e0: 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74   osOutputDebugSt
a9f0: 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29 7a  ringW((LPCWSTR)z
aa00: 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20  DbgBuf);.#else. 
aa10: 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20   if( nMin>0 ){. 
aa20: 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42 75     memset(zDbgBu
aa30: 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e  f, 0, SQLITE_WIN
aa40: 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 29  32_DBG_BUF_SIZE)
aa50: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62  ;.    memcpy(zDb
aa60: 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e  gBuf, zBuf, nMin
aa70: 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  );.    fprintf(s
aa80: 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44 62  tderr, "%s", zDb
aa90: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
aaa0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
aab0: 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b  rr, "%s", zBuf);
aac0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
aad0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
aae0: 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70 65  ng routine suspe
aaf0: 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  nds the current 
ab00: 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c 65  thread for at le
ab10: 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69 73  ast ms.** millis
ab20: 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69 73  econds.  This is
ab30: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74   equivalent to t
ab40: 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28 29  he Win32 Sleep()
ab50: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 23   interface..*/.#
ab60: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
ab70: 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c 45  RT.static HANDLE
ab80: 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c   sleepObj = NULL
ab90: 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20 73  ;.#endif..void s
aba0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
abb0: 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73 65  ep(DWORD millise
abc0: 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c 49  conds){.#if SQLI
abd0: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66  TE_OS_WINRT.  if
abe0: 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55 4c   ( sleepObj==NUL
abf0: 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f 62  L ){.    sleepOb
ac00: 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65 6e  j = osCreateEven
ac10: 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  tExW(NULL, NULL,
ac20: 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d 41   CREATE_EVENT_MA
ac30: 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20 20  NUAL_RESET,.    
ac40: 20 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 53 59 4e 43              SYNC
ac60: 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20 20  HRONIZE);.  }.  
ac70: 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62 6a  assert( sleepObj
ac80: 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57 61  !=NULL );.  osWa
ac90: 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
aca0: 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d 69  tEx(sleepObj, mi
acb0: 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c 53  lliseconds, FALS
acc0: 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53 6c  E);.#else.  osSl
acd0: 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  eep(milliseconds
ace0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66  );.#endif.}..#if
acf0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
ad00: 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26 20  ER_THREADS>0 && 
ad10: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
ad20: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
ad30: 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20 20  INRT && \.      
ad40: 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53    SQLITE_THREADS
ad50: 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c 69  AFE>0.DWORD sqli
ad60: 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41 4e  te3Win32Wait(HAN
ad70: 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20 20  DLE hObject){.  
ad80: 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69 6c  DWORD rc;.  whil
ad90: 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74 46  e( (rc = osWaitF
ada0: 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78  orSingleObjectEx
adb0: 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e 49  (hObject, INFINI
adc0: 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TE,.            
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 54 52 55 45 29             TRUE)
adf0: 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50 4c  )==WAIT_IO_COMPL
ae00: 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74 75  ETION ){}.  retu
ae10: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
ae20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
ae30: 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  ue (non-zero) if
ae40: 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20   we are running 
ae50: 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69 6e  under WinNT, Win
ae60: 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f 72  2K, WinXP,.** or
ae70: 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e 20   WinCE.  Return 
ae80: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72  false (zero) for
ae90: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f   Win95, Win98, o
aea0: 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48  r WinME..**.** H
aeb0: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65  ere is an intere
aec0: 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f  sting observatio
aed0: 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  n:  Win95, Win98
aee0: 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b  , and WinME lack
aef0: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
af00: 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77  Ex() API.  But w
af10: 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74  e can still stat
af20: 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69  ically link agai
af30: 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20  nst that.** API 
af40: 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f  as long as we do
af50: 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65 6e  n't call it when
af60: 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39   running Win95/9
af70: 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f  8/ME.  A call to
af80: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
af90: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
afa0: 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73  rmine if the hos
afb0: 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45  t is Win95/98/ME
afc0: 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f   or.** WinNT/2K/
afd0: 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69  XP so that we wi
afe0: 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20  ll know whether 
aff0: 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61  or not we can sa
b000: 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65  fely call.** the
b010: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50   LockFileEx() AP
b020: 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49  I..*/..#if !SQLI
b030: 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53  TE_WIN32_GETVERS
b040: 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20 6f  IONEX.# define o
b050: 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c  sIsNT()  (1).#el
b060: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
b070: 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53 5f  CE || SQLITE_OS_
b080: 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e 65  WINRT || !define
b090: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
b0a0: 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69 6e  AS_ANSI).# defin
b0b0: 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a  e osIsNT()  (1).
b0c0: 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28 53  #elif !defined(S
b0d0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b0e0: 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20 6f  WIDE).# define o
b0f0: 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65 6c  sIsNT()  (0).#el
b100: 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49 73  se.# define osIs
b110: 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65 33 5f  NT()  ((sqlite3_
b120: 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20 73  os_type==2) || s
b130: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f  qlite3_win32_is_
b140: 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt()).#endif../*
b150: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b160: 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20  n determines if 
b170: 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20 72  the machine is r
b180: 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f 6e  unning a version
b190: 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20 62   of Windows.** b
b1a0: 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20 6b  ased on the NT k
b1b0: 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ernel..*/.int sq
b1c0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f 6e  lite3_win32_is_n
b1d0: 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51 4c  t(void){.#if SQL
b1e0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 2f  ITE_OS_WINRT.  /
b1f0: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68 65  *.  ** NOTE: The
b200: 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74 66   WinRT sub-platf
b210: 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61 73  orm is always as
b220: 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73 65  sumed to be base
b230: 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a 2a  d on the NT.  **
b240: 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a 20         kernel.. 
b250: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
b260: 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49 4e  #elif SQLITE_WIN
b270: 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58 0a  32_GETVERSIONEX.
b280: 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f 63    if( osInterloc
b290: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
b2a0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
b2b0: 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b  ype, 0, 0)==0 ){
b2c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
b2d0: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
b2e0: 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49 4f  SI).    OSVERSIO
b2f0: 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20 20  NINFOA sInfo;.  
b300: 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73    sInfo.dwOSVers
b310: 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69  ionInfoSize = si
b320: 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20  zeof(sInfo);.   
b330: 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78 41   osGetVersionExA
b340: 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f 73  (&sInfo);.    os
b350: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
b360: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
b370: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20 20  te3_os_type,.   
b380: 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50 6c       (sInfo.dwPl
b390: 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52 5f  atformId == VER_
b3a0: 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f 4e  PLATFORM_WIN32_N
b3b0: 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b 0a  T) ? 2 : 1, 0);.
b3c0: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
b3d0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
b3e0: 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53 49  IDE).    OSVERSI
b3f0: 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a 20  ONINFOW sInfo;. 
b400: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
b410: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
b420: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
b430: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
b440: 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  W(&sInfo);.    o
b450: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b460: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b470: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
b480: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
b490: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
b4a0: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
b4b0: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
b4c0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
b4d0: 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63 6b  turn osInterlock
b4e0: 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67  edCompareExchang
b4f0: 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  e(&sqlite3_os_ty
b500: 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23 65  pe, 2, 2)==2;.#e
b510: 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  lif SQLITE_TEST.
b520: 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65 72    return osInter
b530: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
b540: 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f  hange(&sqlite3_o
b550: 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32  s_type, 2, 2)==2
b560: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20 2a  ;.#else.  /*.  *
b570: 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62 2d  * NOTE: All sub-
b580: 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65 20  platforms where 
b590: 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45 78  the GetVersionEx
b5a0: 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20 61  [AW] functions a
b5b0: 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64 65  re.  **       de
b5c0: 70 72 65 63 61 74 65 64 20 61 72 65 20 61 6c 77  precated are alw
b5d0: 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62  ays assumed to b
b5e0: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e  e based on the N
b5f0: 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a 20  T kernel..  */. 
b600: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
b610: 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f.}..#ifdef SQLI
b620: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 0a  TE_WIN32_MALLOC.
b630: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e  /*.** Allocate n
b640: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 2e  Bytes of memory.
b650: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b660: 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e  *winMemMalloc(in
b670: 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41 4e  t nBytes){.  HAN
b680: 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f 69  DLE hHeap;.  voi
b690: 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41  d *p;..  winMemA
b6a0: 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20  ssertMagic();.  
b6b0: 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65  hHeap = winMemGe
b6c0: 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72  tHeap();.  asser
b6d0: 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20  t( hHeap!=0 );. 
b6e0: 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d   assert( hHeap!=
b6f0: 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
b700: 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c  ALUE );.#if !SQL
b710: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
b720: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
b730: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49  IN32_MALLOC_VALI
b740: 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28 20  DATE).  assert( 
b750: 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28 68  osHeapValidate(h
b760: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
b770: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
b780: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
b790: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e   assert( nBytes>
b7a0: 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48 65  =0 );.  p = osHe
b7b0: 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53  apAlloc(hHeap, S
b7c0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
b7d0: 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29  _FLAGS, (SIZE_T)
b7e0: 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20 21  nBytes);.  if( !
b7f0: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  p ){.    sqlite3
b800: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
b810: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
b820: 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  apAlloc %u bytes
b830: 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22   (%lu), heap=%p"
b840: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b850: 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74 4c    nBytes, osGetL
b860: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
b870: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20  d*)hHeap);.  }. 
b880: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b890: 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79 2e  .** Free memory.
b8a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b8b0: 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64 20  winMemFree(void 
b8c0: 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e 44  *pPrior){.  HAND
b8d0: 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69 6e  LE hHeap;..  win
b8e0: 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29  MemAssertMagic()
b8f0: 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d  ;.  hHeap = winM
b900: 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61  emGetHeap();.  a
b910: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30 20  ssert( hHeap!=0 
b920: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65  );.  assert( hHe
b930: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
b940: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
b950: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
b960: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
b970: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
b980: 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65  VALIDATE).  asse
b990: 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61  rt( osHeapValida
b9a0: 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  te(hHeap, SQLITE
b9b0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
b9c0: 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23 65  S, pPrior) );.#e
b9d0: 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72 69  ndif.  if( !pPri
b9e0: 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a 20  or ) return; /* 
b9f0: 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f 20  Passing NULL to 
ba00: 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64 65  HeapFree is unde
ba10: 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  fined. */.  if( 
ba20: 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65 61  !osHeapFree(hHea
ba30: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
ba40: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
ba50: 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  or) ){.    sqlit
ba60: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
ba70: 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  MEM, "failed to 
ba80: 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20 25  HeapFree block %
ba90: 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  p (%lu), heap=%p
baa0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
bab0: 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65 74     pPrior, osGet
bac0: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
bad0: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
bae0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
baf0: 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20 65  the size of an e
bb00: 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20 61  xisting memory a
bb10: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
bb20: 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65 6d  tic void *winMem
bb30: 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70 50  Realloc(void *pP
bb40: 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65 73  rior, int nBytes
bb50: 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  ){.  HANDLE hHea
bb60: 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20  p;.  void *p;.. 
bb70: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
bb80: 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d 20  ic();.  hHeap = 
bb90: 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 3b  winMemGetHeap();
bba0: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
bbb0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
bbc0: 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f   hHeap!=INVALID_
bbd0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
bbe0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
bbf0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
bc00: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
bc10: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
bc20: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
bc30: 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53 51  lidate(hHeap, SQ
bc40: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
bc50: 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20 29  FLAGS, pPrior) )
bc60: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
bc70: 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b 0a  t( nBytes>=0 );.
bc80: 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29 7b    if( !pPrior ){
bc90: 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 41  .    p = osHeapA
bca0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
bcb0: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
bcc0: 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79  AGS, (SIZE_T)nBy
bcd0: 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  tes);.  }else{. 
bce0: 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65 41     p = osHeapReA
bcf0: 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c 49  lloc(hHeap, SQLI
bd00: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
bd10: 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53 49  AGS, pPrior, (SI
bd20: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
bd30: 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20  }.  if( !p ){.  
bd40: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
bd50: 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69  LITE_NOMEM, "fai
bd60: 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79 74  led to %s %u byt
bd70: 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  es (%lu), heap=%
bd80: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
bd90: 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48 65      pPrior ? "He
bda0: 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48 65  apReAlloc" : "He
bdb0: 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65 73  apAlloc", nBytes
bdc0: 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
bdd0: 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
bde0: 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61 70      (void*)hHeap
bdf0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
be00: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
be10: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
be20: 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61 6c  n outstanding al
be30: 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79 74  location, in byt
be40: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
be50: 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69  t winMemSize(voi
be60: 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45 20  d *p){.  HANDLE 
be70: 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54 20  hHeap;.  SIZE_T 
be80: 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  n;..  winMemAsse
be90: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bea0: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
beb0: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bec0: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bed0: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bee0: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bef0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bf00: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bf10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bf20: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bf30: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
bf40: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
bf50: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
bf60: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20 29  HEAP_FLAGS, p) )
bf70: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 21  ;.#endif.  if( !
bf80: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
bf90: 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28 68  n = osHeapSize(h
bfa0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
bfb0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70  32_HEAP_FLAGS, p
bfc0: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49 5a  );.  if( n==(SIZ
bfd0: 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73 71  E_T)-1 ){.    sq
bfe0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
bff0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
c000: 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f 63  to HeapSize bloc
c010: 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70  k %p (%lu), heap
c020: 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =%p",.          
c030: 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c 61        p, osGetLa
c040: 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69 64  stError(), (void
c050: 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72 65  *)hHeap);.    re
c060: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
c070: 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a 0a  turn (int)n;.}..
c080: 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20 61  /*.** Round up a
c090: 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74 6f   request size to
c0a0: 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64 20   the next valid 
c0b0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65 2e  allocation size.
c0c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
c0d0: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
c0e0: 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e 3b   n){.  return n;
c0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c100: 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65  lize this module
c110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c120: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
c130: 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69  *pAppData){.  wi
c140: 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65  nMemData *pWinMe
c150: 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44  mData = (winMemD
c160: 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a  ata *)pAppData;.
c170: 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44  .  if( !pWinMemD
c180: 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ata ) return SQL
c190: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73 73  ITE_ERROR;.  ass
c1a0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c1b0: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
c1c0: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
c1d0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c1e0: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
c1f0: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66 20  _MAGIC2 );..#if 
c200: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
c210: 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
c220: 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20 69  _HEAP_CREATE.  i
c230: 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  f( !pWinMemData-
c240: 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44 57  >hHeap ){.    DW
c250: 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69 7a  ORD dwInitialSiz
c260: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
c270: 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45 3b  _HEAP_INIT_SIZE;
c280: 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61 78  .    DWORD dwMax
c290: 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f 52  imumSize = (DWOR
c2a0: 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  D)sqlite3GlobalC
c2b0: 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20 20  onfig.nHeap;.   
c2c0: 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53 69   if( dwMaximumSi
c2d0: 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  ze==0 ){.      d
c2e0: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20 53  wMaximumSize = S
c2f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c300: 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  _MAX_SIZE;.    }
c310: 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74 69  else if( dwIniti
c320: 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75 6d  alSize>dwMaximum
c330: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64 77  Size ){.      dw
c340: 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64 77  InitialSize = dw
c350: 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20 20  MaximumSize;.   
c360: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
c370: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48 65  ta->hHeap = osHe
c380: 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45 5f  apCreate(SQLITE_
c390: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
c3a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 64 77 49 6e 69 74 69 61          dwInitia
c3d0: 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75 6d  lSize, dwMaximum
c3e0: 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Size);.    if( !
c3f0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c400: 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ap ){.      sqli
c410: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
c420: 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20 20  OMEM,.          
c430: 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70 43  "failed to HeapC
c440: 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c 61  reate (%lu), fla
c450: 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65 3d  gs=%u, initSize=
c460: 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c 75  %lu, maxSize=%lu
c470: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73 47  ",.          osG
c480: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 53  etLastError(), S
c490: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
c4a0: 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69 61  _FLAGS, dwInitia
c4b0: 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  lSize,.         
c4c0: 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29 3b   dwMaximumSize);
c4d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
c4e0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
c4f0: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
c500: 61 2d 3e 62 4f 77 6e 65 64 20 3d 20 54 52 55 45  a->bOwned = TRUE
c510: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  ;.    assert( pW
c520: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
c530: 64 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20  d );.  }.#else. 
c540: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
c550: 65 61 70 20 3d 20 6f 73 47 65 74 50 72 6f 63 65  eap = osGetProce
c560: 73 73 48 65 61 70 28 29 3b 0a 20 20 69 66 28 20  ssHeap();.  if( 
c570: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
c580: 65 61 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  eap ){.    sqlit
c590: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
c5a0: 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 22 66 61  MEM,.        "fa
c5b0: 69 6c 65 64 20 74 6f 20 47 65 74 50 72 6f 63 65  iled to GetProce
c5c0: 73 73 48 65 61 70 20 28 25 6c 75 29 22 2c 20 6f  ssHeap (%lu)", o
c5d0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  sGetLastError())
c5e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
c5f0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
c600: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f   pWinMemData->bO
c610: 77 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20  wned = FALSE;.  
c620: 61 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d  assert( !pWinMem
c630: 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a  Data->bOwned );.
c640: 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
c650: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48   pWinMemData->hH
c660: 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  eap!=0 );.  asse
c670: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c680: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
c690: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
c6a0: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
c6b0: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
c6c0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
c6d0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
c6e0: 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61  assert( osHeapVa
c6f0: 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61  lidate(pWinMemDa
c700: 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54  ta->hHeap, SQLIT
c710: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c720: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
c730: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
c740: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c750: 20 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68   Deinitialize th
c760: 69 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74  is module..*/.st
c770: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d  atic void winMem
c780: 53 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70  Shutdown(void *p
c790: 41 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d  AppData){.  winM
c7a0: 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44  emData *pWinMemD
c7b0: 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74  ata = (winMemDat
c7c0: 61 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20  a *)pAppData;.. 
c7d0: 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74   if( !pWinMemDat
c7e0: 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  a ) return;.  as
c7f0: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c800: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
c810: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
c820: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c830: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
c840: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69  M_MAGIC2 );..  i
c850: 66 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  f( pWinMemData->
c860: 68 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73  hHeap ){.    ass
c870: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c880: 2d 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ->hHeap!=INVALID
c890: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
c8a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c8b0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
c8c0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
c8d0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
c8e0: 20 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61     assert( osHea
c8f0: 70 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65  pValidate(pWinMe
c900: 6d 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51  mData->hHeap, SQ
c910: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c920: 46 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a  FLAGS, NULL) );.
c930: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70  #endif.    if( p
c940: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
c950: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ed ){.      if( 
c960: 21 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70  !osHeapDestroy(p
c970: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c980: 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  p) ){.        sq
c990: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
c9a0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
c9b0: 74 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28  to HeapDestroy (
c9c0: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
c9f0: 6f 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69  or(), (void*)pWi
ca00: 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29  nMemData->hHeap)
ca10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ca20: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
ca30: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ned = FALSE;.   
ca40: 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61   }.    pWinMemDa
ca50: 74 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c  ta->hHeap = NULL
ca60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
ca70: 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d  opulate the low-
ca80: 6c 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c  level memory all
ca90: 6f 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ocation function
caa0: 20 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20   pointers in.** 
cab0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
cac0: 66 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74  fig.m with point
cad0: 65 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69  ers to the routi
cae0: 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
caf0: 2e 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  . The.** argumen
cb00: 74 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62  ts specify the b
cb10: 6c 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74  lock of memory t
cb20: 6f 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o manage..**.** 
cb30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
cb40: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
cb50: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c  qlite3_config(),
cb60: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a   and therefore.*
cb70: 2a 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  * is not require
cb80: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
cb90: 66 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a  fe (it is not)..
cba0: 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  */.const sqlite3
cbb0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71  _mem_methods *sq
cbc0: 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32  lite3MemGetWin32
cbd0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
cbe0: 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d   const sqlite3_m
cbf0: 65 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65  em_methods winMe
cc00: 6d 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20  mMethods = {.   
cc10: 20 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20   winMemMalloc,. 
cc20: 20 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20     winMemFree,. 
cc30: 20 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63     winMemRealloc
cc40: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65  ,.    winMemSize
cc50: 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e  ,.    winMemRoun
cc60: 64 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49  dup,.    winMemI
cc70: 6e 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53  nit,.    winMemS
cc80: 68 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69  hutdown,.    &wi
cc90: 6e 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a  n_mem_data.  };.
cca0: 20 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d    return &winMem
ccb0: 4d 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64  Methods;.}..void
ccc0: 20 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65   sqlite3MemSetDe
ccd0: 66 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73  fault(void){.  s
cce0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
ccf0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
cd00: 4f 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65  OC, sqlite3MemGe
cd10: 74 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e  tWin32());.}.#en
cd20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49  dif /* SQLITE_WI
cd30: 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f  N32_MALLOC */../
cd40: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55  *.** Convert a U
cd50: 54 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d  TF-8 string to M
cd60: 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65  icrosoft Unicode
cd70: 20 28 55 54 46 2d 31 36 3f 29 2e 0a 2a 2a 0a 2a   (UTF-16?)..**.*
cd80: 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
cd90: 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72  the returned str
cda0: 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ing is obtained 
cdb0: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 0a 2a 2f 0a  from malloc..*/.
cdc0: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
cdd0: 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63  nUtf8ToUnicode(c
cde0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
cdf0: 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 43 68  name){.  int nCh
ce00: 61 72 3b 0a 20 20 4c 50 57 53 54 52 20 7a 57 69  ar;.  LPWSTR zWi
ce10: 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e  deFilename;..  n
ce20: 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74 69 42 79  Char = osMultiBy
ce30: 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50 5f  teToWideChar(CP_
ce40: 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e 61  UTF8, 0, zFilena
ce50: 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29  me, -1, NULL, 0)
ce60: 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30  ;.  if( nChar==0
ce70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ce80: 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65 46 69 6c  ;.  }.  zWideFil
ce90: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
cea0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72  allocZero( nChar
ceb0: 2a 73 69 7a 65 6f 66 28 7a 57 69 64 65 46 69 6c  *sizeof(zWideFil
cec0: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
ced0: 66 28 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  f( zWideFilename
cee0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
cef0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
cf00: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
cf10: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
cf20: 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  , 0, zFilename, 
cf30: 2d 31 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  -1, zWideFilenam
cf40: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 6e 43 68 61 72 29 3b 0a 20 20 69 66 28     nChar);.  if(
cf70: 20 6e 43 68 61 72 3d 3d 30 20 29 7b 0a 20 20 20   nChar==0 ){.   
cf80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57   sqlite3_free(zW
cf90: 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ideFilename);.  
cfa0: 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 20    zWideFilename 
cfb0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
cfc0: 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 3b  n zWideFilename;
cfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
cfe0: 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63  t Microsoft Unic
cff0: 6f 64 65 20 74 6f 20 55 54 46 2d 38 2e 20 20 53  ode to UTF-8.  S
d000: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
d010: 20 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67   returned string
d020: 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20   is.** obtained 
d030: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
d040: 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  loc()..*/.static
d050: 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64   char *winUnicod
d060: 65 54 6f 55 74 66 38 28 4c 50 43 57 53 54 52 20  eToUtf8(LPCWSTR 
d070: 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 7b 0a  zWideFilename){.
d080: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63    int nByte;.  c
d090: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
d0a0: 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64  .  nByte = osWid
d0b0: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
d0c0: 28 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69  (CP_UTF8, 0, zWi
d0d0: 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20  deFilename, -1, 
d0e0: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69  0, 0, 0, 0);.  i
d0f0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
d100: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d110: 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d   }.  zFilename =
d120: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
d130: 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  ro( nByte );.  i
d140: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
d150: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d160: 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f  .  }.  nByte = o
d170: 73 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69  sWideCharToMulti
d180: 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c  Byte(CP_UTF8, 0,
d190: 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20   zWideFilename, 
d1a0: 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  -1, zFilename, n
d1b0: 42 79 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Byte,.          
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 20 20 20 20 20 20 30 2c 20 30 29 3b 0a 20 20 69        0, 0);.  i
d1e0: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
d1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d200: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
d210: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b    zFilename = 0;
d220: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46  .  }.  return zF
d230: 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ilename;.}../*.*
d240: 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53  * Convert an ANS
d250: 49 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72  I string to Micr
d260: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 62  osoft Unicode, b
d270: 61 73 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ased on the.** c
d280: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 20  urrent codepage 
d290: 73 65 74 74 69 6e 67 73 20 66 6f 72 20 66 69 6c  settings for fil
d2a0: 65 20 61 70 69 73 2e 0a 2a 2a 0a 2a 2a 20 53 70  e apis..**.** Sp
d2b0: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
d2c0: 72 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20  returned string 
d2d0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 66  is obtained.** f
d2e0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d2f0: 6f 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4c 50  oc..*/.static LP
d300: 57 53 54 52 20 77 69 6e 4d 62 63 73 54 6f 55 6e  WSTR winMbcsToUn
d310: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
d320: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
d330: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57  int nByte;.  LPW
d340: 53 54 52 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d  STR zMbcsFilenam
d350: 65 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67  e;.  int codepag
d360: 65 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69  e = osAreFileApi
d370: 73 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50  sANSI() ? CP_ACP
d380: 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20   : CP_OEMCP;..  
d390: 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42  nByte = osMultiB
d3a0: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f  yteToWideChar(co
d3b0: 64 65 70 61 67 65 2c 20 30 2c 20 7a 46 69 6c 65  depage, 0, zFile
d3c0: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a  name, -1, NULL,.
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
d400: 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30  ;.  if( nByte==0
d410: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
d420: 3b 0a 20 20 7d 0a 20 20 7a 4d 62 63 73 46 69 6c  ;.  }.  zMbcsFil
d430: 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  ename = sqlite3M
d440: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
d450: 2a 73 69 7a 65 6f 66 28 7a 4d 62 63 73 46 69 6c  *sizeof(zMbcsFil
d460: 65 6e 61 6d 65 5b 30 5d 29 20 29 3b 0a 20 20 69  ename[0]) );.  i
d470: 66 28 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  f( zMbcsFilename
d480: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d490: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65  n 0;.  }.  nByte
d4a0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d4b0: 57 69 64 65 43 68 61 72 28 63 6f 64 65 70 61 67  WideChar(codepag
d4c0: 65 2c 20 30 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e, 0, zFilename,
d4d0: 20 2d 31 2c 20 7a 4d 62 63 73 46 69 6c 65 6e 61   -1, zMbcsFilena
d4e0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
d4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d500: 20 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66      nByte);.  if
d510: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
d520: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
d530: 4d 62 63 73 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  MbcsFilename);. 
d540: 20 20 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65     zMbcsFilename
d550: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
d560: 72 6e 20 7a 4d 62 63 73 46 69 6c 65 6e 61 6d 65  rn zMbcsFilename
d570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  ;.}../*.** Conve
d580: 72 74 20 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69  rt Microsoft Uni
d590: 63 6f 64 65 20 74 6f 20 6d 75 6c 74 69 2d 62 79  code to multi-by
d5a0: 74 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72  te character str
d5b0: 69 6e 67 2c 20 62 61 73 65 64 20 6f 6e 20 74 68  ing, based on th
d5c0: 65 0a 2a 2a 20 75 73 65 72 27 73 20 41 4e 53 49  e.** user's ANSI
d5d0: 20 63 6f 64 65 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   codepage..**.**
d5e0: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d5f0: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d600: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d610: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6d  rom.** sqlite3_m
d620: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
d630: 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69 63  ic char *winUnic
d640: 6f 64 65 54 6f 4d 62 63 73 28 4c 50 43 57 53 54  odeToMbcs(LPCWST
d650: 52 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29  R zWideFilename)
d660: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  {.  int nByte;. 
d670: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
d680: 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65  ;.  int codepage
d690: 20 3d 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73   = osAreFileApis
d6a0: 41 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20  ANSI() ? CP_ACP 
d6b0: 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e  : CP_OEMCP;..  n
d6c0: 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61  Byte = osWideCha
d6d0: 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64  rToMultiByte(cod
d6e0: 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 46  epage, 0, zWideF
d6f0: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 30 2c 20  ilename, -1, 0, 
d700: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  0, 0, 0);.  if( 
d710: 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20  nByte == 0 ){.  
d720: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d730: 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71    zFilename = sq
d740: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
d750: 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20   nByte );.  if( 
d760: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zFilename==0 ){.
d770: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d780: 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69  }.  nByte = osWi
d790: 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74  deCharToMultiByt
d7a0: 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a  e(codepage, 0, z
d7b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 2c 20 2d 31  WideFilename, -1
d7c0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 42 79               nBy
d7f0: 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  te, 0, 0);.  if(
d800: 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20   nByte == 0 ){. 
d810: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
d820: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
d830: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  zFilename = 0;. 
d840: 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 69 6c   }.  return zFil
d850: 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
d860: 43 6f 6e 76 65 72 74 20 6d 75 6c 74 69 62 79 74  Convert multibyt
d870: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
d880: 6e 67 20 74 6f 20 55 54 46 2d 38 2e 20 20 53 70  ng to UTF-8.  Sp
d890: 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a  ace to hold the.
d8a0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  ** returned stri
d8b0: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d8c0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d8d0: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  oc()..*/.char *s
d8e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
d8f0: 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e 73 74 20  s_to_utf8(const 
d900: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
d910: 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
d920: 61 6d 65 55 74 66 38 3b 0a 20 20 4c 50 57 53 54  ameUtf8;.  LPWST
d930: 52 20 7a 54 6d 70 57 69 64 65 3b 0a 0a 20 20 7a  R zTmpWide;..  z
d940: 54 6d 70 57 69 64 65 20 3d 20 77 69 6e 4d 62 63  TmpWide = winMbc
d950: 73 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65  sToUnicode(zFile
d960: 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 54 6d  name);.  if( zTm
d970: 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pWide==0 ){.    
d980: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d990: 7a 46 69 6c 65 6e 61 6d 65 55 74 66 38 20 3d 20  zFilenameUtf8 = 
d9a0: 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
d9b0: 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 73 71  (zTmpWide);.  sq
d9c0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 57  lite3_free(zTmpW
d9d0: 69 64 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  ide);.  return z
d9e0: 46 69 6c 65 6e 61 6d 65 55 74 66 38 3b 0a 7d 0a  FilenameUtf8;.}.
d9f0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 55  ./*.** Convert U
da00: 54 46 2d 38 20 74 6f 20 6d 75 6c 74 69 62 79 74  TF-8 to multibyt
da10: 65 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69  e character stri
da20: 6e 67 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  ng.  Space to ho
da30: 6c 64 20 74 68 65 0a 2a 2a 20 72 65 74 75 72 6e  ld the.** return
da40: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
da50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
da60: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
da70: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
da80: 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73  n32_utf8_to_mbcs
da90: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
daa0: 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20  lename){.  char 
dab0: 2a 7a 46 69 6c 65 6e 61 6d 65 4d 62 63 73 3b 0a  *zFilenameMbcs;.
dac0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
dad0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
dae0: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
daf0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
db00: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
db10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
db20: 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  .  }.  zFilename
db30: 4d 62 63 73 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Mbcs = winUnicod
db40: 65 54 6f 4d 62 63 73 28 7a 54 6d 70 57 69 64 65  eToMbcs(zTmpWide
db50: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
db60: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
db70: 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 4d  eturn zFilenameM
db80: 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  bcs;.}../*.** Th
db90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
dba0: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
dbb0: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
dbc0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
dbd0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
dbe0: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
dbf0: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
dc00: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
dc10: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
dc20: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
dc30: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
dc40: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
dc50: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
dc60: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
dc70: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
dc80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
dc90: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
dca0: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
dcb0: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
dcc0: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
dcd0: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
dce0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
dcf0: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
dd00: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
dd10: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
dd20: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
dd30: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
dd40: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
dd50: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
dd60: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
dd70: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
dd80: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
dd90: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
dda0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
ddb0: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
ddc0: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
ddd0: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
dde0: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
ddf0: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
de00: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
de10: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
de20: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
de30: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
de40: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
de50: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
de60: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
de70: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
de80: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
de90: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
dea0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
deb0: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
dec0: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
ded0: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
dee0: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
def0: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
df00: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
df10: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
df20: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
df30: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
df40: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
df50: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
df60: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
df70: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
df80: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
df90: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
dfa0: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
dfb0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
dfc0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
dfd0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
dfe0: 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72 65  te3_free(*ppDire
dff0: 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70 44  ctory);.    *ppD
e000: 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c 75  irectory = zValu
e010: 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75 72  eUtf8;.    retur
e020: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
e030: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e040: 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
e050: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
e060: 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74 45  e of winGetLastE
e070: 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a 65  rrorMsg.** is ze
e080: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
e090: 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e 20  message fits in 
e0a0: 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20 6e  the buffer, or n
e0b0: 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  on-zero.** other
e0c0: 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65 73  wise (if the mes
e0d0: 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61 74  sage was truncat
e0e0: 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ed)..*/.static i
e0f0: 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  nt winGetLastErr
e100: 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73 74  orMsg(DWORD last
e110: 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66 2c  Errno, int nBuf,
e120: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
e130: 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  /* FormatMessage
e140: 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66 61   returns 0 on fa
e150: 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69 73  ilure.  Otherwis
e160: 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e  e it.  ** return
e170: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
e180: 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20 74  TCHARs written t
e190: 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 2a  o the output.  *
e1a0: 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75 64  * buffer, exclud
e1b0: 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ing the terminat
e1c0: 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a 20  ing null char.. 
e1d0: 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c 65   */.  DWORD dwLe
e1e0: 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  n = 0;.  char *z
e1f0: 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Out = 0;..  if( 
e200: 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
e210: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
e220: 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70 57      WCHAR zTempW
e230: 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33 32  ide[SQLITE_WIN32
e240: 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41 52  _MAX_ERRMSG_CHAR
e250: 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e 20  S+1];.    dwLen 
e260: 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67  = osFormatMessag
e270: 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47  eW(FORMAT_MESSAG
e280: 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a  E_FROM_SYSTEM |.
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f 52               FOR
e2b0: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e 4f  MAT_MESSAGE_IGNO
e2c0: 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20 20  RE_INSERTS,.    
e2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e2e0: 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20           NULL,. 
e2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e300: 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73 74              last
e310: 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
e320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e330: 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20      0,.         
e340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e350: 20 20 20 20 7a 54 65 6d 70 57 69 64 65 2c 0a 20      zTempWide,. 
e360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e370: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
e380: 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52  TE_WIN32_MAX_ERR
e390: 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20 20  MSG_CHARS,.     
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e3b0: 20 20 20 20 20 20 20 20 30 29 3b 0a 23 65 6c 73          0);.#els
e3c0: 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  e.    LPWSTR zTe
e3d0: 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a 20  mpWide = NULL;. 
e3e0: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
e3f0: 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52 4d  matMessageW(FORM
e400: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
e410: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
e420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e430: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
e440: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
e450: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
e460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e470: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
e480: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
e490: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
e4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4b0: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
e4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4f0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
e500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e510: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57 53             (LPWS
e520: 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c 0a  TR) &zTempWide,.
e530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e540: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a               0,.
e550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e560: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
e570: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
e580: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
e590: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
e5a0: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
e5b0: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
e5c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
e5d0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
e5e0: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
e5f0: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a  nUnicodeToUtf8(z
e600: 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20 20  TempWide);.     
e610: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
e620: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20 21  nMalloc();.#if !
e630: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
e640: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
e650: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
e660: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
e670: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
e680: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
e690: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e 64  zTempWide);.#end
e6a0: 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  if.    }.  }.#if
e6b0: 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  def SQLITE_WIN32
e6c0: 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65  _HAS_ANSI.  else
e6d0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65 6d  {.    char *zTem
e6e0: 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64 77  p = NULL;.    dw
e6f0: 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65  Len = osFormatMe
e700: 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d 45  ssageA(FORMAT_ME
e710: 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f 42  SSAGE_ALLOCATE_B
e720: 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20 20  UFFER |.        
e730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e740: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
e750: 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20  AGE_FROM_SYSTEM 
e760: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
e780: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47  ORMAT_MESSAGE_IG
e790: 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20  NORE_INSERTS,.  
e7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7b0: 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c             NULL,
e7c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61                la
e7e0: 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e800: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 28 4c 50 53 54 52 29 20 26 7a        (LPSTR) &z
e830: 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Temp,.          
e840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e850: 20 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20     0,.          
e860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e870: 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 64     0);.    if( d
e880: 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20 20  wLen > 0 ){.    
e890: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61 20    /* allocate a 
e8a0: 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76 65  buffer and conve
e8b0: 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20 20  rt to UTF8 */.  
e8c0: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
e8d0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
e8e0: 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 73 71 6c        zOut = sql
e8f0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
e900: 74 6f 5f 75 74 66 38 28 7a 54 65 6d 70 29 3b 0a  to_utf8(zTemp);.
e910: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
e920: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
e930: 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74 68        /* free th
e940: 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72 20  e system buffer 
e950: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f 72  allocated by For
e960: 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20  matMessage */.  
e970: 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28      osLocalFree(
e980: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20  zTemp);.    }.  
e990: 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 30  }.#endif.  if( 0
e9a0: 20 3d 3d 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20   == dwLen ){.   
e9b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
e9c0: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f  f(nBuf, zBuf, "O
e9d0: 73 45 72 72 6f 72 20 30 78 25 6c 78 20 28 25 6c  sError 0x%lx (%l
e9e0: 75 29 22 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  u)", lastErrno, 
e9f0: 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65  lastErrno);.  }e
ea00: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79  lse{.    /* copy
ea10: 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42   a maximum of nB
ea20: 75 66 20 63 68 61 72 73 20 74 6f 20 6f 75 74 70  uf chars to outp
ea30: 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  ut buffer */.   
ea40: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ea50: 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25  f(nBuf, zBuf, "%
ea60: 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f  s", zOut);.    /
ea70: 2a 20 66 72 65 65 20 74 68 65 20 55 54 46 38 20  * free the UTF8 
ea80: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
ea90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
eaa0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
eab0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68  ;.}../*.**.** Th
eac0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69  is function - wi
ead0: 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  nLogErrorAtLine(
eae0: 29 20 2d 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ) - is only ever
eaf0: 20 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20   called via the 
eb00: 6d 61 63 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45  macro.** winLogE
eb10: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  rror()..**.** Th
eb20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e  is routine is in
eb30: 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20 65  voked after an e
eb40: 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 61  rror occurs in a
eb50: 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  n OS function..*
eb60: 2a 20 49 74 20 6c 6f 67 73 20 61 20 6d 65 73 73  * It logs a mess
eb70: 61 67 65 20 75 73 69 6e 67 20 73 71 6c 69 74 65  age using sqlite
eb80: 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69  3_log() containi
eb90: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ng the current v
eba0: 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  alue of.** error
ebb0: 20 63 6f 64 65 20 61 6e 64 2c 20 69 66 20 70 6f   code and, if po
ebc0: 73 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61  ssible, the huma
ebd0: 6e 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76  n-readable equiv
ebe0: 61 6c 65 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f  alent from.** Fo
ebf0: 72 6d 61 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a  rmatMessage..**.
ec00: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
ec10: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
ec20: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
ec30: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
ec40: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
ec50: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
ec60: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
ec70: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
ec80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
ec90: 29 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73 75  )..** The two su
eca0: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
ecb0: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ts should be the
ecc0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53 20   name of the OS 
ecd0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a  function that.**
ece0: 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68 65 20   failed and the 
ecf0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
ed00: 73 79 73 74 65 6d 20 70 61 74 68 2c 20 69 66 20  system path, if 
ed10: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
ed20: 77 69 6e 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c  winLogError(a,b,
ed30: 63 2c 64 29 20 20 20 77 69 6e 4c 6f 67 45 72 72  c,d)   winLogErr
ed40: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64  orAtLine(a,b,c,d
ed50: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
ed60: 63 20 69 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f  c int winLogErro
ed70: 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65  rAtLine(.  int e
ed80: 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20  rrcode,         
ed90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
eda0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
edb0: 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
edc0: 72 72 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  rrno,           
edd0: 20 20 20 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61       /* Win32 la
ede0: 73 74 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  st error */.  co
edf0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ee10: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
ee20: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
ee30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ee40: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
ee50: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
ee60: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
ee70: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
ee80: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
ee90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eea0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
eeb0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
eec0: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
eed0: 20 63 68 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b   char zMsg[500];
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 2f 2a 20 48 75 6d 61 6e 20 72 65 61 64 61 62   /* Human readab
ef00: 6c 65 20 65 72 72 6f 72 20 74 65 78 74 20 2a 2f  le error text */
ef10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
ef40: 65 72 20 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d  er */..  zMsg[0]
ef50: 20 3d 20 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61   = 0;.  winGetLa
ef60: 73 74 45 72 72 6f 72 4d 73 67 28 6c 61 73 74 45  stErrorMsg(lastE
ef70: 72 72 6e 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73  rrno, sizeof(zMs
ef80: 67 29 2c 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73  g), zMsg);.  ass
ef90: 65 72 74 28 20 65 72 72 63 6f 64 65 21 3d 53 51  ert( errcode!=SQ
efa0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
efb0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
efc0: 68 20 3d 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d  h = "";.  for(i=
efd0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
efe0: 73 67 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a  sg[i]!='\r' && z
eff0: 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  Msg[i]!='\n'; i+
f000: 2b 29 7b 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d  +){}.  zMsg[i] =
f010: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   0;.  sqlite3_lo
f020: 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20  g(errcode,.     
f030: 20 22 6f 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28   "os_win.c:%d: (
f040: 25 6c 75 29 20 25 73 28 25 73 29 20 2d 20 25 73  %lu) %s(%s) - %s
f050: 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20  ",.      iLine, 
f060: 6c 61 73 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  lastErrno, zFunc
f070: 2c 20 7a 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20  , zPath, zMsg.  
f080: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
f090: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  code;.}../*.** T
f0a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
f0b0: 65 73 20 74 68 61 74 20 61 20 52 65 61 64 46 69  es that a ReadFi
f0c0: 6c 65 28 29 2c 20 57 72 69 74 65 46 69 6c 65 28  le(), WriteFile(
f0d0: 29 2c 20 61 6e 64 20 44 65 6c 65 74 65 46 69 6c  ), and DeleteFil
f0e0: 65 28 29 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  e().** will be r
f0f0: 65 74 72 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67  etried following
f100: 20 61 20 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72   a locking error
f110: 20 2d 20 70 72 6f 62 61 62 6c 79 20 63 61 75 73   - probably caus
f120: 65 64 20 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72  ed by.** antivir
f130: 75 73 20 73 6f 66 74 77 61 72 65 2e 20 20 41 6c  us software.  Al
f140: 73 6f 20 74 68 65 20 69 6e 69 74 69 61 6c 20 64  so the initial d
f150: 65 6c 61 79 20 62 65 66 6f 72 65 20 74 68 65 20  elay before the 
f160: 66 69 72 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20  first retry..** 
f170: 54 68 65 20 64 65 6c 61 79 20 69 6e 63 72 65 61  The delay increa
f180: 73 65 73 20 6c 69 6e 65 61 72 6c 79 20 77 69 74  ses linearly wit
f190: 68 20 65 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f  h each retry..*/
f1a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f1b0: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
f1c0: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
f1d0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
f1e0: 54 52 59 20 31 30 0a 23 65 6e 64 69 66 0a 23 69  TRY 10.#endif.#i
f1f0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
f200: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44  32_IOERR_RETRY_D
f210: 45 4c 41 59 0a 23 20 64 65 66 69 6e 65 20 53 51  ELAY.# define SQ
f220: 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52  LITE_WIN32_IOERR
f230: 5f 52 45 54 52 59 5f 44 45 4c 41 59 20 32 35 0a  _RETRY_DELAY 25.
f240: 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 69 6e  #endif.static in
f250: 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20  t winIoerrRetry 
f260: 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  = SQLITE_WIN32_I
f270: 4f 45 52 52 5f 52 45 54 52 59 3b 0a 73 74 61 74  OERR_RETRY;.stat
f280: 69 63 20 69 6e 74 20 77 69 6e 49 6f 65 72 72 52  ic int winIoerrR
f290: 65 74 72 79 44 65 6c 61 79 20 3d 20 53 51 4c 49  etryDelay = SQLI
f2a0: 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52  TE_WIN32_IOERR_R
f2b0: 45 54 52 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a  ETRY_DELAY;../*.
f2c0: 2a 2a 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72  ** The "winIoerr
f2d0: 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f  CanRetry1" macro
f2e0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65   is used to dete
f2f0: 72 6d 69 6e 65 20 69 66 20 61 20 70 61 72 74 69  rmine if a parti
f300: 63 75 6c 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72  cular I/O.** err
f310: 6f 72 20 63 6f 64 65 20 6f 62 74 61 69 6e 65 64  or code obtained
f320: 20 76 69 61 20 47 65 74 4c 61 73 74 45 72 72 6f   via GetLastErro
f330: 72 28 29 20 69 73 20 65 6c 69 67 69 62 6c 65 20  r() is eligible 
f340: 74 6f 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  to be retried.  
f350: 49 74 0a 2a 2a 20 6d 75 73 74 20 61 63 63 65 70  It.** must accep
f360: 74 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  t the error code
f370: 20 44 57 4f 52 44 20 61 73 20 69 74 73 20 6f 6e   DWORD as its on
f380: 6c 79 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20  ly argument and 
f390: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a  should return.**
f3a0: 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65   non-zero if the
f3b0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 74   error code is t
f3c0: 72 61 6e 73 69 65 6e 74 20 69 6e 20 6e 61 74 75  ransient in natu
f3d0: 72 65 20 61 6e 64 20 74 68 65 20 6f 70 65 72 61  re and the opera
f3e0: 74 69 6f 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69  tion.** responsi
f3f0: 62 6c 65 20 66 6f 72 20 67 65 6e 65 72 61 74 69  ble for generati
f400: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ng the original 
f410: 65 72 72 6f 72 20 6d 69 67 68 74 20 73 75 63 63  error might succ
f420: 65 65 64 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a  eed upon being.*
f430: 2a 20 72 65 74 72 69 65 64 2e 20 20 54 68 65 20  * retried.  The 
f440: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
f450: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
f460: 20 61 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a   a variable..**.
f470: 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  ** Additionally,
f480: 20 61 20 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22   a macro named "
f490: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
f4a0: 32 22 20 6d 61 79 20 62 65 20 64 65 66 69 6e 65  2" may be define
f4b0: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 69 73 20  d.  If it.** is 
f4c0: 64 65 66 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c  defined, it will
f4d0: 20 62 65 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e   be consulted on
f4e0: 6c 79 20 77 68 65 6e 20 74 68 65 20 6d 61 63 72  ly when the macr
f4f0: 6f 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  o "winIoerrCanRe
f500: 74 72 79 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73  try1".** returns
f510: 20 7a 65 72 6f 2e 20 20 54 68 65 20 22 77 69 6e   zero.  The "win
f520: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
f530: 6d 61 63 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74  macro is complet
f540: 65 6c 79 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64  ely optional and
f550: 0a 2a 2a 20 6d 61 79 20 62 65 20 75 73 65 64 20  .** may be used 
f560: 74 6f 20 69 6e 63 6c 75 64 65 20 61 64 64 69 74  to include addit
f570: 69 6f 6e 61 6c 20 65 72 72 6f 72 20 63 6f 64 65  ional error code
f580: 73 20 69 6e 20 74 68 65 20 73 65 74 20 74 68 61  s in the set tha
f590: 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75  t should.** resu
f5a0: 6c 74 20 69 6e 20 74 68 65 20 66 61 69 6c 69 6e  lt in the failin
f5b0: 67 20 49 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20  g I/O operation 
f5c0: 62 65 69 6e 67 20 72 65 74 72 69 65 64 20 62 79  being retried by
f5d0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 20 49 66   the caller.  If
f5e0: 0a 2a 2a 20 64 65 66 69 6e 65 64 2c 20 74 68 65  .** defined, the
f5f0: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
f600: 72 79 32 22 20 6d 61 63 72 6f 20 6d 75 73 74 20  ry2" macro must 
f610: 65 78 68 69 62 69 74 20 65 78 74 65 72 6e 61 6c  exhibit external
f620: 20 73 65 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64   semantics.** id
f630: 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 6f 73 65  entical to those
f640: 20 6f 66 20 74 68 65 20 22 77 69 6e 49 6f 65 72   of the "winIoer
f650: 72 43 61 6e 52 65 74 72 79 31 22 20 6d 61 63 72  rCanRetry1" macr
f660: 6f 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  o..*/.#if !defin
f670: 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65  ed(winIoerrCanRe
f680: 74 72 79 31 29 0a 23 64 65 66 69 6e 65 20 77 69  try1).#define wi
f690: 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28  nIoerrCanRetry1(
f6a0: 61 29 20 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f  a) (((a)==ERROR_
f6b0: 41 43 43 45 53 53 5f 44 45 4e 49 45 44 29 20 20  ACCESS_DENIED)  
f6c0: 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20        || \.     
f6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6e0: 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45           ((a)==E
f6f0: 52 52 4f 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f  RROR_SHARING_VIO
f700: 4c 41 54 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a  LATION)    || \.
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
f730: 61 29 3d 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56  a)==ERROR_LOCK_V
f740: 49 4f 4c 41 54 49 4f 4e 29 20 20 20 20 20 20 20  IOLATION)       
f750: 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  || \.           
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44     ((a)==ERROR_D
f780: 45 56 5f 4e 4f 54 5f 45 58 49 53 54 29 20 20 20  EV_NOT_EXIST)   
f790: 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20       || \.      
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52          ((a)==ER
f7c0: 52 4f 52 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45  ROR_NETNAME_DELE
f7d0: 54 45 44 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20  TED)      || \. 
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 61               ((a
f800: 29 3d 3d 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d  )==ERROR_SEM_TIM
f810: 45 4f 55 54 29 20 20 20 20 20 20 20 20 20 20 7c  EOUT)          |
f820: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
f830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f840: 20 20 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45    ((a)==ERROR_NE
f850: 54 57 4f 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c  TWORK_UNREACHABL
f860: 45 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  E)).#endif../*.*
f870: 2a 20 49 66 20 61 20 52 65 61 64 46 69 6c 65 28  * If a ReadFile(
f880: 29 20 6f 72 20 57 72 69 74 65 46 69 6c 65 28 29  ) or WriteFile()
f890: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69   error occurs, i
f8a0: 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69  nvoke this routi
f8b0: 6e 65 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ne.** to see if 
f8c0: 69 74 20 73 68 6f 75 6c 64 20 62 65 20 72 65 74  it should be ret
f8d0: 72 69 65 64 2e 20 20 52 65 74 75 72 6e 20 54 52  ried.  Return TR
f8e0: 55 45 20 74 6f 20 72 65 74 72 79 2e 20 20 52 65  UE to retry.  Re
f8f0: 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f  turn FALSE.** to
f900: 20 67 69 76 65 20 75 70 20 77 69 74 68 20 61 6e   give up with an
f910: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69   error..*/.stati
f920: 63 20 69 6e 74 20 77 69 6e 52 65 74 72 79 49 6f  c int winRetryIo
f930: 65 72 72 28 69 6e 74 20 2a 70 6e 52 65 74 72 79  err(int *pnRetry
f940: 2c 20 44 57 4f 52 44 20 2a 70 45 72 72 6f 72 29  , DWORD *pError)
f950: 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d 20 6f 73  {.  DWORD e = os
f960: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
f970: 20 20 69 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d    if( *pnRetry>=
f980: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 20 29 7b  winIoerrRetry ){
f990: 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20  .    if( pError 
f9a0: 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
f9b0: 20 3d 20 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = e;.    }.    
f9c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
f9d0: 69 66 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52  if( winIoerrCanR
f9e0: 65 74 72 79 31 28 65 29 20 29 7b 0a 20 20 20 20  etry1(e) ){.    
f9f0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
fa00: 65 65 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72  eep(winIoerrRetr
fa10: 79 44 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74  yDelay*(1+*pnRet
fa20: 72 79 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52  ry));.    ++*pnR
fa30: 65 74 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e  etry;.    return
fa40: 20 31 3b 0a 20 20 7d 0a 23 69 66 20 64 65 66 69   1;.  }.#if defi
fa50: 6e 65 64 28 77 69 6e 49 6f 65 72 72 43 61 6e 52  ned(winIoerrCanR
fa60: 65 74 72 79 32 29 0a 20 20 65 6c 73 65 20 69 66  etry2).  else if
fa70: 28 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74  ( winIoerrCanRet
fa80: 72 79 32 28 65 29 20 29 7b 0a 20 20 20 20 73 71  ry2(e) ){.    sq
fa90: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
faa0: 70 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44  p(winIoerrRetryD
fab0: 65 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79  elay*(1+*pnRetry
fac0: 29 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74  ));.    ++*pnRet
fad0: 72 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  ry;.    return 1
fae0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
faf0: 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20  f( pError ){.   
fb00: 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20   *pError = e;.  
fb10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
fb20: 0a 2f 2a 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f  ./*.** Log a I/O
fb30: 20 65 72 72 6f 72 20 72 65 74 72 79 20 65 70 69   error retry epi
fb40: 73 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sode..*/.static 
fb50: 76 6f 69 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72  void winLogIoerr
fb60: 28 69 6e 74 20 6e 52 65 74 72 79 2c 20 69 6e 74  (int nRetry, int
fb70: 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20   lineno){.  if( 
fb80: 6e 52 65 74 72 79 20 29 7b 0a 20 20 20 20 73 71  nRetry ){.    sq
fb90: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
fba0: 5f 4e 4f 54 49 43 45 2c 0a 20 20 20 20 20 20 22  _NOTICE,.      "
fbb0: 64 65 6c 61 79 65 64 20 25 64 6d 73 20 66 6f 72  delayed %dms for
fbc0: 20 6c 6f 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f   lock/sharing co
fbd0: 6e 66 6c 69 63 74 20 61 74 20 6c 69 6e 65 20 25  nflict at line %
fbe0: 64 22 2c 0a 20 20 20 20 20 20 77 69 6e 49 6f 65  d",.      winIoe
fbf0: 72 72 52 65 74 72 79 44 65 6c 61 79 2a 6e 52 65  rrRetryDelay*nRe
fc00: 74 72 79 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32  try*(nRetry+1)/2
fc10: 2c 20 6c 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a  , lineno.    );.
fc20: 20 20 7d 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54    }.}..#if SQLIT
fc30: 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a 2a  E_OS_WINCE./****
fc40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 69 73 20 73 65  *****.** This se
fc90: 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 63  ction contains c
fca0: 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f 6e  ode for WinCE on
fcb0: 6c 79 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69  ly..*/.#if !defi
fcc0: 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53 56 43 5f  ned(SQLITE_MSVC_
fcd0: 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29 20 7c  LOCALTIME_API) |
fce0: 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56 43 5f 4c  | !SQLITE_MSVC_L
fcf0: 4f 43 41 4c 54 49 4d 45 5f 41 50 49 0a 2f 2a 0a  OCALTIME_API./*.
fd00: 2a 2a 20 54 68 65 20 4d 53 56 43 20 43 52 54 20  ** The MSVC CRT 
fd10: 6f 6e 20 57 69 6e 64 6f 77 73 20 43 45 20 6d 61  on Windows CE ma
fd20: 79 20 6e 6f 74 20 68 61 76 65 20 61 20 6c 6f 63  y not have a loc
fd30: 61 6c 74 69 6d 65 28 29 20 66 75 6e 63 74 69 6f  altime() functio
fd40: 6e 2e 20 20 53 6f 0a 2a 2a 20 63 72 65 61 74 65  n.  So.** create
fd50: 20 61 20 73 75 62 73 74 69 74 75 74 65 2e 0a 2a   a substitute..*
fd60: 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65  /.#include <time
fd70: 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a 5f  .h>.struct tm *_
fd80: 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d 65  _cdecl localtime
fd90: 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a 74  (const time_t *t
fda0: 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  ).{.  static str
fdb0: 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c 45  uct tm y;.  FILE
fdc0: 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20  TIME uTm, lTm;. 
fdd0: 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d 3b   SYSTEMTIME pTm;
fde0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
fdf0: 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a 74   t64;.  t64 = *t
fe00: 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20 2b  ;.  t64 = (t64 +
fe10: 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31 30   11644473600)*10
fe20: 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64 77  000000;.  uTm.dw
fe30: 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28 44  LowDateTime = (D
fe40: 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46 46  WORD)(t64 & 0xFF
fe50: 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e 64  FFFFFF);.  uTm.d
fe60: 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20 28  wHighDateTime= (
fe70: 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33 32  DWORD)(t64 >> 32
fe80: 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65 54  );.  osFileTimeT
fe90: 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26  oLocalFileTime(&
fea0: 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73 46  uTm,&lTm);.  osF
feb0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
fec0: 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a  ime(&lTm,&pTm);.
fed0: 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70 54    y.tm_year = pT
fee0: 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b 0a  m.wYear - 1900;.
fef0: 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d    y.tm_mon = pTm
ff00: 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20 79  .wMonth - 1;.  y
ff10: 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e 77  .tm_wday = pTm.w
ff20: 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e 74  DayOfWeek;.  y.t
ff30: 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44 61  m_mday = pTm.wDa
ff40: 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20 3d  y;.  y.tm_hour =
ff50: 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79 2e   pTm.wHour;.  y.
ff60: 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d 69  tm_min = pTm.wMi
ff70: 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65 63  nute;.  y.tm_sec
ff80: 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a   = pTm.wSecond;.
ff90: 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a 23    return &y;.}.#
ffa0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 48  endif..#define H
ffb0: 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45  ANDLE_TO_WINFILE
ffc0: 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26 28  (a) (winFile*)&(
ffd0: 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74 29  (char*)a)[-(int)
ffe0: 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c 65  offsetof(winFile
fff0: 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  ,h)]../*.** Acqu
10000 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ire a lock on th
10010 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73 74  e handle h.*/.st
10020 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65 4d  atic void winceM
10030 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e 44  utexAcquire(HAND
10040 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44 20  LE h){.   DWORD 
10050 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a 20  dwErr;.   do {. 
10060 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57 61      dwErr = osWa
10070 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63  itForSingleObjec
10080 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b 0a  t(h, INFINITE);.
10090 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45 72     } while (dwEr
100a0 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43 54  r != WAIT_OBJECT
100b0 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20 57  _0 && dwErr != W
100c0 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b 0a  AIT_ABANDONED);.
100d0 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  }./*.** Release 
100e0 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64 20  a lock acquired 
100f0 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  by winceMutexAcq
10100 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69 6e  uire().*/.#defin
10110 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65  e winceMutexRele
10120 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d 75  ase(h) ReleaseMu
10130 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43 72  tex(h)../*.** Cr
10140 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20 61  eate the mutex a
10150 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  nd shared memory
10160 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
10170 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  g in the file.**
10180 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
10190 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
101a0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
101b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
101c0 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20 2a  ename, winFile *
101d0 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54 52  pFile){.  LPWSTR
101e0 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52 20   zTok;.  LPWSTR 
101f0 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20 6c  zName;.  DWORD l
10200 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f 4c  astErrno;.  BOOL
10210 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53 45   bLogged = FALSE
10220 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20 3d  ;.  BOOL bInit =
10230 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65 20   TRUE;..  zName 
10240 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f  = winUtf8ToUnico
10250 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
10260 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
10270 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20 6d  .    /* out of m
10280 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65 74  emory */.    ret
10290 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
102a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
102b0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
102c0 20 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20   local lockdata 
102d0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69  */.  memset(&pFi
102e0 6c 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69  le->local, 0, si
102f0 7a 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61  zeof(pFile->loca
10300 6c 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61  l));..  /* Repla
10310 63 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68  ce the backslash
10320 65 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  es from the file
10330 6e 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61  name and lowerca
10340 73 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65  se it.  ** to de
10350 72 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d  rive a mutex nam
10360 65 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f  e. */.  zTok = o
10370 73 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d  sCharLowerW(zNam
10380 65 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f  e);.  for (;*zTo
10390 6b 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69  k;zTok++){.    i
103a0 66 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27  f (*zTok == '\\'
103b0 29 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20  ) *zTok = '_';. 
103c0 20 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f   }..  /* Create/
103d0 6f 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d  open the named m
103e0 75 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d  utex */.  pFile-
103f0 3e 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61  >hMutex = osCrea
10400 74 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46  teMutexW(NULL, F
10410 41 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ALSE, zName);.  
10420 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
10430 65 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ex){.    pFile->
10440 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
10450 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
10460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
10470 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
10480 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
10490 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c  LITE_IOERR, pFil
104a0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20  e->lastErrno,.  
104b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104c0 20 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74       "winceCreat
104d0 65 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61  eLock1", zFilena
104e0 6d 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  me);.  }..  /* A
104f0 63 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78  cquire the mutex
10500 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69   before continui
10510 6e 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74  ng */.  winceMut
10520 65 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d  exAcquire(pFile-
10530 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  >hMutex);..  /* 
10540 53 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20  Since the names 
10550 6f 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73  of named mutexes
10560 2c 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69  , semaphores, fi
10570 6c 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20  le mappings etc 
10580 61 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65  are.  ** case-se
10590 6e 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64  nsitive, take ad
105a0 76 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20  vantage of that 
105b0 62 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74  by uppercasing t
105c0 68 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20  he mutex name.  
105d0 2a 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61  ** and using tha
105e0 74 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20  t as the shared 
105f0 66 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65  filemapping name
10600 2e 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55  ..  */.  osCharU
10610 70 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20  pperW(zName);.  
10620 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
10630 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70   osCreateFileMap
10640 70 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41  pingW(INVALID_HA
10650 4e 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c  NDLE_VALUE, NULL
10660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10680 20 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52            PAGE_R
10690 45 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a  EADWRITE, 0, siz
106a0 65 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a  eof(winceLock),.
106b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
106d0 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a          zName);.
106e0 0a 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67  .  /* Set a flag
106f0 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
10700 77 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20  we're the first 
10710 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65  to create the me
10720 6d 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20  mory so it.  ** 
10730 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69  must be zero-ini
10740 74 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61  tialized */.  la
10750 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
10760 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66  astError();.  if
10770 20 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45   (lastErrno == E
10780 52 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49  RROR_ALREADY_EXI
10790 53 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20  STS){.    bInit 
107a0 3d 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20  = FALSE;.  }..  
107b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61  sqlite3_free(zNa
107c0 6d 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65  me);..  /* If we
107d0 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61   succeeded in ma
107e0 6b 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  king the shared 
107f0 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d  memory handle, m
10800 61 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ap it. */.  if( 
10810 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29  pFile->hShared )
10820 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61  {.    pFile->sha
10830 72 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b  red = (winceLock
10840 2a 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  *)osMapViewOfFil
10850 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
10860 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46  ,.             F
10870 49 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c  ILE_MAP_READ|FIL
10880 45 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20  E_MAP_WRITE, 0, 
10890 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
108a0 6f 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ock));.    /* If
108b0 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c   mapping failed,
108c0 20 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65   close the share
108d0 64 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20  d memory handle 
108e0 61 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a  and erase it */.
108f0 20 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e      if( !pFile->
10900 73 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  shared ){.      
10910 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
10920 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
10930 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  r();.      winLo
10940 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
10950 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
10960 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
10970 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
10980 72 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69  reateLock2", zFi
10990 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
109a0 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
109b0 20 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64       osCloseHand
109c0 6c 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65  le(pFile->hShare
109d0 64 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d);.      pFile-
109e0 3e 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b  >hShared = NULL;
109f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10a00 20 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   If shared memor
10a10 79 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  y could not be c
10a20 72 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f  reated, then clo
10a30 73 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64  se the mutex and
10a40 20 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70   fail */.  if( p
10a50 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e  File->hShared==N
10a60 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
10a70 62 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20  bLogged ){.     
10a80 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
10a90 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
10aa0 20 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72       winLogError
10ab0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70  (SQLITE_IOERR, p
10ac0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
10ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10ae0 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c     "winceCreateL
10af0 6f 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  ock3", zFilename
10b00 29 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64  );.      bLogged
10b10 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
10b20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
10b30 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
10b40 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
10b50 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
10b60 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
10b70 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
10b80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
10b90 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20  TE_IOERR;.  }.. 
10ba0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
10bb0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
10bc0 20 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73   if we're suppos
10bd0 65 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62  ed to */.  if( b
10be0 49 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73  Init ){.    mems
10bf0 65 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  et(pFile->shared
10c00 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63  , 0, sizeof(winc
10c10 65 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20  eLock));.  }..  
10c20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73  winceMutexReleas
10c30 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29  e(pFile->hMutex)
10c40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
10c50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
10c60 65 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20  estroy the part 
10c70 6f 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20  of winFile that 
10c80 64 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65  deals with wince
10c90 20 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63   locks.*/.static
10ca0 20 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72   void winceDestr
10cb0 6f 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a  oyLock(winFile *
10cc0 70 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46  pFile){.  if (pF
10cd0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20  ile->hMutex){.  
10ce0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
10cf0 20 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69   mutex */.    wi
10d00 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
10d10 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10d20 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
10d30 6f 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f  owing blocks sho
10d40 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73  uld probably ass
10d50 65 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64  ert in debug mod
10d60 65 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20  e, but they.    
10d70 20 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75     are to cleanu
10d80 70 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f  p in case any lo
10d90 63 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65  cks remained ope
10da0 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69  n */.    if (pFi
10db0 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
10dc0 72 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  rs){.      pFile
10dd0 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65  ->shared->nReade
10de0 72 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20  rs --;.    }.   
10df0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
10e00 6c 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20  l.bReserved){.  
10e10 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
10e20 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46  d->bReserved = F
10e30 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ALSE;.    }.    
10e40 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
10e50 2e 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20  .bPending){.    
10e60 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
10e70 3e 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53  >bPending = FALS
10e80 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  E;.    }.    if 
10e90 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45  (pFile->local.bE
10ea0 78 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20  xclusive){.     
10eb0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
10ec0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
10ed0 53 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  SE;.    }..    /
10ee0 2a 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61  * De-reference a
10ef0 6e 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70  nd close our cop
10f00 79 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  y of the shared 
10f10 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f  memory handle */
10f20 0a 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77  .    osUnmapView
10f30 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68  OfFile(pFile->sh
10f40 61 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f  ared);.    osClo
10f50 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
10f60 68 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f  hShared);..    /
10f70 2a 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * Done with the 
10f80 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
10f90 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70  ceMutexRelease(p
10fa0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20  File->hMutex);. 
10fb0 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
10fc0 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
10fd0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74  .    pFile->hMut
10fe0 65 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d  ex = NULL;.  }.}
10ff0 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65  ../*.** An imple
11000 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
11010 20 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20   LockFile() API 
11020 6f 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43  of Windows for C
11030 45 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c  E.*/.static BOOL
11040 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a   winceLockFile(.
11050 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c    LPHANDLE phFil
11060 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c  e,.  DWORD dwFil
11070 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57  eOffsetLow,.  DW
11080 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74  ORD dwFileOffset
11090 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  High,.  DWORD nN
110a0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
110b0 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  ckLow,.  DWORD n
110c0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
110d0 6f 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e  ockHigh.){.  win
110e0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41  File *pFile = HA
110f0 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28  NDLE_TO_WINFILE(
11100 70 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20  phFile);.  BOOL 
11110 62 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b  bReturn = FALSE;
11120 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
11130 45 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65  ETER(dwFileOffse
11140 74 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44  tHigh);.  UNUSED
11150 5f 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62  _PARAMETER(nNumb
11160 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48  erOfBytesToLockH
11170 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
11180 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
11190 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
111a0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
111b0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
111c0 20 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65   /* Wanting an e
111d0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a  xclusive lock? *
111e0 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66  /.  if (dwFileOf
111f0 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52  fsetLow == (DWOR
11200 44 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20  D)SHARED_FIRST. 
11210 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72        && nNumber
11220 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
11230 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11240 44 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20  D_SIZE){.    if 
11250 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e  (pFile->shared->
11260 6e 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26  nReaders == 0 &&
11270 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11280 62 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29  bExclusive == 0)
11290 7b 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  {.       pFile->
112a0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
112b0 76 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ve = TRUE;.     
112c0 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
112d0 45 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45  Exclusive = TRUE
112e0 3b 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e  ;.       bReturn
112f0 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
11300 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
11310 72 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20  read-only lock? 
11320 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
11330 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11340 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
11350 49 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20  IRST &&.        
11360 20 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65     nNumberOfByte
11370 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
11380 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
11390 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
113a0 69 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20  ive == 0){.     
113b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52   pFile->local.nR
113c0 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20  eaders ++;.     
113d0 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
113e0 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29  l.nReaders == 1)
113f0 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
11400 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11410 73 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  s ++;.      }.  
11420 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11430 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  UE;.    }.  }.. 
11440 20 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69   /* Want a pendi
11450 6e 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ng lock? */.  el
11460 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
11470 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11480 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20  )PENDING_BYTE.  
11490 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
114a0 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
114b0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f  Low == 1){.    /
114c0 2a 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20  * If no pending 
114d0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63  lock has been ac
114e0 71 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71  quired, then acq
114f0 75 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69  uire it */.    i
11500 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
11510 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29  ->bPending == 0)
11520 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
11530 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11540 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70   = TRUE;.      p
11550 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e  File->local.bPen
11560 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20  ding = TRUE;.   
11570 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11580 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11590 2f 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76  /* Want a reserv
115a0 65 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c  ed lock? */.  el
115b0 73 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  se if (dwFileOff
115c0 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
115d0 29 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20  )RESERVED_BYTE. 
115e0 20 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75            && nNu
115f0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
11600 6b 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20  kLow == 1){.    
11610 69 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65  if (pFile->share
11620 64 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20  d->bReserved == 
11630 30 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0) {.      pFile
11640 2d 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72  ->shared->bReser
11650 76 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ved = TRUE;.    
11660 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62    pFile->local.b
11670 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b  Reserved = TRUE;
11680 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11690 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
116a0 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65  ..  winceMutexRe
116b0 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75  lease(pFile->hMu
116c0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  tex);.  return b
116d0 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Return;.}../*.**
116e0 20 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69   An implementati
116f0 6f 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b  on of the Unlock
11700 46 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64  File API of Wind
11710 6f 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74  ows for CE.*/.st
11720 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55  atic BOOL winceU
11730 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48  nlockFile(.  LPH
11740 41 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20  ANDLE phFile,.  
11750 44 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73  DWORD dwFileOffs
11760 65 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64  etLow,.  DWORD d
11770 77 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c  wFileOffsetHigh,
11780 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72  .  DWORD nNumber
11790 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c  OfBytesToUnlockL
117a0 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d  ow,.  DWORD nNum
117b0 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
117c0 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
117d0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
117e0 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
117f0 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
11800 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
11810 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11820 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
11830 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
11840 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
11850 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
11860 48 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70  High);..  if (!p
11870 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65  File->hMutex) re
11880 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e  turn TRUE;.  win
11890 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
118a0 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
118b0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
118c0 20 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20   reader lock or 
118d0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
118e0 6b 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c  k */.  if (dwFil
118f0 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44  eOffsetLow == (D
11900 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53  WORD)SHARED_FIRS
11910 54 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77  T){.    /* Did w
11920 65 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  e have an exclus
11930 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20  ive lock? */.   
11940 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61   if (pFile->loca
11950 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20  l.bExclusive){. 
11960 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d       assert(nNum
11970 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f  berOfBytesToUnlo
11980 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  ckLow == (DWORD)
11990 53 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20  SHARED_SIZE);.  
119a0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
119b0 2e 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41  .bExclusive = FA
119c0 4c 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  LSE;.      pFile
119d0 2d 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75  ->shared->bExclu
119e0 73 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20  sive = FALSE;.  
119f0 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52      bReturn = TR
11a00 55 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  UE;.    }..    /
11a10 2a 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61  * Did we just ha
11a20 76 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  ve a reader lock
11a30 3f 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  ? */.    else if
11a40 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
11a50 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20  Readers){.      
11a60 61 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66  assert(nNumberOf
11a70 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
11a80 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
11a90 44 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  D_SIZE.         
11aa0 20 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66      || nNumberOf
11ab0 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77  BytesToUnlockLow
11ac0 20 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46   == 1);.      pF
11ad0 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64  ile->local.nRead
11ae0 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66  ers --;.      if
11af0 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e   (pFile->local.n
11b00 52 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20  Readers == 0).  
11b10 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46      {.        pF
11b20 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65  ile->shared->nRe
11b30 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20  aders --;.      
11b40 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  }.      bReturn 
11b50 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11b60 7d 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e  }..  /* Releasin
11b70 67 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b  g a pending lock
11b80 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64   */.  else if (d
11b90 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d  wFileOffsetLow =
11ba0 3d 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47  = (DWORD)PENDING
11bb0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
11bc0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
11bd0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
11be0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
11bf0 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69  le->local.bPendi
11c00 6e 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ng){.      pFile
11c10 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67  ->local.bPending
11c20 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20   = FALSE;.      
11c30 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11c40 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b  Pending = FALSE;
11c50 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
11c60 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
11c70 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20  .  /* Releasing 
11c80 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
11c90 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
11ca0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11cb0 20 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44   (DWORD)RESERVED
11cc0 5f 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20  _BYTE.          
11cd0 20 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74   && nNumberOfByt
11ce0 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d  esToUnlockLow ==
11cf0 20 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69   1){.    if (pFi
11d00 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
11d10 76 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ved) {.      pFi
11d20 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72  le->local.bReser
11d30 76 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ved = FALSE;.   
11d40 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11d50 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
11d60 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75  LSE;.      bRetu
11d70 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d  rn = TRUE;.    }
11d80 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74  .  }..  winceMut
11d90 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d  exRelease(pFile-
11da0 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  >hMutex);.  retu
11db0 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  rn bReturn;.}./*
11dc0 0a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73  .** End of the s
11dd0 70 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20  pecial code for 
11de0 77 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  wince.**********
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ***/.#endif /* S
11e40 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a  QLITE_OS_WINCE *
11e50 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20  /../*.** Lock a 
11e60 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a  file region..*/.
11e70 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c  static BOOL winL
11e80 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
11e90 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
11ea0 4f 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f  ORD flags,.  DWO
11eb0 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
11ec0 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
11ed0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
11ee0 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
11ef0 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
11f00 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
11f10 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
11f20 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
11f30 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
11f40 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
11f50 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
11f60 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
11f70 50 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a  PI LockFile..  *
11f80 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65  /.  return wince
11f90 4c 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c  LockFile(phFile,
11fa0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
11fb0 65 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20  etHigh,.        
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
11fd0 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42  umBytesLow, numB
11fe0 79 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65  ytesHigh);.#else
11ff0 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20  .  if( osIsNT() 
12000 29 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  ){.    OVERLAPPE
12010 44 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73  D ovlp;.    mems
12020 65 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a  et(&ovlp, 0, siz
12030 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
12040 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65  ;.    ovlp.Offse
12050 74 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20  t = offsetLow;. 
12060 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69     ovlp.OffsetHi
12070 67 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b  gh = offsetHigh;
12080 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f  .    return osLo
12090 63 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65  ckFileEx(*phFile
120a0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42  , flags, 0, numB
120b0 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
120c0 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20  sHigh, &ovlp);. 
120d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
120e0 72 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70  rn osLockFile(*p
120f0 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
12100 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75  , offsetHigh, nu
12110 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20  mBytesLow,.     
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a   numBytesHigh);.
12140 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
12150 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c  .** Unlock a fil
12160 65 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74  e region.. */.st
12170 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c  atic BOOL winUnl
12180 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e  ockFile(.  LPHAN
12190 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57  DLE phFile,.  DW
121a0 4f 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20  ORD offsetLow,. 
121b0 20 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67   DWORD offsetHig
121c0 68 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79  h,.  DWORD numBy
121d0 74 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20  tesLow,.  DWORD 
121e0 6e 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a  numBytesHigh.){.
121f0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
12200 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f  NCE.  /*.  ** NO
12210 54 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69  TE: Windows CE i
12220 73 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72  s handled differ
12230 65 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69  ently here due i
12240 74 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57  ts lack of the W
12250 69 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20  in32.  **       
12260 41 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a  API UnlockFile..
12270 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69    */.  return wi
12280 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68  nceUnlockFile(ph
12290 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
122a0 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20   offsetHigh,.   
122b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122c0 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f        numBytesLo
122d0 77 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29  w, numBytesHigh)
122e0 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73  ;.#else.  if( os
122f0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56  IsNT() ){.    OV
12300 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20  ERLAPPED ovlp;. 
12310 20 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c     memset(&ovlp,
12320 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
12330 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c  APPED));.    ovl
12340 70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  p.Offset = offse
12350 74 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f  tLow;.    ovlp.O
12360 66 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73  ffsetHigh = offs
12370 65 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75  etHigh;.    retu
12380 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45  rn osUnlockFileE
12390 78 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75  x(*phFile, 0, nu
123a0 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
123b0 74 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b  tesHigh, &ovlp);
123c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
123d0 74 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c  turn osUnlockFil
123e0 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65  e(*phFile, offse
123f0 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68  tLow, offsetHigh
12400 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20  , numBytesLow,. 
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
12430 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
12440 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
12450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67  **.** The next g
124a0 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
124b0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49   implement the I
124c0 2f 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69  /O methods speci
124d0 66 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73  fied.** by the s
124e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
124f0 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a  s object..******
12500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
12550 20 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20   Some Microsoft 
12560 63 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74  compilers lack t
12570 68 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a  his definition..
12580 2a 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c  */.#ifndef INVAL
12590 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e  ID_SET_FILE_POIN
125a0 54 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56  TER.# define INV
125b0 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
125c0 49 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31  INTER ((DWORD)-1
125d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
125e0 4d 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  Move the current
125f0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65   position of the
12600 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73   file handle pas
12610 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
12620 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
12630 6f 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77  offset iOffset w
12640 69 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  ithin the file. 
12650 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72  If successful, r
12660 65 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65  eturn 0..** Othe
12670 72 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65  rwise, set pFile
12680 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20  ->lastErrno and 
12690 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
126a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
126b0 69 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69  inSeekFile(winFi
126c0 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74  le *pFile, sqlit
126d0 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74  e3_int64 iOffset
126e0 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  ){.#if !SQLITE_O
126f0 53 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75  S_WINRT.  LONG u
12700 70 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20  pperBits;       
12710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73            /* Mos
12720 74 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f  t sig. 32 bits o
12730 66 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a  f new offset */.
12740 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
12750 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12760 20 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20    /* Least sig. 
12770 33 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f  32 bits of new o
12780 66 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44  ffset */.  DWORD
12790 20 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20   dwRet;         
127a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
127b0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
127c0 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29  SetFilePointer()
127d0 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
127e0 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
127f0 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
12800 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
12810 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20  stError() */..  
12820 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
12830 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25  ile=%p, offset=%
12840 6c 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  lld\n", pFile->h
12850 2c 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20  , iOffset));..  
12860 75 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e  upperBits = (LON
12870 47 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29  G)((iOffset>>32)
12880 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
12890 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c    lowerBits = (L
128a0 4f 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30  ONG)(iOffset & 0
128b0 78 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f  xffffffff);..  /
128c0 2a 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66  * API oddity: If
128d0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74   successful, Set
128e0 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65  FilePointer() re
128f0 74 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20  turns a dword.  
12900 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
12910 65 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20  e lower 32-bits 
12920 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d  of the new file-
12930 6f 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69  offset. Or, if i
12940 74 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74  t fails,.  ** it
12950 20 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44   returns INVALID
12960 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
12970 52 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72  R. However accor
12980 64 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20  ding to MSDN,.  
12990 2a 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ** INVALID_SET_F
129a0 49 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20  ILE_POINTER may 
129b0 61 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20  also be a valid 
129c0 6e 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74  new offset. So t
129d0 6f 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a  o determine.  **
129e0 20 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f   whether an erro
129f0 72 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f  r has actually o
12a00 63 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61  ccurred, it is a
12a10 6c 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f  lso necessary to
12a20 20 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61   call.  ** GetLa
12a30 73 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a  stError()..  */.
12a40 20 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46    dwRet = osSetF
12a50 69 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65  ilePointer(pFile
12a60 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
12a70 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
12a80 5f 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20  _BEGIN);..  if( 
12a90 28 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f  (dwRet==INVALID_
12aa0 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
12ab0 0a 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74  .      && ((last
12ac0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
12ad0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
12ae0 52 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69  ROR)) ){.    pFi
12af0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
12b00 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
12b10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
12b20 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46  E_IOERR_SEEK, pF
12b30 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 22 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70  "winSeekFile", p
12b60 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
12b70 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b    OSTRACE(("SEEK
12b80 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
12b90 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e  ITE_IOERR_SEEK\n
12ba0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
12bb0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
12bc0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45  ..  OSTRACE(("SE
12bd0 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  EK file=%p, rc=S
12be0 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69  QLITE_OK\n", pFi
12bf0 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
12c00 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a  n 0;.#else.  /*.
12c10 20 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f    ** Same as abo
12c20 76 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  ve, except that 
12c30 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  this implementat
12c40 69 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69  ion works for Wi
12c50 6e 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52  nRT..  */..  LAR
12c60 47 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20  GE_INTEGER x;   
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12c80 54 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a  The new offset *
12c90 2f 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20  /.  BOOL bRet;  
12ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cb0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74      /* Value ret
12cc0 75 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65  urned by SetFile
12cd0 50 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a  PointerEx() */..
12ce0 20 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69    x.QuadPart = i
12cf0 4f 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d  Offset;.  bRet =
12d00 20 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   osSetFilePointe
12d10 72 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c  rEx(pFile->h, x,
12d20 20 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b   0, FILE_BEGIN);
12d30 0a 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20  ..  if(!bRet){. 
12d40 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
12d50 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
12d60 72 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c  rror();.    winL
12d70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
12d80 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65  OERR_SEEK, pFile
12d90 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
12db0 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c  nSeekFile", pFil
12dc0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f  e->zPath);.    O
12dd0 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
12de0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
12df0 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20  _IOERR_SEEK\n", 
12e00 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
12e10 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20  return 1;.  }.. 
12e20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
12e30 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
12e40 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d  TE_OK\n", pFile-
12e50 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  >h));.  return 0
12e60 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  ;.#endif.}..#if 
12e70 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12e80 53 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72  SIZE>0./* Forwar
12e90 64 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  d references to 
12ea0 56 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f  VFS helper metho
12eb0 64 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f  ds used for memo
12ec0 72 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20  ry mapped files 
12ed0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
12ee0 6e 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65  nMapfile(winFile
12ef0 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  *, sqlite3_int64
12f00 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  );.static int wi
12f10 6e 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69  nUnmapfile(winFi
12f20 6c 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  le*);.#endif../*
12f30 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
12f40 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65  ..**.** It is re
12f50 70 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61  ported that an a
12f60 74 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20  ttempt to close 
12f70 61 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73  a handle might s
12f80 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c  ometimes.** fail
12f90 2e 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72  .  This is a ver
12fa0 79 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72  y unreasonable r
12fb0 65 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f  esult, but Windo
12fc0 77 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a  ws is notorious.
12fd0 2a 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72  ** for being unr
12fe0 65 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64  easonable so I d
12ff0 6f 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74  o not doubt that
13000 20 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e   it might happen
13010 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f  .  If.** the clo
13020 73 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75  se fails, we pau
13030 73 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69  se for 100 milli
13040 73 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20  seconds and try 
13050 61 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61  again.  As.** ma
13060 6e 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41  ny as MX_CLOSE_A
13070 54 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20  TTEMPT attempts 
13080 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e  to close the han
13090 64 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66  dle are made bef
130a0 6f 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70  ore.** giving up
130b0 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
130c0 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66  n error..*/.#def
130d0 69 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54  ine MX_CLOSE_ATT
130e0 45 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e  EMPT 3.static in
130f0 74 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74  t winClose(sqlit
13100 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
13110 69 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b  int rc, cnt = 0;
13120 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
13130 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
13140 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  ;..  assert( id!
13150 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  =0 );.#ifndef SQ
13160 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
13170 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
13180 53 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66  Shm==0 );.#endif
13190 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
131a0 2d 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69  ->h!=NULL && pFi
131b0 6c 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48  le->h!=INVALID_H
131c0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20  ANDLE_VALUE );. 
131d0 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
131e0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
131f0 25 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a  %p, file=%p\n",.
13200 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
13210 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
13220 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
13230 2d 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ->h));..#if SQLI
13240 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13250 3e 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  >0.  winUnmapfil
13260 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  e(pFile);.#endif
13270 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d  ..  do{.    rc =
13280 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
13290 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a  File->h);.    /*
132a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
132b0 28 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43  ( rc=0; cnt=MX_C
132c0 4c 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b  LOSE_ATTEMPT; );
132d0 20 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63   */.  }while( rc
132e0 3d 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d  ==0 && ++cnt < M
132f0 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20  X_CLOSE_ATTEMPT 
13300 26 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33  && (sqlite3_win3
13310 32 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29  2_sleep(100), 1)
13320 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   );.#if SQLITE_O
13330 53 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20  S_WINCE.#define 
13340 57 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41  WINCE_DELETION_A
13350 54 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63  TTEMPTS 3.  winc
13360 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69  eDestroyLock(pFi
13370 6c 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  le);.  if( pFile
13380 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65  ->zDeleteOnClose
13390 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
133a0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a  = 0;.    while(.
133b0 20 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c             osDel
133c0 65 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e  eteFileW(pFile->
133d0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d  zDeleteOnClose)=
133e0 3d 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73  =0.        && os
133f0 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
13400 73 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74  sW(pFile->zDelet
13410 65 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66  eOnClose)!=0xfff
13420 66 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26  fffff.        &&
13430 20 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44   cnt++ < WINCE_D
13440 45 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53  ELETION_ATTEMPTS
13450 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73  .    ){.       s
13460 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65  qlite3_win32_sle
13470 65 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69  ep(100);  /* Wai
13480 74 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72  t a little befor
13490 65 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a  e trying again *
134a0 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
134b0 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
134c0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b  zDeleteOnClose);
134d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
134e0 28 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c  ( rc ){.    pFil
134f0 65 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  e->h = NULL;.  }
13500 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
13510 31 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  1);.  OSTRACE(("
13520 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70  CLOSE pid=%lu, p
13530 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
13540 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
13550 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
13560 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
13570 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
13580 20 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61   rc ? "ok" : "fa
13590 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
135a0 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  n rc ? SQLITE_OK
135b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77  .            : w
135c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
135d0 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f  E_IOERR_CLOSE, o
135e0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
135f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13600 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43             "winC
13610 6c 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  lose", pFile->zP
13620 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ath);.}../*.** R
13630 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ead data from a 
13640 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66  file into a buff
13650 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  er.  Return SQLI
13660 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20  TE_OK if all.** 
13670 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20  bytes were read 
13680 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64  successfully and
13690 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66   SQLITE_IOERR if
136a0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
136b0 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  * wrong..*/.stat
136c0 69 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a  ic int winRead(.
136d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
136e0 69 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  id,          /* 
136f0 46 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f  File to read fro
13700 6d 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  m */.  void *pBu
13710 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
13720 20 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65    /* Write conte
13730 6e 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  nt into this buf
13740 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  fer */.  int amt
13750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13770 20 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a   bytes to read *
13780 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
13790 34 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f  4 offset       /
137a0 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
137b0 61 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a  at this offset *
137c0 2f 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45  /.){.#if !SQLITE
137d0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
137e0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
137f0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
13800 29 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f  ).  OVERLAPPED o
13810 76 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20  verlapped;      
13820 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65      /* The offse
13830 74 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20  t for ReadFile. 
13840 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46  */.#endif.  winF
13850 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
13860 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66  nFile*)id;  /* f
13870 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
13880 44 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20  DWORD nRead;    
13890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
138b0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
138c0 20 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20   from file */.  
138d0 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
13900 72 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  rys */..  assert
13910 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  ( id!=0 );.  ass
13920 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20  ert( amt>0 );.  
13930 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
13940 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
13950 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
13960 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29  LITE_IOERR_READ)
13970 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
13980 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
13990 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62  e=%p, file=%p, b
139a0 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74  uffer=%p, amount
139b0 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
139c0 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20    "offset=%lld, 
139d0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65  lock=%d\n", osGe
139e0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
139f0 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20  d(), pFile,.    
13a00 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c         pFile->h,
13a10 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73   pBuf, amt, offs
13a20 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  et, pFile->lockt
13a30 79 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49  ype));..#if SQLI
13a40 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
13a50 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
13a60 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
13a70 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61  s read request a
13a80 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
13a90 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
13aa0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
13ab0 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
13ac0 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
13ad0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
13ae0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
13af0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
13b00 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
13b10 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
13b20 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75  emcpy(pBuf, &((u
13b30 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
13b40 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
13b50 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53  , amt);.      OS
13b60 54 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41  TRACE(("READ-MMA
13b70 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  P pid=%lu, pFile
13b80 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
13b90 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
13ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
13bb0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
13bc0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
13bd0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
13be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13bf0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13c00 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28     int nCopy = (
13c10 69 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70  int)(pFile->mmap
13c20 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a  Size - offset);.
13c30 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
13c40 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
13c50 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
13c60 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
13c70 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
13c80 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
13c90 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
13ca0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
13cb0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
13cc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
13cd0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
13ce0 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28  INCE || defined(
13cf0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
13d00 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66  OVERLAPPED).  if
13d10 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
13d20 69 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a  ile, offset) ){.
13d30 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
13d40 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
13d50 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
13d60 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22  c=SQLITE_FULL\n"
13d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
13d80 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
13d90 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
13da0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
13dc0 4c 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  L;.  }.  while( 
13dd0 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c  !osReadFile(pFil
13de0 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c  e->h, pBuf, amt,
13df0 20 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23   &nRead, 0) ){.#
13e00 65 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f  else.  memset(&o
13e10 76 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69  verlapped, 0, si
13e20 7a 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29  zeof(OVERLAPPED)
13e30 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  );.  overlapped.
13e40 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28  Offset = (LONG)(
13e50 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66  offset & 0xfffff
13e60 66 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70  fff);.  overlapp
13e70 65 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20  ed.OffsetHigh = 
13e80 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e  (LONG)((offset>>
13e90 33 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66  32) & 0x7fffffff
13ea0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52  );.  while( !osR
13eb0 65 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  eadFile(pFile->h
13ec0 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52  , pBuf, amt, &nR
13ed0 65 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64  ead, &overlapped
13ee0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73  ) &&.         os
13ef0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d  GetLastError()!=
13f00 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46  ERROR_HANDLE_EOF
13f10 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44   ){.#endif.    D
13f20 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
13f30 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79      if( winRetry
13f40 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26  Ioerr(&nRetry, &
13f50 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e  lastErrno) ) con
13f60 74 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65  tinue;.    pFile
13f70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
13f80 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54  stErrno;.    OST
13f90 52 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d  RACE(("READ pid=
13fa0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13fb0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13fc0 45 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c  E_IOERR_READ\n",
13fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
13fe0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
13ff0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
14000 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
14010 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
14020 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  (SQLITE_IOERR_RE
14030 41 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AD, pFile->lastE
14040 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
14050 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
14060 6e 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a  nRead", pFile->z
14070 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e  Path);.  }.  win
14080 4c 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c  LogIoerr(nRetry,
14090 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66   __LINE__);.  if
140a0 28 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61  ( nRead<(DWORD)a
140b0 6d 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72  mt ){.    /* Unr
140c0 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65  ead parts of the
140d0 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20   buffer must be 
140e0 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20  zero-filled */. 
140f0 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61     memset(&((cha
14100 72 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c  r*)pBuf)[nRead],
14110 20 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a   0, amt-nRead);.
14120 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
14130 41 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  AD pid=%lu, pFil
14140 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
14150 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  c=SQLITE_IOERR_S
14160 48 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20  HORT_READ\n",.  
14170 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
14180 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14190 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
141a0 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ->h));.    retur
141b0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  n SQLITE_IOERR_S
141c0 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a  HORT_READ;.  }..
141d0 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
141e0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
141f0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
14200 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
14210 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
14220 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
14230 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
14240 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
14250 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
14260 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
14270 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
14280 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
14290 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
142a0 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
142b0 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
142c0 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
142d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
142e0 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
142f0 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20  ile *id,        
14300 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74         /* File t
14310 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a  o write into */.
14320 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
14330 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
14340 20 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74    /* The bytes t
14350 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a  o be written */.
14360 20 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20    int amt,      
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
14390 79 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f  ytes to write */
143a0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
143b0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   offset         
143c0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
143d0 6f 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  o the file to be
143e0 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
143f0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
14400 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14410 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
14420 66 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  f error has occu
14430 72 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65  rred, else false
14440 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70   */.  winFile *p
14450 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
14460 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
14470 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ndle */.  int nR
14480 65 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20  etry = 0;       
14490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
144a0 62 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a  ber of retries *
144b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  /..  assert( amt
144c0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
144d0 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
144e0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
144f0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
14500 52 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74  RITE);.  Simulat
14510 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72  eDiskfullError(r
14520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
14530 4c 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  L);..  OSTRACE((
14540 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
14550 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
14560 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d  p, buffer=%p, am
14570 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20  ount=%d, ".     
14580 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c        "offset=%l
14590 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20  ld, lock=%d\n", 
145a0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
145b0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a  essId(), pFile,.
145c0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
145d0 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
145e0 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c  offset, pFile->l
145f0 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20  ocktype));..#if 
14600 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d  defined(SQLITE_M
14610 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29 20 26  MAP_READWRITE) &
14620 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  & SQLITE_MAX_MMA
14630 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
14640 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
14650 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65  of this write re
14660 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
14670 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
14680 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
14690 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
146a0 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
146b0 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
146c0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
146d0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
146e0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
146f0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
14700 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
14710 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
14720 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
14730 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  ], pBuf, amt);. 
14740 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
14750 52 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c  RITE-MMAP pid=%l
14760 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c  u, pFile=%p, fil
14770 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
14780 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
14790 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
147a0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
147b0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29  File, pFile->h))
147c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
147d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
147e0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
147f0 43 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69  Copy = (int)(pFi
14800 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
14810 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65  ffset);.      me
14820 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
14830 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
14840 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
14850 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
14860 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
14870 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
14880 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
14890 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
148a0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
148b0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
148c0 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20  ITE_OS_WINCE || 
148d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
148e0 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
148f0 45 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65  ED).  rc = winSe
14900 65 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66  ekFile(pFile, of
14910 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
14920 3d 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a  =0 ){.#else.  {.
14930 23 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49  #endif.#if !SQLI
14940 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21  TE_OS_WINCE && !
14950 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
14960 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50  IN32_NO_OVERLAPP
14970 45 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50  ED).    OVERLAPP
14980 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20  ED overlapped;  
14990 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66        /* The off
149a0 73 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c  set for WriteFil
149b0 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  e. */.#endif.   
149c0 20 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20   u8 *aRem = (u8 
149d0 2a 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f  *)pBuf;        /
149e0 2a 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65  * Data yet to be
149f0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
14a00 69 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20  int nRem = amt; 
14a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14a20 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
14a30 20 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74   yet to be writt
14a40 65 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20  en */.    DWORD 
14a50 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
14a60 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
14a70 20 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68   written by each
14a80 20 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c   WriteFile() cal
14a90 6c 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c  l */.    DWORD l
14aa0 61 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52  astErrno = NO_ER
14ab0 52 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20  ROR;   /* Value 
14ac0 72 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c  returned by GetL
14ad0 61 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23  astError() */..#
14ae0 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
14af0 4e 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28  NCE && !defined(
14b00 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f  SQLITE_WIN32_NO_
14b10 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20  OVERLAPPED).    
14b20 6d 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70  memset(&overlapp
14b30 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56  ed, 0, sizeof(OV
14b40 45 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20  ERLAPPED));.    
14b50 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
14b60 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
14b70 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
14b80 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e  .    overlapped.
14b90 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f  OffsetHigh = (LO
14ba0 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29  NG)((offset>>32)
14bb0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a   & 0x7fffffff);.
14bc0 23 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c  #endif..    whil
14bd0 65 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66  e( nRem>0 ){.#if
14be0 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45   SQLITE_OS_WINCE
14bf0 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
14c00 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
14c10 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66  LAPPED).      if
14c20 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70  ( !osWriteFile(p
14c30 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e  File->h, aRem, n
14c40 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29  Rem, &nWrite, 0)
14c50 20 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   ){.#else.      
14c60 69 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65  if( !osWriteFile
14c70 28 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c  (pFile->h, aRem,
14c80 20 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20   nRem, &nWrite, 
14c90 26 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a  &overlapped) ){.
14ca0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
14cb0 66 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  f( winRetryIoerr
14cc0 28 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45  (&nRetry, &lastE
14cd0 72 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65  rrno) ) continue
14ce0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
14cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
14d00 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30  ssert( nWrite==0
14d10 20 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f   || nWrite<=(DWO
14d20 52 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20  RD)nRem );.     
14d30 20 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c   if( nWrite==0 |
14d40 7c 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29  | nWrite>(DWORD)
14d50 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
14d60 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
14d70 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
14d80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14d90 20 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45     }.#if !SQLITE
14da0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
14db0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
14dc0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
14dd0 29 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ).      offset +
14de0 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20  = nWrite;.      
14df0 6f 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65  overlapped.Offse
14e00 74 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65  t = (LONG)(offse
14e10 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b  t & 0xffffffff);
14e20 0a 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65  .      overlappe
14e30 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
14e40 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
14e50 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
14e60 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  ;.#endif.      a
14e70 52 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20  Rem += nWrite;. 
14e80 20 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72       nRem -= nWr
14e90 69 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ite;.    }.    i
14ea0 66 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20  f( nRem>0 ){.   
14eb0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
14ec0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
14ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
14ee0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
14ef0 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20  rc ){.    if(   
14f00 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  ( pFile->lastErr
14f10 6e 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45  no==ERROR_HANDLE
14f20 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20  _DISK_FULL ).   
14f30 20 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e      || ( pFile->
14f40 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
14f50 5f 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20  _DISK_FULL )){. 
14f60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57       OSTRACE(("W
14f70 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
14f80 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
14f90 20 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c   rc=SQLITE_FULL\
14fa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14fb0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
14fc0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c  rocessId(), pFil
14fd0 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  e, pFile->h));. 
14fe0 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
14ff0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46  ogError(SQLITE_F
15000 55 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ULL, pFile->last
15010 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15030 22 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69  "winWrite1", pFi
15040 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
15050 7d 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  }.    OSTRACE(("
15060 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
15070 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15080 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
15090 52 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20  R_WRITE\n",.    
150a0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
150b0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
150c0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
150d0 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
150e0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
150f0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20  TE_IOERR_WRITE, 
15100 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
15110 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15120 20 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69           "winWri
15130 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  te2", pFile->zPa
15140 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  th);.  }else{.  
15150 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52    winLogIoerr(nR
15160 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  etry, __LINE__);
15170 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
15180 22 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20  "WRITE pid=%lu, 
15190 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
151a0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
151b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
151c0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
151d0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
151e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
151f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15200 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
15210 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
15220 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
15230 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
15240 77 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69  winTruncate(sqli
15250 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71  te3_file *id, sq
15260 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
15270 65 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  e){.  winFile *p
15280 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
15290 29 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61  )id;  /* File ha
152a0 6e 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ndle object */. 
152b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
152c0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
152d0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
152e0 66 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  for this functio
152f0 6e 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73  n */.  DWORD las
15300 74 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72  tErrno;..  asser
15310 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
15320 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65  mulateIOError(re
15330 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15340 52 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f  R_TRUNCATE);.  O
15350 53 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54  STRACE(("TRUNCAT
15360 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
15370 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69  =%p, file=%p, si
15380 7a 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64  ze=%lld, lock=%d
15390 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
153a0 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
153b0 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20  essId(), pFile, 
153c0 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c  pFile->h, nByte,
153d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
153e0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
153f0 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
15400 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
15410 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
15420 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
15430 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
15440 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
15450 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
15460 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
15470 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
15480 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
15490 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
154a0 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
154b0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
154c0 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
154d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
154e0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
154f0 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
15500 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
15510 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
15520 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
15530 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Chunk;.  }..  /*
15540 20 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20   SetEndOfFile() 
15550 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
15560 20 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c   when successful
15570 2c 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69  , or zero when i
15580 74 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66  t fails. */.  if
15590 28 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46  ( winSeekFile(pF
155a0 69 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ile, nByte) ){. 
155b0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
155c0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
155d0 5f 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65  _TRUNCATE, pFile
155e0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
155f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15600 20 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22    "winTruncate1"
15610 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
15620 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d  .  }else if( 0==
15630 6f 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70  osSetEndOfFile(p
15640 46 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20  File->h) &&.    
15650 20 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72          ((lastEr
15660 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45  rno = osGetLastE
15670 72 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55  rror())!=ERROR_U
15680 53 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29  SER_MAPPED_FILE)
15690 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c   ){.    pFile->l
156a0 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45  astErrno = lastE
156b0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77  rrno;.    rc = w
156c0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
156d0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
156e0 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
156f0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15700 20 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75           "winTru
15710 6e 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e  ncate2", pFile->
15720 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66  zPath);.  }..#if
15730 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15740 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20  _SIZE>0.  /* If 
15750 74 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75  the file was tru
15760 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
15770 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
15780 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a  e currently.  **
15790 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20   mapped region, 
157a0 72 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63  reduce the effec
157b0 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a  tive mapping siz
157c0 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74  e as well. SQLit
157d0 65 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20  e will.  ** use 
157e0 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
157f0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
15800 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
15810 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
15820 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
15830 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26  e->pMapRegion &&
15840 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d   nByte<pFile->mm
15850 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46  apSize ){.    pF
15860 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
15870 6e 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69  nByte;.  }.#endi
15880 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  f..  OSTRACE(("T
15890 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c  RUNCATE pid=%lu,
158a0 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
158b0 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %p, rc=%s\n",.  
158c0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
158d0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
158e0 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
158f0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
15900 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
15910 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
15920 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
15930 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
15940 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
15950 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
15960 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
15970 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
15980 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
15990 6e 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67  ncs are occuring
159a0 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
159b0 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
159c0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
159d0 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
159e0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
159f0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
15a00 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  * Make sure all 
15a10 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74  writes to a part
15a20 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20  icular file are 
15a30 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73  committed to dis
15a40 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
15a50 20 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33   winSync(sqlite3
15a60 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
15a70 6c 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53  lags){.#ifndef S
15a80 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
15a90 2f 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c  /*.  ** Used onl
15aa0 79 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f  y when SQLITE_NO
15ab0 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66  _SYNC is not def
15ac0 69 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f  ined..   */.  BO
15ad0 4f 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  OL rc;.#endif.#i
15ae0 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
15af0 47 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  G) || !defined(S
15b00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c  QLITE_NO_SYNC) |
15b10 7c 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28  | \.    defined(
15b20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
15b30 52 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20  RACE).  /*.  ** 
15b40 55 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45  Used when SQLITE
15b50 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20  _NO_SYNC is not 
15b60 64 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74  defined and by t
15b70 68 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f  he assert() and/
15b80 6f 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28  or.  ** OSTRACE(
15b90 29 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a  ) macros..   */.
15ba0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
15bb0 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
15bc0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
15bd0 50 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23  PARAMETER(id);.#
15be0 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
15bf0 20 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43   pFile );.  /* C
15c00 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
15c10 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15c20 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
15c30 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
15c40 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
15c50 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
15c60 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
15c70 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
15c80 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
15c90 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
15ca0 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
15cb0 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
15cc0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
15cd0 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
15ce0 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
15cf0 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
15d00 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
15d10 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
15d20 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
15d30 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
15d40 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
15d50 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e  .  OSTRACE(("SYN
15d60 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  C pid=%lu, pFile
15d70 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c  =%p, file=%p, fl
15d80 61 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c  ags=%x, lock=%d\
15d90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15da0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15db0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15dc0 46 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a  File->h, flags,.
15dd0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
15de0 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23  ->locktype));..#
15df0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45  ifndef SQLITE_TE
15e00 53 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ST.  UNUSED_PARA
15e10 4d 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65  METER(flags);.#e
15e20 6c 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73  lse.  if( (flags
15e30 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
15e40 59 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  YNC_FULL ){.    
15e50 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
15e60 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20  _count++;.  }.  
15e70 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
15e80 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
15e90 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
15ea0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
15eb0 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
15ec0 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
15ed0 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
15ee0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15ef0 4e 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43  NO_SYNC.  OSTRAC
15f00 45 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64  E(("SYNC-NOP pid
15f10 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15f20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15f30 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15f40 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15f50 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15f60 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
15f70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15f80 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53  _OK;.#else.#if S
15f90 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
15fa0 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
15fb0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  e->pMapRegion ){
15fc0 0a 20 20 20 20 69 66 28 20 6f 73 46 6c 75 73 68  .    if( osFlush
15fd0 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
15fe0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29  ->pMapRegion, 0)
15ff0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
16000 45 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69  E(("SYNC-MMAP pi
16010 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16020 20 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20   pMapRegion=%p, 
16030 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
16040 20 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e   "rc=SQLITE_OK\n
16050 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
16060 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20  rocessId(),.    
16070 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16080 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
16090 69 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ion));.    }else
160a0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
160b0 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
160c0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
160d0 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e     OSTRACE(("SYN
160e0 43 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20  C-MMAP pid=%lu, 
160f0 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
16100 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
16110 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
16120 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
16130 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
16140 50 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20  ProcessId(),.   
16150 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
16160 65 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  e, pFile->pMapRe
16170 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
16180 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
16190 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
161a0 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
161b0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
161d0 77 69 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c 65  winSync1", pFile
161e0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
161f0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20    }.#endif.  rc 
16200 3d 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66  = osFlushFileBuf
16210 66 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  fers(pFile->h);.
16220 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
16230 72 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20  r( rc=FALSE );. 
16240 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f   if( rc ){.    O
16250 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
16260 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16270 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16280 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
16290 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
162a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
162b0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
162c0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
162d0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
162e0 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  e{.    pFile->la
162f0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
16300 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16310 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70  OSTRACE(("SYNC p
16320 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
16330 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  , file=%p, rc=SQ
16340 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
16350 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16360 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
16370 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
16380 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
16390 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
163a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
163b0 52 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e  R_FSYNC, pFile->
163c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
163d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163e0 20 20 22 77 69 6e 53 79 6e 63 32 22 2c 20 70 46    "winSync2", pF
163f0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
16400 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
16410 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
16420 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
16430 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
16440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
16450 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33  FileSize(sqlite3
16460 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  _file *id, sqlit
16470 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
16480 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
16490 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
164a0 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
164b0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
164c0 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
164d0 73 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20  ssert( pSize!=0 
164e0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
164f0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
16500 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b  TE_IOERR_FSTAT);
16510 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a  .  OSTRACE(("SIZ
16520 45 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65  E file=%p, pSize
16530 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%p\n", pFile->h
16540 2c 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20  , pSize));..#if 
16550 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
16560 20 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41    {.    FILE_STA
16570 4e 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b  NDARD_INFO info;
16580 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69  .    if( osGetFi
16590 6c 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48  leInformationByH
165a0 61 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68  andleEx(pFile->h
165b0 2c 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e  , FileStandardIn
165c0 66 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fo,.            
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20           &info, 
165f0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b  sizeof(info)) ){
16600 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
16610 69 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51  info.EndOfFile.Q
16620 75 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c  uadPart;.    }el
16630 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
16640 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
16650 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
16660 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
16670 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
16680 52 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d  RR_FSTAT, pFile-
16690 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
166a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166b0 20 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22     "winFileSize"
166c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
166d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
166e0 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75  .  {.    DWORD u
166f0 70 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57  pperBits;.    DW
16700 4f 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ORD lowerBits;. 
16710 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72     DWORD lastErr
16720 6e 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69  no;..    lowerBi
16730 74 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69  ts = osGetFileSi
16740 7a 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70  ze(pFile->h, &up
16750 70 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70  perBits);.    *p
16760 53 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65  Size = (((sqlite
16770 33 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74  3_int64)upperBit
16780 73 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42  s)<<32) + lowerB
16790 69 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28  its;.    if(   (
167a0 6c 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56  lowerBits == INV
167b0 41 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a  ALID_FILE_SIZE).
167c0 20 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74         && ((last
167d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
167e0 74 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52  tError())!=NO_ER
167f0 52 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46  ROR) ){.      pF
16800 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16810 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16820 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
16830 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
16840 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61  FSTAT, pFile->la
16850 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16870 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70  "winFileSize", p
16880 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
16890 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
168a0 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20   OSTRACE(("SIZE 
168b0 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25  file=%p, pSize=%
168c0 70 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20  p, *pSize=%lld, 
168d0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
168e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
168f0 53 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71  Size, *pSize, sq
16900 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
16910 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
16920 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49  .}../*.** LOCKFI
16930 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
16940 45 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64  ELY is undefined
16950 20 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73   on some Windows
16960 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66   systems..*/.#if
16970 6e 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41  ndef LOCKFILE_FA
16980 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23  IL_IMMEDIATELY.#
16990 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45   define LOCKFILE
169a0 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c  _FAIL_IMMEDIATEL
169b0 59 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  Y 1.#endif..#ifn
169c0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  def LOCKFILE_EXC
169d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65  LUSIVE_LOCK.# de
169e0 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58  fine LOCKFILE_EX
169f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23  CLUSIVE_LOCK 2.#
16a00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73  endif../*.** His
16a10 74 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74  torically, SQLit
16a20 65 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20  e has used both 
16a30 74 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64  the LockFile and
16a40 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63   LockFileEx func
16a50 74 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74  tions..** When t
16a60 68 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63  he LockFile func
16a70 74 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69  tion was used, i
16a80 74 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70  t was always exp
16a90 65 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a  ected to fail.**
16aa0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
16ab0 74 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e  the lock could n
16ac0 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20  ot be obtained. 
16ad0 20 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73   Also, it always
16ae0 20 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20   expected to.** 
16af0 6f 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73  obtain an exclus
16b00 69 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65  ive lock.  These
16b10 20 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20   flags are used 
16b20 77 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c  with the LockFil
16b30 65 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  eEx function.** 
16b40 61 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73  and reflect thos
16b50 65 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20  e expectations; 
16b60 74 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20  therefore, they 
16b70 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68  should not be ch
16b80 61 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  anged..*/.#ifnde
16b90 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  f SQLITE_LOCKFIL
16ba0 45 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65  E_FLAGS.# define
16bb0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
16bc0 5f 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49  _FLAGS   (LOCKFI
16bd0 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54  LE_FAIL_IMMEDIAT
16be0 45 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20  ELY | \.        
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49            LOCKFI
16c10 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
16c20 4b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  K).#endif../*.**
16c30 20 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69   Currently, SQLi
16c40 74 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74  te never calls t
16c50 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75  he LockFileEx fu
16c60 6e 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77  nction without w
16c70 61 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61  anting the.** ca
16c80 6c 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64  ll to fail immed
16c90 69 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f  iately if the lo
16ca0 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
16cb0 61 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ained..*/.#ifnde
16cc0 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  f SQLITE_LOCKFIL
16cd0 45 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69  EEX_FLAGS.# defi
16ce0 6e 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  ne SQLITE_LOCKFI
16cf0 4c 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b  LEEX_FLAGS (LOCK
16d00 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
16d10 41 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f  ATELY).#endif../
16d20 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
16d30 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44  eader lock..** D
16d40 69 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75  ifferent API rou
16d50 74 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64  tines are called
16d60 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
16d70 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69  ether or not thi
16d80 73 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72  s.** is Win9x or
16d90 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69   WinNT..*/.stati
16da0 63 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64  c int winGetRead
16db0 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46  Lock(winFile *pF
16dc0 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  ile){.  int res;
16dd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
16de0 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  D-LOCK file=%p, 
16df0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
16e00 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
16e10 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f  ktype));.  if( o
16e20 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53  sIsNT() ){.#if S
16e30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
16e40 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
16e50 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
16e60 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
16e70 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
16e80 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
16e90 6e 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  n32.    **      
16ea0 20 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e   API LockFileEx.
16eb0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  .    */.    res 
16ec0 3d 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28  = winceLockFile(
16ed0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
16ee0 44 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30  D_FIRST, 0, 1, 0
16ef0 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73  );.#else.    res
16f00 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
16f10 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
16f20 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
16f30 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  S, SHARED_FIRST,
16f40 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
16f50 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44            SHARED
16f60 5f 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69  _SIZE, 0);.#endi
16f70 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
16f80 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
16f90 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69  SI.  else{.    i
16fa0 6e 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74  nt lk;.    sqlit
16fb0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
16fc0 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a  zeof(lk), &lk);.
16fd0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
16fe0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f  dLockByte = (sho
16ff0 72 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66  rt)((lk & 0x7fff
17000 66 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49  ffff)%(SHARED_SI
17010 5a 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65  ZE - 1));.    re
17020 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
17030 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
17040 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
17050 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17060 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
17070 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72  IRST+pFile->shar
17080 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31  edLockByte, 0, 1
17090 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
170a0 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20  .  if( res == 0 
170b0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
170c0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
170d0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
170e0 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f  /* No need to lo
170f0 67 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c  g a failure to l
17100 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54  ock */.  }.  OST
17110 52 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b  RACE(("READ-LOCK
17120 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74   file=%p, result
17130 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
17140 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72  , res));.  retur
17150 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n res;.}../*.** 
17160 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a  Undo a readlock.
17170 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
17180 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28  nUnlockReadLock(
17190 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  winFile *pFile){
171a0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57  .  int res;.  DW
171b0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
171c0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d   OSTRACE(("READ-
171d0 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
171e0 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c  lock=%d\n", pFil
171f0 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
17200 6b 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f  ktype));.  if( o
17210 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72  sIsNT() ){.    r
17220 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  es = winUnlockFi
17230 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48  le(&pFile->h, SH
17240 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53  ARED_FIRST, 0, S
17250 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
17260 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
17270 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
17280 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73  .  else{.    res
17290 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
172a0 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52  (&pFile->h, SHAR
172b0 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e  ED_FIRST+pFile->
172c0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
172d0 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  0, 1, 0);.  }.#e
172e0 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d  ndif.  if( res==
172f0 30 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f  0 && ((lastErrno
17300 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17310 72 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f  r())!=ERROR_NOT_
17320 4c 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70  LOCKED) ){.    p
17330 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
17340 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  = lastErrno;.   
17350 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
17360 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
17370 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
17380 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
17390 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65      "winUnlockRe
173a0 61 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e  adLock", pFile->
173b0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53  zPath);.  }.  OS
173c0 54 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c  TRACE(("READ-UNL
173d0 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73  OCK file=%p, res
173e0 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ult=%d\n", pFile
173f0 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65  ->h, res));.  re
17400 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
17410 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
17420 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
17430 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
17440 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d  meter locktype -
17450 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
17460 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
17470 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
17480 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
17490 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
174a0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
174b0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
174c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
174d0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
174e0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
174f0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
17500 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
17510 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
17520 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
17530 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
17540 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
17550 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
17560 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
17570 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
17580 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
17590 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
175a0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
175b0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
175c0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
175d0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
175e0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
175f0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
17600 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
17610 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
17620 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
17630 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
17640 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
17650 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
17660 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
17670 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
17680 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
17690 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
176a0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
176b0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
176c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
176d0 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
176e0 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68  ease a lock.  Th
176f0 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f  e winUnlock() ro
17700 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20  utine.** erases 
17710 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63  all locks at onc
17720 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73  e and returns us
17730 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20   immediately to 
17740 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e  locking level 0.
17750 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f  .** It is not po
17760 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20  ssible to lower 
17770 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
17780 6c 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20  l one step at a 
17790 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75  time.  You.** mu
177a0 73 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74  st go straight t
177b0 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  o locking level 
177c0 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
177d0 20 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33   winLock(sqlite3
177e0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
177f0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
17800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
17810 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
17820 65 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e  e from subroutin
17830 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20  es */.  int res 
17840 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 1;           /
17850 2a 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69  * Result of a Wi
17860 6e 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20  ndows lock call 
17870 2a 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b  */.  int newLock
17880 74 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53  type;       /* S
17890 65 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  et pFile->lockty
178a0 70 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  pe to this value
178b0 20 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20   before exiting 
178c0 2a 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64  */.  int gotPend
178d0 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54  ingLock = 0;/* T
178e0 72 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72  rue if we acquir
178f0 65 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ed a PENDING loc
17900 6b 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20  k this time */. 
17910 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
17920 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
17930 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
17940 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20  o = NO_ERROR;.. 
17950 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
17960 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
17970 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c  CK file=%p, oldL
17980 6f 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c  ock=%d(%d), newL
17990 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
179a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
179b0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
179c0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
179d0 63 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65  ckByte, locktype
179e0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
179f0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
17a00 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
17a10 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
17a20 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
17a30 2a 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74  * OsFile, do not
17a40 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
17a50 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
17a60 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
17a70 20 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d   sqlite3OsEnterM
17a80 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
17a90 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
17aa0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
17ab0 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
17ac0 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
17ad0 43 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66  CE(("LOCK-HELD f
17ae0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
17af0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
17b00 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
17b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
17b20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f    /* Do not allo
17b30 77 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72  w any kind of wr
17b40 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite-lock on a re
17b50 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
17b60 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
17b70 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
17b80 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21  WINFILE_RDONLY)!
17b90 3d 30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d  =0 && locktype>=
17ba0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
17bb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17bc0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
17bd0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
17be0 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
17bf0 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
17c00 63 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ct.  */.  assert
17c10 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
17c20 65 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f  e!=NO_LOCK || lo
17c30 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
17c40 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
17c50 20 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49   locktype!=PENDI
17c60 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
17c70 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52  ert( locktype!=R
17c80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
17c90 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
17ca0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17cb0 0a 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50  .  /* Lock the P
17cc0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65  ENDING_LOCK byte
17cd0 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61   if we need to a
17ce0 63 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47  cquire a PENDING
17cf0 20 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20   lock or.  ** a 
17d00 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66  SHARED lock.  If
17d10 20 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e   we are acquirin
17d20 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  g a SHARED lock,
17d30 20 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   the acquisition
17d40 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e   of.  ** the PEN
17d50 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69  DING_LOCK byte i
17d60 73 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a  s temporary..  *
17d70 2f 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20  /.  newLocktype 
17d80 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
17d90 65 3b 0a 20 20 69 66 28 20 20 20 28 70 46 69 6c  e;.  if(   (pFil
17da0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f  e->locktype==NO_
17db0 4c 4f 43 4b 29 0a 20 20 20 20 20 7c 7c 20 28 20  LOCK).     || ( 
17dc0 20 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43    (locktype==EXC
17dd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 0a 20 20 20  LUSIVE_LOCK).   
17de0 20 20 20 20 20 20 26 26 20 28 70 46 69 6c 65 2d        && (pFile-
17df0 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45 52  >locktype==RESER
17e00 56 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  VED_LOCK)).  ){.
17e10 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
17e20 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
17e30 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 77 69  ->0 && (res = wi
17e40 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
17e50 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
17e60 46 49 4c 45 5f 46 4c 41 47 53 2c 0a 20 20 20 20  FILE_FLAGS,.    
17e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
17ea0 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
17eb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 79 20  ){.      /* Try 
17ec0 33 20 74 69 6d 65 73 20 74 6f 20 67 65 74 20 74  3 times to get t
17ed0 68 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e  he pending lock.
17ee0 20 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64    This is needed
17ef0 20 74 6f 20 77 6f 72 6b 0a 20 20 20 20 20 20 2a   to work.      *
17f00 2a 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  * around problem
17f10 73 20 63 61 75 73 65 64 20 62 79 20 69 6e 64 65  s caused by inde
17f20 78 69 6e 67 20 61 6e 64 2f 6f 72 20 61 6e 74 69  xing and/or anti
17f30 2d 76 69 72 75 73 20 73 6f 66 74 77 61 72 65 20  -virus software 
17f40 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 57 69 6e 64  on.      ** Wind
17f50 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a 20 20 20  ows systems..   
17f60 20 20 20 2a 2a 20 49 66 20 79 6f 75 20 61 72 65     ** If you are
17f70 20 75 73 69 6e 67 20 74 68 69 73 20 63 6f 64 65   using this code
17f80 20 61 73 20 61 20 6d 6f 64 65 6c 20 66 6f 72 20   as a model for 
17f90 61 6c 74 65 72 6e 61 74 69 76 65 20 56 46 53 65  alternative VFSe
17fa0 73 2c 20 64 6f 20 6e 6f 74 0a 20 20 20 20 20 20  s, do not.      
17fb0 2a 2a 20 63 6f 70 79 20 74 68 69 73 20 72 65 74  ** copy this ret
17fc0 72 79 20 6c 6f 67 69 63 2e 20 20 49 74 20 69 73  ry logic.  It is
17fd0 20 61 20 68 61 63 6b 20 69 6e 74 65 6e 64 65 64   a hack intended
17fe0 20 66 6f 72 20 57 69 6e 64 6f 77 73 20 6f 6e 6c   for Windows onl
17ff0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
18000 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18010 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18020 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
18030 4c 4f 43 4b 2d 50 45 4e 44 49 4e 47 2d 46 41 49  LOCK-PENDING-FAI
18040 4c 20 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74  L file=%p, count
18050 3d 25 64 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e  =%d, result=%d\n
18060 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
18070 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c    pFile->h, cnt,
18080 20 72 65 73 29 29 3b 0a 20 20 20 20 20 20 69 66   res));.      if
18090 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
180a0 4f 52 5f 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  OR_INVALID_HANDL
180b0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  E ){.        pFi
180c0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
180d0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
180e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
180f0 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
18100 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
18110 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20  K-FAIL file=%p, 
18120 63 6f 75 6e 74 3d 25 64 2c 20 72 63 3d 25 73 5c  count=%d, rc=%s\
18130 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18140 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 63       pFile->h, c
18150 6e 74 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  nt, sqlite3ErrNa
18160 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20  me(rc)));.      
18170 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18180 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
18190 6e 74 20 29 20 73 71 6c 69 74 65 33 5f 77 69 6e  nt ) sqlite3_win
181a0 33 32 5f 73 6c 65 65 70 28 31 29 3b 0a 20 20 20  32_sleep(1);.   
181b0 20 7d 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e   }.    gotPendin
181c0 67 4c 6f 63 6b 20 3d 20 72 65 73 3b 0a 20 20 20  gLock = res;.   
181d0 20 69 66 28 20 21 72 65 73 20 29 7b 0a 20 20 20   if( !res ){.   
181e0 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
181f0 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
18200 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
18210 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
18220 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
18230 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
18240 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
18250 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
18260 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
18270 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
18280 73 20 3d 20 77 69 6e 47 65 74 52 65 61 64 4c 6f  s = winGetReadLo
18290 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  ck(pFile);.    i
182a0 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
182b0 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48  newLocktype = SH
182c0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  ARED_LOCK;.    }
182d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 61 73 74  else{.      last
182e0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
182f0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
18300 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18310 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  e a RESERVED loc
18320 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
18330 6b 74 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f  ktype==RESERVED_
18340 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20  LOCK && res ){. 
18350 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
18360 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ->locktype==SHAR
18370 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  ED_LOCK );.    r
18380 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  es = winLockFile
18390 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49  (&pFile->h, SQLI
183a0 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47  TE_LOCKFILE_FLAG
183b0 53 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  S, RESERVED_BYTE
183c0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
183d0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
183e0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 52   newLocktype = R
183f0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b 0a 20 20  ESERVED_LOCK;.  
18400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
18410 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
18420 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
18430 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71   }.  }..  /* Acq
18440 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20 6c  uire a PENDING l
18450 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
18460 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
18470 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
18480 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
18490 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
184a0 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
184b0 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Lock = 0;.  }.. 
184c0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
184d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 0a 20 20  XCLUSIVE lock.  
184e0 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
184f0 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
18500 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
18510 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
18520 6f 63 6b 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  ocktype>=SHARED_
18530 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73 20  LOCK );.    res 
18540 3d 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c  = winUnlockReadL
18550 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
18560 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c  res = winLockFil
18570 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c  e(&pFile->h, SQL
18580 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41  ITE_LOCKFILE_FLA
18590 47 53 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  GS, SHARED_FIRST
185a0 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
185b0 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
185c0 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
185d0 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
185e0 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 45   newLocktype = E
185f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
18600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18610 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
18620 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
18630 20 20 20 20 77 69 6e 47 65 74 52 65 61 64 4c 6f      winGetReadLo
18640 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  ck(pFile);.    }
18650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65  .  }..  /* If we
18660 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 61 20 50   are holding a P
18670 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 61 74  ENDING lock that
18680 20 6f 75 67 68 74 20 74 6f 20 62 65 20 72 65 6c   ought to be rel
18690 65 61 73 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a  eased, then.  **
186a0 20 72 65 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e   release it now.
186b0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 50  .  */.  if( gotP
186c0 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26 20 6c 6f  endingLock && lo
186d0 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c  cktype==SHARED_L
186e0 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  OCK ){.    winUn
186f0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
18700 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  >h, PENDING_BYTE
18710 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
18720 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
18730 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 6c 6f   state of the lo
18740 63 6b 20 68 61 73 20 68 65 6c 64 20 69 6e 20 74  ck has held in t
18750 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18760 6f 72 20 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74  or then.  ** ret
18770 75 72 6e 20 74 68 65 20 61 70 70 72 6f 70 72 69  urn the appropri
18780 61 74 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  ate result code.
18790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 65 73 20  .  */.  if( res 
187a0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
187b0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
187c0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
187d0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
187e0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
187f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 4f 53 54 52  E_BUSY;.    OSTR
18800 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
18810 66 69 6c 65 3d 25 70 2c 20 77 61 6e 74 65 64 3d  file=%p, wanted=
18820 25 64 2c 20 67 6f 74 3d 25 64 5c 6e 22 2c 0a 20  %d, got=%d\n",. 
18830 20 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c              pFil
18840 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20  e->h, locktype, 
18850 6e 65 77 4c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  newLocktype));. 
18860 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
18870 74 79 70 65 20 3d 20 28 75 38 29 6e 65 77 4c 6f  type = (u8)newLo
18880 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43  cktype;.  OSTRAC
18890 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
188a0 2c 20 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73  , lock=%d, rc=%s
188b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
188c0 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d  pFile->h, pFile-
188d0 3e 6c 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74  >locktype, sqlit
188e0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
188f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18900 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
18910 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
18920 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
18930 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
18940 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
18950 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
18960 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
18970 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
18980 6b 20 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72  k is held, retur
18990 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f  n.** non-zero, o
189a0 74 68 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a  therwise zero..*
189b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
189c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
189d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
189e0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
189f0 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
18a00 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18a10 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 0a   (winFile*)id;..
18a20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18a30 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
18a40 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
18a50 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 4f  RVEDLOCK; );.  O
18a60 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57 52  STRACE(("TEST-WR
18a70 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 70  -LOCK file=%p, p
18a80 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 20 70 46  ResOut=%p\n", pF
18a90 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 29  ile->h, pResOut)
18aa0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  );..  assert( id
18ab0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
18ac0 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45  le->locktype>=RE
18ad0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SERVED_LOCK ){. 
18ae0 20 20 20 72 65 73 20 3d 20 31 3b 0a 20 20 20 20     res = 1;.    
18af0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
18b00 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
18b10 72 65 73 75 6c 74 3d 25 64 20 28 6c 6f 63 61 6c  result=%d (local
18b20 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
18b30 72 65 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  res));.  }else{.
18b40 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
18b50 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
18b60 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
18b70 45 58 5f 46 4c 41 47 53 2c 52 45 53 45 52 56 45  EX_FLAGS,RESERVE
18b80 44 5f 42 59 54 45 2c 30 2c 31 2c 30 29 3b 0a 20  D_BYTE,0,1,0);. 
18b90 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
18ba0 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
18bb0 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53  e(&pFile->h, RES
18bc0 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31  ERVED_BYTE, 0, 1
18bd0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
18be0 72 65 73 20 3d 20 21 72 65 73 3b 0a 20 20 20 20  res = !res;.    
18bf0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
18c00 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
18c10 72 65 73 75 6c 74 3d 25 64 20 28 72 65 6d 6f 74  result=%d (remot
18c20 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  e)\n", pFile->h,
18c30 20 72 65 73 29 29 3b 0a 20 20 7d 0a 20 20 2a 70   res));.  }.  *p
18c40 52 65 73 4f 75 74 20 3d 20 72 65 73 3b 0a 20 20  ResOut = res;.  
18c50 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 2d 57  OSTRACE(("TEST-W
18c60 52 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  R-LOCK file=%p, 
18c70 70 52 65 73 4f 75 74 3d 25 70 2c 20 2a 70 52 65  pResOut=%p, *pRe
18c80 73 4f 75 74 3d 25 64 2c 20 72 63 3d 53 51 4c 49  sOut=%d, rc=SQLI
18c90 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
18ca0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
18cb0 52 65 73 4f 75 74 2c 20 2a 70 52 65 73 4f 75 74  ResOut, *pResOut
18cc0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
18cd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
18ce0 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
18cf0 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
18d00 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20 74   descriptor id t
18d10 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f 63  o locktype.  loc
18d20 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62 65  ktype.** must be
18d30 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18d40 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18d50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
18d60 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
18d70 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
18d80 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
18d90 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
18da0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
18db0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
18dc0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
18dd0 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  ..**.** It is no
18de0 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  t possible for t
18df0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 66  his routine to f
18e00 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  ail if the secon
18e10 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
18e20 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74 68   NO_LOCK.  If th
18e30 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
18e40 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b  t is SHARED_LOCK
18e50 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
18e60 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74 75  ne.** might retu
18e70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
18e80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
18e90 69 6e 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  inUnlock(sqlite3
18ea0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c  _file *id, int l
18eb0 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
18ec0 74 79 70 65 3b 0a 20 20 77 69 6e 46 69 6c 65 20  type;.  winFile 
18ed0 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
18ee0 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
18ef0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
18f00 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
18f10 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63  );.  assert( loc
18f20 6b 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f  ktype<=SHARED_LO
18f30 43 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  CK );.  OSTRACE(
18f40 28 22 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  ("UNLOCK file=%p
18f50 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
18f60 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
18f70 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18f80 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
18f90 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
18fa0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
18fb0 63 6b 74 79 70 65 29 29 3b 0a 20 20 74 79 70 65  cktype));.  type
18fc0 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79   = pFile->lockty
18fd0 70 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d  pe;.  if( type>=
18fe0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
18ff0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46  {.    winUnlockF
19000 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53  ile(&pFile->h, S
19010 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20  HARED_FIRST, 0, 
19020 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
19030 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
19040 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
19050 26 20 21 77 69 6e 47 65 74 52 65 61 64 4c 6f 63  & !winGetReadLoc
19060 6b 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  k(pFile) ){.    
19070 20 20 2f 2a 20 54 68 69 73 20 73 68 6f 75 6c 64    /* This should
19080 20 6e 65 76 65 72 20 68 61 70 70 65 6e 2e 20 20   never happen.  
19090 57 65 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73  We should always
190a0 20 62 65 20 61 62 6c 65 20 74 6f 0a 20 20 20 20   be able to.    
190b0 20 20 2a 2a 20 72 65 61 63 71 75 69 72 65 20 74    ** reacquire t
190c0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a  he read lock */.
190d0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
190e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
190f0 45 52 52 5f 55 4e 4c 4f 43 4b 2c 20 6f 73 47 65  ERR_UNLOCK, osGe
19100 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
19110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19120 20 20 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 22       "winUnlock"
19130 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
19140 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19150 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
19160 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
19170 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
19180 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59  ->h, RESERVED_BY
19190 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
191a0 7d 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  }.  if( locktype
191b0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 26 26 20 74 79 70  ==NO_LOCK && typ
191c0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
191d0 7b 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 52  {.    winUnlockR
191e0 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a  eadLock(pFile);.
191f0 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
19200 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
19210 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
19220 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
19230 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
19240 20 30 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65   0);.  }.  pFile
19250 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
19260 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 4f 53 54  )locktype;.  OST
19270 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66 69  RACE(("UNLOCK fi
19280 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20  le=%p, lock=%d, 
19290 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
192a0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
192b0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
192c0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
192d0 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
192e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  c;.}../*.** If *
192f0 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c  pArg is initiall
19300 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
19310 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
19320 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
19330 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
19340 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
19350 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
19360 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
19370 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
19380 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
19390 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
193a0 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
193b0 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
193c0 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
193d0 63 20 76 6f 69 64 20 77 69 6e 4d 6f 64 65 42 69  c void winModeBi
193e0 74 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65  t(winFile *pFile
193f0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
19400 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
19410 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
19420 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
19430 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
19440 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
19450 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
19460 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
19470 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
19480 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
19490 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
194a0 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
194b0 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
194c0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56 46 53  eferences to VFS
194d0 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64 73 20   helper methods 
194e0 75 73 65 64 20 66 6f 72 20 74 65 6d 70 6f 72 61  used for tempora
194f0 72 79 20 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74  ry files */.stat
19500 69 63 20 69 6e 74 20 77 69 6e 47 65 74 54 65 6d  ic int winGetTem
19510 70 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  pname(sqlite3_vf
19520 73 20 2a 2c 20 63 68 61 72 20 2a 2a 29 3b 0a 73  s *, char **);.s
19530 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 73 44  tatic int winIsD
19540 69 72 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29  ir(const void *)
19550 3b 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77 69  ;.static BOOL wi
19560 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
19570 64 43 6f 6c 6f 6e 28 63 6f 6e 73 74 20 63 68 61  dColon(const cha
19580 72 20 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  r *);../*.** Con
19590 74 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f  trol and query o
195a0 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
195b0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
195c0 63 20 69 6e 74 20 77 69 6e 46 69 6c 65 43 6f 6e  c int winFileCon
195d0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
195e0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
195f0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 77 69  oid *pArg){.  wi
19600 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
19610 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f  winFile*)id;.  O
19620 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
19630 69 6c 65 3d 25 70 2c 20 6f 70 3d 25 64 2c 20 70  ile=%p, op=%d, p
19640 41 72 67 3d 25 70 5c 6e 22 2c 20 70 46 69 6c 65  Arg=%p\n", pFile
19650 2d 3e 68 2c 20 6f 70 2c 20 70 41 72 67 29 29 3b  ->h, op, pArg));
19660 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
19670 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19680 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
19690 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a  : {.      *(int*
196a0 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c  )pArg = pFile->l
196b0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 4f  ocktype;.      O
196c0 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66  STRACE(("FCNTL f
196d0 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
196e0 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
196f0 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
19700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
19710 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
19720 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b  TE_LAST_ERRNO: {
19730 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
19740 72 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d  rg = (int)pFile-
19750 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
19760 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19770 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
19780 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
19790 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
197a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
197b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
197c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
197d0 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
197e0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
197f0 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
19800 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
19810 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19820 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
19830 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
19840 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19850 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
19860 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
19870 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20  IZE_HINT: {.    
19880 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
19890 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  hunk>0 ){.      
198a0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
198b0 6f 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69  oldSz;.        i
198c0 6e 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53  nt rc = winFileS
198d0 69 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b  ize(id, &oldSz);
198e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
198f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19900 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
19910 69 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28  int64 newSz = *(
19920 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70  sqlite3_int64*)p
19930 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Arg;.          i
19940 66 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29  f( newSz>oldSz )
19950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69  {.            Si
19960 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
19970 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
19980 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e      rc = winTrun
19990 63 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b  cate(id, newSz);
199a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
199b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
199c0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(0);.         
199d0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
199e0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
199f0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
19a00 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
19a10 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
19a20 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20  (rc)));.        
19a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
19a40 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
19a50 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19a60 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
19a70 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
19a80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19a90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
19aa0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
19ab0 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
19ac0 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
19ad0 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
19ae0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
19af0 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
19b00 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
19b10 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  L file=%p, rc=SQ
19b20 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
19b30 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
19b40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19b50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
19b60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
19b70 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
19b80 20 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65   {.      winMode
19b90 42 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49  Bit(pFile, WINFI
19ba0 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
19bb0 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Arg);.      OSTR
19bc0 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
19bd0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
19be0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
19bf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
19c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
19c10 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19c20 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
19c30 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
19c40 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
19c50 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
19c60 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
19c70 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
19c80 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
19c90 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
19ca0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
19cb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19cc0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
19cd0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
19ce0 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
19cf0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61  : {.      int *a
19d00 20 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20   = (int*)pArg;. 
19d10 20 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20       if( a[0]>0 
19d20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f  ){.        winIo
19d30 65 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b  errRetry = a[0];
19d40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19d50 20 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e        a[0] = win
19d60 49 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20  IoerrRetry;.    
19d70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b    }.      if( a[
19d80 31 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1]>0 ){.        
19d90 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
19da0 61 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20  ay = a[1];.     
19db0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19dc0 61 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52  a[1] = winIoerrR
19dd0 65 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20  etryDelay;.     
19de0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
19df0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
19e00 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
19e10 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
19e20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19e30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
19e40 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
19e50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19e60 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f  FCNTL_WIN32_SET_
19e70 48 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20  HANDLE: {.      
19e80 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20  LPHANDLE phFile 
19e90 3d 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67  = (LPHANDLE)pArg
19ea0 3b 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68  ;.      HANDLE h
19eb0 4f 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d  OldFile = pFile-
19ec0 3e 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  >h;.      pFile-
19ed0 3e 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20  >h = *phFile;.  
19ee0 20 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f      *phFile = hO
19ef0 6c 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53  ldFile;.      OS
19f00 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c  TRACE(("FCNTL ol
19f10 64 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c  dFile=%p, newFil
19f20 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
19f30 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  OK\n",.         
19f40 20 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20        hOldFile, 
19f50 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20  pFile->h));.    
19f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19f70 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
19f80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19f90 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
19fa0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  AME: {.      cha
19fb0 72 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20  r *zTFile = 0;. 
19fc0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69       int rc = wi
19fd0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69  nGetTempname(pFi
19fe0 6c 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c  le->pVfs, &zTFil
19ff0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
1a000 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a010 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
1a020 70 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20  pArg = zTFile;. 
1a030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54       }.      OST
1a040 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1a050 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%p, rc=%s\n", 
1a060 70 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65  pFile->h, sqlite
1a070 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1a080 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a090 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
1a0a0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1a0b0 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
1a0c0 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
1a0d0 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
1a0e0 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
1a0f0 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
1a100 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a110 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1a120 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
1a130 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
1a140 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1a150 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
1a160 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
1a170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1a180 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
1a190 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
1a1a0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
1a1b0 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
1a1c0 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
1a1d0 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
1a1e0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
1a1f0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
1a200 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
1a210 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
1a220 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
1a230 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
1a240 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28     winUnmapfile(
1a250 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
1a260 20 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c    rc = winMapfil
1a270 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
1a280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a290 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
1a2a0 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72  FCNTL file=%p, r
1a2b0 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  c=%s\n", pFile->
1a2c0 68 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  h, sqlite3ErrNam
1a2d0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
1a2e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a2f0 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54  #endif.  }.  OST
1a300 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c  RACE(("FCNTL fil
1a310 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
1a320 4e 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69  NOTFOUND\n", pFi
1a330 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72  le->h));.  retur
1a340 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
1a350 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
1a360 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
1a370 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
1a380 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
1a390 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
1a3a0 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
1a3b0 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1a3c0 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
1a3d0 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
1a3e0 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
1a3f0 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
1a400 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
1a410 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
1a420 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
1a430 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
1a440 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
1a450 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
1a460 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
1a470 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
1a480 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
1a490 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
1a4a0 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
1a4b0 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
1a4c0 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
1a4d0 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
1a4e0 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
1a4f0 20 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73   winSectorSize(s
1a500 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1a510 7b 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20  {.  (void)id;.  
1a520 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45  return SQLITE_DE
1a530 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
1a540 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  E;.}../*.** Retu
1a550 72 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64  rn a vector of d
1a560 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
1a570 73 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stics..*/.static
1a580 20 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68   int winDeviceCh
1a590 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1a5a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1a5b0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20  .  winFile *p = 
1a5c0 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (winFile*)id;.  
1a5d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1a5e0 43 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f  CAP_UNDELETABLE_
1a5f0 57 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20  WHEN_OPEN |.    
1a600 20 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c       ((p->ctrlFl
1a610 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53  ags & WINFILE_PS
1a620 4f 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50  OW)?SQLITE_IOCAP
1a630 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
1a640 52 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  RITE:0);.}../*.*
1a650 2a 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f  * Windows will o
1a660 6e 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61  nly let you crea
1a670 74 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70  te file view map
1a680 70 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f  pings.** on allo
1a690 63 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e  cation size gran
1a6a0 75 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69  ularity boundari
1a6b0 65 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71  es..** During sq
1a6c0 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20  lite3_os_init() 
1a6d0 77 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65  we do a GetSyste
1a6e0 6d 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65  mInfo().** to ge
1a6f0 74 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74  t the granularit
1a700 79 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  y size..*/.stati
1a710 63 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69  c SYSTEM_INFO wi
1a720 6e 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64  nSysInfo;..#ifnd
1a730 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
1a740 41 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  AL../*.** Helper
1a750 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
1a760 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
1a770 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
1a780 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
1a790 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
1a7a0 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
1a7b0 20 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a   winLockInfo obj
1a7c0 65 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20  ects used by.** 
1a7d0 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
1a7e0 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73  f which may be s
1a7f0 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c  hared by multipl
1a800 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a  e threads..**.**
1a810 20 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d   Function winShm
1a820 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
1a830 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
1a840 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
1a850 6d 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64  mutex.** is held
1a860 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
1a870 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1a880 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
1a890 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a  rt of assert().*
1a8a0 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e  * statements. e.
1a8b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68  g..**.**   winSh
1a8c0 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  mEnterMutex().**
1a8d0 20 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e       assert( win
1a8e0 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29  ShmMutexHeld() )
1a8f0 3b 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61  ;.**   winShmLea
1a900 76 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61  veMutex().*/.sta
1a910 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45  tic void winShmE
1a920 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
1a930 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1a940 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
1a950 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
1a960 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53  MUTEX_STATIC_VFS
1a970 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  1));.}.static vo
1a980 69 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75  id winShmLeaveMu
1a990 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
1a9a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a9b0 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
1a9c0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1a9d0 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
1a9e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
1a9f0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1aa00 6d 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  mMutexHeld(void)
1aa10 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
1aa20 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
1aa30 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1aa40 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1aa50 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
1aa60 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  endif../*.** Obj
1aa70 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
1aa80 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66  esent a single f
1aa90 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d  ile opened and m
1aaa0 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64  mapped to provid
1aab0 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f  e.** shared memo
1aac0 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70  ry.  When multip
1aad0 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
1aae0 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
1aaf0 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79  e.** log-summary
1ab00 2c 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61  , each thread ha
1ab10 73 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c  s its own winFil
1ab20 65 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  e object, but th
1ab30 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20  ey all.** point 
1ab40 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
1ab50 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
1ab60 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
1ab70 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f  ords, each.** lo
1ab80 67 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65  g-summary is ope
1ab90 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65  ned only once pe
1aba0 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  r process..**.**
1abb0 20 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64   winShmMutexHeld
1abc0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
1abd0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
1abe0 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
1abf0 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
1ac00 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
1ac10 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
1ac20 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
1ac30 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20  **      nRef.** 
1ac40 20 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a       pNext.**.**
1ac50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
1ac60 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
1ac70 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
1ac80 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
1ac90 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  .**.**      fid.
1aca0 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
1acb0 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77  e.**.** Either w
1acc0 69 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20  inShmNode.mutex 
1acd0 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20  must be held or 
1ace0 77 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d  winShmNode.nRef=
1acf0 3d 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d  =0 and.** winShm
1ad00 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
1ad10 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
1ad20 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
1ad30 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
1ad40 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
1ad50 2e 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ..**.*/.struct w
1ad60 69 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71  inShmNode {.  sq
1ad70 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
1ad80 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
1ad90 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
1ada0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
1adb0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
1adc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
1add0 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
1ade0 20 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20   winFile hFile; 
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ae00 69 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ile handle from 
1ae10 77 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e  winOpen */..  in
1ae20 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20  t szRegion;     
1ae30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1ae40 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   of shared-memor
1ae50 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  y regions */.  i
1ae60 6e 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20  nt nRegion;     
1ae70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ae80 65 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67  e of array apReg
1ae90 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
1aea0 53 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20  ShmRegion {.    
1aeb0 48 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20  HANDLE hMap;    
1aec0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1aed0 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65   handle from Cre
1aee0 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a  ateFileMapping *
1aef0 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70  /.    void *pMap
1af00 3b 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a  ;.  } *aRegion;.
1af10 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
1af20 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o;           /* 
1af30 54 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e  The Windows errn
1af40 6f 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20  o from the last 
1af50 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  I/O error */..  
1af60 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
1af70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1af80 6d 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f  mber of winShm o
1af90 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
1afa0 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e  to this */.  win
1afb0 53 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20  Shm *pFirst;    
1afc0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77          /* All w
1afd0 69 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  inShm objects po
1afe0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
1aff0 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  /.  winShmNode *
1b000 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f  pNext;         /
1b010 2a 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f  * Next in list o
1b020 66 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65  f all winShmNode
1b030 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20   objects */.#if 
1b040 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1b050 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1b060 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f  (SQLITE_HAVE_OS_
1b070 54 52 41 43 45 29 0a 20 20 75 38 20 6e 65 78 74  TRACE).  u8 next
1b080 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
1b090 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
1b0a0 6c 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20  lable winShm.id 
1b0b0 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
1b0c0 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62  };../*.** A glob
1b0d0 61 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20  al array of all 
1b0e0 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1b0f0 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69  ts..**.** The wi
1b100 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20  nShmMutexHeld() 
1b110 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69  must be true whi
1b120 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
1b130 69 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e  iting this list.
1b140 0a 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68  .*/.static winSh
1b150 6d 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64  mNode *winShmNod
1b160 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
1b170 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
1b180 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
1b190 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
1b1a0 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
1b1b0 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
1b1c0 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
1b1d0 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
1b1e0 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
1b1f0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
1b200 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
1b210 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
1b220 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
1b230 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
1b240 2a 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d  *    winShm.pShm
1b250 4e 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68  Node.**    winSh
1b260 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
1b270 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
1b280 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
1b290 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
1b2a0 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20  ->mutex must be 
1b2b0 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63  held.** while ac
1b2c0 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64  cessing any read
1b2d0 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a  /write fields..*
1b2e0 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20  /.struct winShm 
1b2f0 7b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  {.  winShmNode *
1b300 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f  pShmNode;      /
1b310 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
1b320 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65   winShmNode obje
1b330 63 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ct */.  winShm *
1b340 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1b350 20 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68     /* Next winSh
1b360 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
1b370 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  winShmNode */.  
1b380 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20  u8 hasMutex;    
1b390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
1b3a0 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68  ue if holding th
1b3b0 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74  e winShmNode mut
1b3c0 65 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  ex */.  u16 shar
1b3d0 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
1b3e0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
1b3f0 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
1b400 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
1b410 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1b420 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
1b430 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
1b440 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
1b450 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1b460 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
1b470 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20  AVE_OS_TRACE).  
1b480 75 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20  u8 id;          
1b490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64             /* Id
1b4a0 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   of this connect
1b4b0 69 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e  ion with its win
1b4c0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69  ShmNode */.#endi
1b4d0 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  f.};../*.** Cons
1b4e0 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
1b4f0 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
1b500 65 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20  e WIN_SHM_BASE  
1b510 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
1b520 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
1b530 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
1b540 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
1b550 57 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28  WIN_SHM_DMS    (
1b560 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  WIN_SHM_BASE+SQL
1b570 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
1b580 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
1b590 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
1b5a0 79 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  y advisory locks
1b5b0 20 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73   for all n bytes
1b5c0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66   beginning at of
1b5d0 73 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f  st..*/.#define _
1b5e0 53 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65  SHM_UNLCK  1.#de
1b5f0 66 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20  fine _SHM_RDLCK 
1b600 20 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f   2.#define _SHM_
1b610 57 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20  WRLCK  3.static 
1b620 69 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d  int winShmSystem
1b630 4c 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f  Lock(.  winShmNo
1b640 64 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a  de *pFile,    /*
1b650 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
1b660 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
1b670 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
1b680 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70  */.  int lockTyp
1b690 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53  e,         /* _S
1b6a0 48 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52  HM_UNLCK, _SHM_R
1b6b0 44 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52  DLCK, or _SHM_WR
1b6c0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
1b6d0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
1b6e0 2a 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * Offset to firs
1b6f0 74 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63  t byte to be loc
1b700 6b 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a  ked/unlocked */.
1b710 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20    int nByte     
1b720 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b730 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f  r of bytes to lo
1b740 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a  ck or unlock */.
1b750 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1b760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1b770 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c  sult code form L
1b780 6f 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  ock/UnlockFileEx
1b790 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
1b7a0 73 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d  ss to the winShm
1b7b0 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73  Node object is s
1b7c0 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65  erialized by the
1b7d0 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73   caller */.  ass
1b7e0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b7f0 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  ex_held(pFile->m
1b800 75 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e  utex) || pFile->
1b810 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53  nRef==0 );..  OS
1b820 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1b830 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25   file=%p, lock=%
1b840 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69  d, offset=%d, si
1b850 7a 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ze=%d\n",.      
1b860 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c       pFile->hFil
1b870 65 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f  e.h, lockType, o
1b880 66 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20  fst, nByte));.. 
1b890 20 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75   /* Release/Acqu
1b8a0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
1b8b0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  evel lock */.  i
1b8c0 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48  f( lockType==_SH
1b8d0 4d 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72  M_UNLCK ){.    r
1b8e0 63 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  c = winUnlockFil
1b8f0 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e  e(&pFile->hFile.
1b900 68 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74  h, ofst, 0, nByt
1b910 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 0);.  }else{.
1b920 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
1b930 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61  e the locking pa
1b940 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20  rameters */.    
1b950 44 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20  DWORD dwFlags = 
1b960 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
1b970 4d 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69  MEDIATELY;.    i
1b980 66 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f  f( lockType == _
1b990 53 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c  SHM_WRLCK ) dwFl
1b9a0 61 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f  ags |= LOCKFILE_
1b9b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a  EXCLUSIVE_LOCK;.
1b9c0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b      rc = winLock
1b9d0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69  File(&pFile->hFi
1b9e0 6c 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f  le.h, dwFlags, o
1b9f0 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1ba00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
1ba10 21 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  != 0 ){.    rc =
1ba20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
1ba30 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
1ba40 6c 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47  lastErrno =  osG
1ba50 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1ba60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1ba70 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52  USY;.  }..  OSTR
1ba80 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66  ACE(("SHM-LOCK f
1ba90 69 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c  ile=%p, func=%s,
1baa0 20 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25   errno=%lu, rc=%
1bab0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1bac0 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1bad0 20 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53   (lockType == _S
1bae0 48 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e  HM_UNLCK) ? "win
1baf0 55 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20  UnlockFile" :.  
1bb00 20 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63           "winLoc
1bb10 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c  kFile", pFile->l
1bb20 61 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65  astErrno, sqlite
1bb30 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
1bb40 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bb50 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
1bb60 72 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65  rences to VFS me
1bb70 74 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  thods */.static 
1bb80 69 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69  int winOpen(sqli
1bb90 74 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63  te3_vfs*,const c
1bba0 68 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c  har*,sqlite3_fil
1bbb0 65 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74  e*,int,int*);.st
1bbc0 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
1bbd0 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  te(sqlite3_vfs *
1bbe0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  ,const char*,int
1bbf0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20  );../*.** Purge 
1bc00 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69  the winShmNodeLi
1bc10 73 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65  st list of all e
1bc20 6e 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53  ntries with winS
1bc30 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
1bc40 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
1bc50 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
1bc60 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
1bc70 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
1bc80 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
1bc90 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
1bca0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
1bcb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
1bcc0 6e 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65  nShmPurge(sqlite
1bcd0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
1bce0 20 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20   deleteFlag){.  
1bcf0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b  winShmNode **pp;
1bd00 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1bd10 3b 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53  ;.  assert( winS
1bd20 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
1bd30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
1bd40 2d 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20  -PURGE pid=%lu, 
1bd50 64 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22  deleteFlag=%d\n"
1bd60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
1bd70 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1bd80 49 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67  Id(), deleteFlag
1bd90 29 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53  ));.  pp = &winS
1bda0 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68  hmNodeList;.  wh
1bdb0 69 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d  ile( (p = *pp)!=
1bdc0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  0 ){.    if( p->
1bdd0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
1bde0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66   int i;.      if
1bdf0 28 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71  ( p->mutex ){ sq
1be00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
1be10 28 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20  (p->mutex); }.  
1be20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1be30 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b  ->nRegion; i++){
1be40 0a 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52  .        BOOL bR
1be50 63 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f  c = osUnmapViewO
1be60 66 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e  fFile(p->aRegion
1be70 5b 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20  [i].pMap);.     
1be80 20 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d     OSTRACE(("SHM
1be90 2d 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64  -PURGE-UNMAP pid
1bea0 3d 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c  =%lu, region=%d,
1beb0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
1bec0 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
1bed0 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1bee0 64 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f  d(), i, bRc ? "o
1bef0 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1bf00 0a 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f  .        UNUSED_
1bf10 56 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62  VARIABLE_VALUE(b
1bf20 52 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63  Rc);.        bRc
1bf30 20 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65   = osCloseHandle
1bf40 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68  (p->aRegion[i].h
1bf50 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53  Map);.        OS
1bf60 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47  TRACE(("SHM-PURG
1bf70 45 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c  E-CLOSE pid=%lu,
1bf80 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25   region=%d, rc=%
1bf90 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1bfa0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
1bfb0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1bfc0 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20  i, bRc ? "ok" : 
1bfd0 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20  "failed"));.    
1bfe0 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41      UNUSED_VARIA
1bff0 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a  BLE_VALUE(bRc);.
1c000 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c010 28 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55  ( p->hFile.h!=NU
1c020 4c 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68  LL && p->hFile.h
1c030 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
1c040 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
1c050 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1c060 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1c070 20 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71      winClose((sq
1c080 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d  lite3_file *)&p-
1c090 3e 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  >hFile);.       
1c0a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1c0b0 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1c0c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
1c0d0 65 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20  eteFlag ){.     
1c0e0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1c0f0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1c100 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
1c110 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
1c120 0a 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65  .        winDele
1c130 74 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c  te(pVfs, p->zFil
1c140 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  ename, 0);.     
1c150 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
1c160 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1c170 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1c180 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1c190 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
1c1a0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
1c1b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c1c0 70 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20  p->aRegion);.   
1c1d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c1e0 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
1c1f0 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
1c200 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
1c210 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65  ../*.** Open the
1c220 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
1c230 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
1c240 69 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c  ith database fil
1c250 65 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57  e pDbFd..**.** W
1c260 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
1c270 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
1c280 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
1c290 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
1c2a0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
1c2b0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
1c2c0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
1c2d0 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
1c2e0 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
1c2f0 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
1c300 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1c310 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
1c320 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
1c330 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
1c340 6e 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64  nt winOpenShared
1c350 4d 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a  Memory(winFile *
1c360 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
1c370 20 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20   winShm *p;     
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c390 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
1c3a0 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
1c3b0 20 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f   struct winShmNo
1c3c0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30  de *pShmNode = 0
1c3d0 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72  ;   /* The under
1c3e0 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69  lying mmapped fi
1c3f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
1c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1c420 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73  sult code */.  s
1c430 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65  truct winShmNode
1c440 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
1c450 20 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63    /* Newly alloc
1c460 61 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ated winShmNode 
1c470 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c490 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1c4a0 6f 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65  of zName in byte
1c4b0 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  s */..  assert( 
1c4c0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
1c4d0 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76  ;    /* Not prev
1c4e0 69 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f  iously opened */
1c4f0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
1c500 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
1c510 77 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62  w sqlite3_shm ob
1c520 6a 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63  ject.  Also spec
1c530 75 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61  ulatively.  ** a
1c540 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
1c550 72 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f  r a new winShmNo
1c560 64 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e  de and filename.
1c570 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
1c580 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
1c590 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
1c5a0 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1c5b0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1c5c0 4d 45 4d 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20 73  MEM;.  nName = s
1c5d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
1c5e0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1c5f0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d 61  pNew = sqlite3Ma
1c600 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66  llocZero( sizeof
1c610 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 4e  (*pShmNode) + nN
1c620 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69 66  ame + 17 );.  if
1c630 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1c640 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
1c650 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1c660 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
1c670 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 7a 46 69  .  }.  pNew->zFi
1c680 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
1c690 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 73 71 6c 69  &pNew[1];.  sqli
1c6a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4e 61  te3_snprintf(nNa
1c6b0 6d 65 2b 31 35 2c 20 70 4e 65 77 2d 3e 7a 46 69  me+15, pNew->zFi
1c6c0 6c 65 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22  lename, "%s-shm"
1c6d0 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b  , pDbFd->zPath);
1c6e0 0a 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75  .  sqlite3FileSu
1c6f0 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61  ffix3(pDbFd->zPa
1c700 74 68 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e  th, pNew->zFilen
1c710 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b  ame);..  /* Look
1c720 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65   to see if there
1c730 20 69 73 20 61 6e 20 65 78 69 73 74 69 6e 67 20   is an existing 
1c740 77 69 6e 53 68 6d 4e 6f 64 65 20 74 68 61 74 20  winShmNode that 
1c750 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 20 2a  can be used..  *
1c760 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 69 6e 67  * If no matching
1c770 20 77 69 6e 53 68 6d 4e 6f 64 65 20 63 75 72 72   winShmNode curr
1c780 65 6e 74 6c 79 20 65 78 69 73 74 73 2c 20 63 72  ently exists, cr
1c790 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 2e 0a  eate a new one..
1c7a0 20 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74    */.  winShmEnt
1c7b0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
1c7c0 28 70 53 68 6d 4e 6f 64 65 20 3d 20 77 69 6e 53  (pShmNode = winS
1c7d0 68 6d 4e 6f 64 65 4c 69 73 74 3b 20 70 53 68 6d  hmNodeList; pShm
1c7e0 4e 6f 64 65 3b 20 70 53 68 6d 4e 6f 64 65 3d 70  Node; pShmNode=p
1c7f0 53 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 29 7b  ShmNode->pNext){
1c800 0a 20 20 20 20 2f 2a 20 54 42 44 20 6e 65 65 64  .    /* TBD need
1c810 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
1c820 20 62 65 74 74 65 72 20 6d 61 74 63 68 20 68 65   better match he
1c830 72 65 2e 20 20 50 65 72 68 61 70 73 0a 20 20 20  re.  Perhaps.   
1c840 20 2a 2a 20 75 73 65 20 46 49 4c 45 5f 49 44 5f   ** use FILE_ID_
1c850 42 4f 54 48 5f 44 49 52 5f 49 4e 46 4f 20 53 74  BOTH_DIR_INFO St
1c860 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a  ructure..    */.
1c870 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
1c880 74 72 49 43 6d 70 28 70 53 68 6d 4e 6f 64 65 2d  trICmp(pShmNode-
1c890 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77  >zFilename, pNew
1c8a0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3d 3d 30 20  ->zFilename)==0 
1c8b0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69  ) break;.  }.  i
1c8c0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
1c8d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1c8e0 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNew);.  }else{.
1c8f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70      pShmNode = p
1c900 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1c910 30 3b 0a 20 20 20 20 28 28 77 69 6e 46 69 6c 65  0;.    ((winFile
1c920 2a 29 28 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  *)(&pShmNode->hF
1c930 69 6c 65 29 29 2d 3e 68 20 3d 20 49 4e 56 41 4c  ile))->h = INVAL
1c940 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b  ID_HANDLE_VALUE;
1c950 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
1c960 4e 65 78 74 20 3d 20 77 69 6e 53 68 6d 4e 6f 64  Next = winShmNod
1c970 65 4c 69 73 74 3b 0a 20 20 20 20 77 69 6e 53 68  eList;.    winSh
1c980 6d 4e 6f 64 65 4c 69 73 74 20 3d 20 70 53 68 6d  mNodeList = pShm
1c990 4e 6f 64 65 3b 0a 0a 20 20 20 20 70 53 68 6d 4e  Node;..    pShmN
1c9a0 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c  ode->mutex = sql
1c9b0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1c9c0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
1c9d0 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68  ST);.    if( pSh
1c9e0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20  mNode->mutex==0 
1c9f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1ca00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1ca10 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
1ca20 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
1ca30 0a 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  ..    rc = winOp
1ca40 65 6e 28 70 44 62 46 64 2d 3e 70 56 66 73 2c 0a  en(pDbFd->pVfs,.
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
1ca70 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
1ca80 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1ca90 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
1caa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cab0 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a    (sqlite3_file*
1cac0 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c  )&pShmNode->hFil
1cad0 65 2c 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e 64  e,  /* File hand
1cae0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 20 20 20  le here */.     
1caf0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1cb00 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 20 53 51  TE_OPEN_WAL | SQ
1cb10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
1cb20 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
1cb30 4e 5f 43 52 45 41 54 45 2c 0a 20 20 20 20 20 20  N_CREATE,.      
1cb40 20 20 20 20 20 20 20 20 20 20 20 30 29 3b 0a 20             0);. 
1cb50 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
1cb60 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f  !=rc ){.      go
1cb70 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1cb80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
1cb90 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61  heck to see if a
1cba0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
1cbb0 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65  s holding the de
1cbc0 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20  ad-man switch.. 
1cbd0 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72     ** If not, tr
1cbe0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
1cbf0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 0a  to zero length..
1cc00 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 77      */.    if( w
1cc10 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1cc20 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 57  pShmNode, _SHM_W
1cc30 52 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  RLCK, WIN_SHM_DM
1cc40 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  S, 1)==SQLITE_OK
1cc50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
1cc60 69 6e 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69  inTruncate((sqli
1cc70 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1cc80 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 30 29 3b  Node->hFile, 0);
1cc90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1cca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ccb0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
1ccc0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1ccd0 52 5f 53 48 4d 4f 50 45 4e 2c 20 6f 73 47 65 74  R_SHMOPEN, osGet
1cce0 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20  LastError(),.   
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 20 20 20 20 20 20 22 77 69 6e 4f 70 65 6e 53 68        "winOpenSh
1cd10 6d 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  m", pDbFd->zPath
1cd20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1cd30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1cd40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1cd50 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1cd60 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1cd70 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44  UNLCK, WIN_SHM_D
1cd80 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 72 63  MS, 1);.      rc
1cd90 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c   = winShmSystemL
1cda0 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53  ock(pShmNode, _S
1cdb0 48 4d 5f 52 44 4c 43 4b 2c 20 57 49 4e 5f 53 48  HM_RDLCK, WIN_SH
1cdc0 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 7d  M_DMS, 1);.    }
1cdd0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1cde0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
1cdf0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
1ce00 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69  the new connecti
1ce10 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74 68  on a child of th
1ce20 65 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a  e winShmNode */.
1ce30 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20    p->pShmNode = 
1ce40 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 20 64 65  pShmNode;.#if de
1ce50 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
1ce60 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
1ce70 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
1ce80 41 43 45 29 0a 20 20 70 2d 3e 69 64 20 3d 20 70  ACE).  p->id = p
1ce90 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
1cea0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1ceb0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
1cec0 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
1ced0 20 70 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76   p;.  winShmLeav
1cee0 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
1cef0 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
1cf00 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
1cf10 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1cf20 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
1cf30 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
1cf40 72 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d 45  r of the winShmE
1cf50 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65  nterMutex() mute
1cf60 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65  x and the pointe
1cf70 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20  r from the.  ** 
1cf80 6e 65 77 20 28 73 74 72 75 63 74 20 77 69 6e 53  new (struct winS
1cf90 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  hm) object to th
1cfa0 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62  e pShmNode has b
1cfb0 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61  een set. All tha
1cfc0 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74  t is.  ** left t
1cfd0 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20  o do is to link 
1cfe0 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69  the new object i
1cff0 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c  nto the linked l
1d000 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a  ist starting.  *
1d010 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  * at pShmNode->p
1d020 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74  First. This must
1d030 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68   be done while h
1d040 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e  olding the pShmN
1d050 6f 64 65 2d 3e 6d 75 74 65 78 0a 20 20 2a 2a 20  ode->mutex.  ** 
1d060 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
1d070 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1d080 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1d090 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
1d0a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
1d0b0 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
1d0c0 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
1d0d0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1d0e0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
1d0f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1d100 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  TE_OK;..  /* Jum
1d110 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72  p here on any er
1d120 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f  ror */.shm_open_
1d130 65 72 72 3a 0a 20 20 77 69 6e 53 68 6d 53 79 73  err:.  winShmSys
1d140 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d150 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57 49  , _SHM_UNLCK, WI
1d160 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  N_SHM_DMS, 1);. 
1d170 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44 62   winShmPurge(pDb
1d180 46 64 2d 3e 70 56 66 73 2c 20 30 29 3b 20 20 20  Fd->pVfs, 0);   
1d190 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20     /* This call 
1d1a0 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69  frees pShmNode i
1d1b0 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1d1c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
1d1d0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
1d1e0 70 4e 65 77 29 3b 0a 20 20 77 69 6e 53 68 6d 4c  pNew);.  winShmL
1d1f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
1d200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d210 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65  ** Close a conne
1d220 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d  ction to shared-
1d230 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20  memory.  Delete 
1d240 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
1d250 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
1d260 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
1d270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1d280 69 6e 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  inShmUnmap(.  sq
1d290 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
1d2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1d2b0 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
1d2c0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1d2d0 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
1d2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1d2f0 6c 65 74 65 20 61 66 74 65 72 20 63 6c 6f 73 69  lete after closi
1d300 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ng if true */.){
1d310 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  .  winFile *pDbF
1d320 64 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  d;       /* Data
1d330 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  base holding sha
1d340 72 65 64 2d 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red-memory */.  
1d350 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
1d360 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
1d370 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
1d380 6f 73 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  osed */.  winShm
1d390 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
1d3a0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1d3b0 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
1d3c0 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  file */.  winShm
1d3d0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
1d3e0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1d3f0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
1d400 65 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 70 44  ections */..  pD
1d410 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  bFd = (winFile*)
1d420 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
1d430 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
1d440 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1d450 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
1d460 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
1d470 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e  .  /* Remove con
1d480 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74  nection p from t
1d490 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63  he set of connec
1d4a0 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
1d4b0 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e  .  ** with pShmN
1d4c0 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
1d4d0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1d4e0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1d4f0 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64   for(pp=&pShmNod
1d500 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29  e->pFirst; (*pp)
1d510 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29  !=p; pp = &(*pp)
1d520 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70  ->pNext){}.  *pp
1d530 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20   = p->pNext;..  
1d540 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e  /* Free the conn
1d550 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71  ection p */.  sq
1d560 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
1d570 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30   pDbFd->pShm = 0
1d580 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
1d590 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
1d5a0 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20  ->mutex);..  /* 
1d5b0 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  If pShmNode->nRe
1d5c0 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c  f has reached 0,
1d5d0 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20   then close the 
1d5e0 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20  underlying.  ** 
1d5f0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
1d600 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 77 69 6e  le, too */.  win
1d610 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1d620 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
1d630 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  ode->nRef>0 );. 
1d640 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d   pShmNode->nRef-
1d650 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  -;.  if( pShmNod
1d660 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  e->nRef==0 ){.  
1d670 20 20 77 69 6e 53 68 6d 50 75 72 67 65 28 70 44    winShmPurge(pD
1d680 62 46 64 2d 3e 70 56 66 73 2c 20 64 65 6c 65 74  bFd->pVfs, delet
1d690 65 46 6c 61 67 29 3b 0a 20 20 7d 0a 20 20 77 69  eFlag);.  }.  wi
1d6a0 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1d6b0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
1d6c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1d6d0 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
1d6e0 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
1d6f0 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
1d700 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1d710 20 77 69 6e 53 68 6d 4c 6f 63 6b 28 0a 20 20 73   winShmLock(.  s
1d720 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
1d730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1d740 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69  abase file holdi
1d750 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65  ng the shared me
1d760 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  mory */.  int of
1d770 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
1d780 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f       /* First lo
1d790 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ck to acquire or
1d7a0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
1d7b0 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  t n,            
1d7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d7d0 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61  er of locks to a
1d7e0 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
1d7f0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20    /* What to do 
1d820 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  with the lock */
1d830 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  .){.  winFile *p
1d840 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65 2a  DbFd = (winFile*
1d850 29 66 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 43  )fd;        /* C
1d860 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e  onnection holdin
1d870 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  g shared memory 
1d880 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 20 3d  */.  winShm *p =
1d890 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20   pDbFd->pShm;   
1d8a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d8b0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1d8c0 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a  being locked */.
1d8d0 20 20 77 69 6e 53 68 6d 20 2a 70 58 3b 20 20 20    winShm *pX;   
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1d900 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
1d910 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 77 69  siblings */.  wi
1d920 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1d930 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
1d940 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1d950 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
1d960 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1d970 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
1d980 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9a0 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
1d9b0 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
1d9c0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
1d9d0 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
1d9e0 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
1d9f0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
1da00 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
1da10 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
1da20 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
1da30 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
1da40 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
1da50 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
1da60 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
1da70 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
1da80 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
1da90 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
1daa0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
1dab0 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1dac0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
1dad0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
1dae0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
1daf0 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
1db00 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
1db10 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
1db20 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 0a  CLUSIVE)!=0 );..
1db30 20 20 6d 61 73 6b 20 3d 20 28 75 31 36 29 28 28    mask = (u16)((
1db40 31 55 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  1U<<(ofst+n)) - 
1db50 28 31 55 3c 3c 6f 66 73 74 29 29 3b 0a 20 20 61  (1U<<ofst));.  a
1db60 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61  ssert( n>1 || ma
1db70 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b  sk==(1<<ofst) );
1db80 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1db90 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
1dba0 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66  >mutex);.  if( f
1dbb0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
1dbc0 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  M_UNLOCK ){.    
1dbd0 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b  u16 allMask = 0;
1dbe0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
1dbf0 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  s held by siblin
1dc00 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  gs */..    /* Se
1dc10 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67  e if any sibling
1dc20 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65  s hold this same
1dc30 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72   lock */.    for
1dc40 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
1dc50 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
1dc60 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
1dc70 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
1dc80 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nue;.      asser
1dc90 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  t( (pX->exclMask
1dca0 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c   & (p->exclMask|
1dcb0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d  p->sharedMask))=
1dcc0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d  =0 );.      allM
1dcd0 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  ask |= pX->share
1dce0 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
1dcf0 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20    /* Unlock the 
1dd00 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63  system-level loc
1dd10 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d  ks */.    if( (m
1dd20 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d  ask & allMask)==
1dd30 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1dd40 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1dd50 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f  (pShmNode, _SHM_
1dd60 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f  UNLCK, ofst+WIN_
1dd70 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
1dd80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
1dd90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1dda0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
1ddb0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
1ddc0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
1ddd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dde0 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
1ddf0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
1de00 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1de10 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
1de20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
1de30 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  & SQLITE_SHM_SHA
1de40 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61  RED ){.    u16 a
1de50 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f  llShared = 0;  /
1de60 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73  * Union of locks
1de70 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74   held by connect
1de80 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
1de90 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  "p" */..    /* F
1dea0 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68  ind out which sh
1deb0 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61  ared locks are a
1dec0 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73  lready held by s
1ded0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1dee0 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e  ns..    ** If an
1def0 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64  y sibling alread
1df00 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75  y holds an exclu
1df10 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68  sive lock, go ah
1df20 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20  ead and return. 
1df30 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53     ** SQLITE_BUS
1df40 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  Y..    */.    fo
1df50 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
1df60 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1df70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1df80 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
1df90 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1dfa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1dfb0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1dfc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1dfd0 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64  .      allShared
1dfe0 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
1dff0 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
1e000 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63  * Get shared loc
1e010 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
1e020 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73   level, if neces
1e030 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20  sary */.    if( 
1e040 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e050 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53  .      if( (allS
1e060 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30  hared & mask)==0
1e070 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1e080 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63   winShmSystemLoc
1e090 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d  k(pShmNode, _SHM
1e0a0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 57 49 4e  _RDLCK, ofst+WIN
1e0b0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
1e0c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e0d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e0e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1e0f0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
1e100 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
1e110 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
1e120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e130 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
1e140 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
1e150 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1e160 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
1e170 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
1e180 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
1e190 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
1e1a0 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
1e1b0 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
1e1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
1e1d0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
1e1e0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1e1f0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1e200 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1e210 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
1e220 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
1e230 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
1e240 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1e250 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1e260 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1e270 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1e280 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e290 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
1e2a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
1e2b0 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
1e2c0 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
1e2d0 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
1e2e0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
1e2f0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
1e300 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
1e310 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
1e320 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e330 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d       rc = winShm
1e340 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1e350 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1e360 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41   ofst+WIN_SHM_BA
1e370 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
1e380 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e390 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
1e3a0 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
1e3b0 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
1e3c0 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
1e3d0 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
1e3e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1e3f0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1e400 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
1e410 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
1e420 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 70 69 64 3d  (("SHM-LOCK pid=
1e430 25 6c 75 2c 20 69 64 3d 25 64 2c 20 73 68 61 72  %lu, id=%d, shar
1e440 65 64 4d 61 73 6b 3d 25 30 33 78 2c 20 65 78 63  edMask=%03x, exc
1e450 6c 4d 61 73 6b 3d 25 30 33 78 2c 20 72 63 3d 25  lMask=%03x, rc=%
1e460 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1e470 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
1e480 63 65 73 73 49 64 28 29 2c 20 70 2d 3e 69 64 2c  cessId(), p->id,
1e490 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20   p->sharedMask, 
1e4a0 70 2d 3e 65 78 63 6c 4d 61 73 6b 2c 0a 20 20 20  p->exclMask,.   
1e4b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
1e4c0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
1e4d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e4e0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
1e4f0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
1e500 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
1e510 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
1e520 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
1e530 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
1e540 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
1e550 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
1e560 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
1e570 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
1e580 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
1e590 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
1e5a0 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 42 61 72  c void winShmBar
1e5b0 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
1e5c0 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
1e5d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f    /* Database ho
1e5e0 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
1e5f0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
1e600 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1e610 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  (fd);.  sqlite3M
1e620 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
1e630 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65    /* compiler-de
1e640 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72  fined memory bar
1e650 72 69 65 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  rier */.  winShm
1e660 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
1e670 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65      /* Also mute
1e680 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63  x, for redundanc
1e690 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4c 65 61  y */.  winShmLea
1e6a0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
1e6b0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1e6c0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
1e6d0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
1e6e0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
1e6f0 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 73 68 61 72  n of the.** shar
1e700 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
1e710 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
1e720 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
1e730 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
1e740 67 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 75 6d  gions.** are num
1e750 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66  bered starting f
1e760 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73  rom zero. Each s
1e770 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
1e780 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 0a  ion is szRegion.
1e790 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
1e7a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1e7b0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1e7c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e7d0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
1e7e0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
1e7f0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
1e800 66 20 74 68 65 20 69 73 57 72 69 74 65 20 70 61  f the isWrite pa
1e810 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
1e820 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
1e830 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
1e840 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
1e850 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
1e860 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
1e870 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
1e880 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
1e890 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
1e8a0 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
1e8b0 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
1e8c0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
1e8d0 66 0a 2a 2a 20 69 73 57 72 69 74 65 20 69 73 20  f.** isWrite is 
1e8e0 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65  non-zero and the
1e8f0 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
1e900 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
1e910 68 61 73 20 6e 6f 74 20 79 65 74 0a 2a 2a 20 62  has not yet.** b
1e920 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
1e930 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
1e940 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
1e950 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
1e960 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
1e970 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
1e980 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
1e990 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
1e9a0 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
1e9b0 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
1e9c0 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
1e9d0 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
1e9e0 6f 63 65 73 73 65 73 0a 2a 2a 20 61 64 64 72 65  ocesses.** addre
1e9f0 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
1ea00 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
1ea10 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
1ea20 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
1ea30 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  ed.** memory and
1ea40 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
1ea50 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1ea60 6e 74 20 77 69 6e 53 68 6d 4d 61 70 28 0a 20 20  nt winShmMap(.  
1ea70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1ea80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ea90 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
1eaa0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1eab0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
1eac0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ead0 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
1eae0 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
1eaf0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
1eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb10 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
1eb20 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 72  ns */.  int isWr
1eb30 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ite,            
1eb40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1eb50 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
1eb60 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
1eb70 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
1eb80 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
1eb90 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
1eba0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 77  memory */.){.  w
1ebb0 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20  inFile *pDbFd = 
1ebc0 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20  (winFile*)fd;.  
1ebd0 77 69 6e 53 68 6d 20 2a 70 53 68 6d 20 3d 20 70  winShm *pShm = p
1ebe0 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 77 69  DbFd->pShm;.  wi
1ebf0 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  nShmNode *pShmNo
1ec00 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
1ec10 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
1ec20 20 21 70 53 68 6d 20 29 7b 0a 20 20 20 20 72 63   !pShm ){.    rc
1ec30 20 3d 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64   = winOpenShared
1ec40 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20  Memory(pDbFd);. 
1ec50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ec60 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1ec70 3b 0a 20 20 20 20 70 53 68 6d 20 3d 20 70 44 62  ;.    pShm = pDb
1ec80 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 7d 0a 20 20  Fd->pShm;.  }.  
1ec90 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 2d  pShmNode = pShm-
1eca0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 73 71  >pShmNode;..  sq
1ecb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1ecc0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1ecd0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
1ece0 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
1ecf0 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
1ed00 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
1ed10 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68  =0 );..  if( pSh
1ed20 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d  mNode->nRegion<=
1ed30 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 73  iRegion ){.    s
1ed40 74 72 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20  truct ShmRegion 
1ed50 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
1ed60 20 20 2f 2a 20 4e 65 77 20 61 52 65 67 69 6f 6e    /* New aRegion
1ed70 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
1ed80 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 69 52 65  int nByte = (iRe
1ed90 67 69 6f 6e 2b 31 29 2a 73 7a 52 65 67 69 6f 6e  gion+1)*szRegion
1eda0 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65  ;  /* Minimum re
1edb0 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
1edc0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
1edd0 69 6e 74 36 34 20 73 7a 3b 20 20 20 20 20 20 20  int64 sz;       
1ede0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1edf0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 77 61  rrent size of wa
1ee00 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 2a 2f 0a  l-index file */.
1ee10 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73  .    pShmNode->s
1ee20 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69  zRegion = szRegi
1ee30 6f 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  on;..    /* The 
1ee40 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
1ee50 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
1ee60 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1ee70 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
1ee80 2e 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74  ..    ** Check t
1ee90 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
1eea0 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
1eeb0 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
1eec0 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
1eed0 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67    ** large enoug
1eee0 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65  h to contain the
1eef0 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f   requested regio
1ef00 6e 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  n)..    */.    r
1ef10 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1ef20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
1ef30 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  &pShmNode->hFile
1ef40 2c 20 26 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  , &sz);.    if( 
1ef50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ef60 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  .      rc = winL
1ef70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1ef80 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73  OERR_SHMSIZE, os
1ef90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1efb0 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61         "winShmMa
1efc0 70 31 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74  p1", pDbFd->zPat
1efd0 68 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  h);.      goto s
1efe0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1eff0 7d 0a 0a 20 20 20 20 69 66 28 20 73 7a 3c 6e 42  }..    if( sz<nB
1f000 79 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  yte ){.      /* 
1f010 54 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  The requested me
1f020 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73  mory region does
1f030 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 69   not exist. If i
1f040 73 57 72 69 74 65 20 69 73 20 73 65 74 20 74 6f  sWrite is set to
1f050 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2c 20  .      ** zero, 
1f060 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
1f070 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
1f080 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
1f090 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
1f0a0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 41 6c    **.      ** Al
1f0b0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
1f0c0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1f0d0 65 72 6f 2c 20 75 73 65 20 66 74 72 75 6e 63 61  ero, use ftrunca
1f0e0 74 65 28 29 20 74 6f 20 61 6c 6c 6f 63 61 74 65  te() to allocate
1f0f0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65  .      ** the re
1f100 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
1f110 65 67 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  egion..      */.
1f120 20 20 20 20 20 20 69 66 28 20 21 69 73 57 72 69        if( !isWri
1f130 74 65 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67  te ) goto shmpag
1f140 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 72 63 20  e_out;.      rc 
1f150 3d 20 77 69 6e 54 72 75 6e 63 61 74 65 28 28 73  = winTruncate((s
1f160 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70  qlite3_file *)&p
1f170 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20  ShmNode->hFile, 
1f180 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
1f190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f1a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f1b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
1f1c0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
1f1d0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
1f1e0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
1f1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
1f200 6e 53 68 6d 4d 61 70 32 22 2c 20 70 44 62 46 64  nShmMap2", pDbFd
1f210 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1f220 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1f230 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
1f240 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
1f250 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
1f260 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
1f270 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1f280 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
1f290 20 20 20 20 61 70 4e 65 77 20 3d 20 28 73 74 72      apNew = (str
1f2a0 75 63 74 20 53 68 6d 52 65 67 69 6f 6e 20 2a 29  uct ShmRegion *)
1f2b0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
1f2c0 34 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  4(.        pShmN
1f2d0 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 2c 20 28 69  ode->aRegion, (i
1f2e0 52 65 67 69 6f 6e 2b 31 29 2a 73 69 7a 65 6f 66  Region+1)*sizeof
1f2f0 28 61 70 4e 65 77 5b 30 5d 29 0a 20 20 20 20 29  (apNew[0]).    )
1f300 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
1f310 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
1f330 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
1f340 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1f350 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1f360 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1f370 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1f380 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1f390 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1f3a0 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1f3b0 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1f3c0 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1f3d0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1f3e0 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1f3f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1f400 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1f410 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
1f420 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1f430 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1f440 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1f450 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1f460 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1f470 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1f480 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1f490 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1f4a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1f4b0 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1f4c0 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1f4d0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1f4e0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1f4f0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1f500 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1f510 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1f520 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1f530 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1f540 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
1f550 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
1f560 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
1f570 41 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  A.      hMap = o
1f580 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1f590 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1f5a0 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1f5b0 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1f5c0 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1f5d0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1f5e0 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1f5f0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52  ACE(("SHM-MAP-CR
1f600 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  EATE pid=%lu, re
1f610 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64  gion=%d, size=%d
1f620 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
1f630 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1f640 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1f650 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
1f660 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
1f680 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
1f690 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
1f6a0 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
1f6b0 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
1f6c0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
1f6d0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
1f6e0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
1f6f0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
1f700 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
1f710 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
1f720 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
1f730 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
1f740 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
1f750 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
1f760 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
1f770 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
1f780 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
1f790 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
1f7a0 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
1f7b0 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
1f7c0 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
1f7d0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
1f7e0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
1f7f0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
1f800 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
1f810 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
1f820 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
1f830 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
1f840 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
1f850 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
1f860 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
1f870 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
1f880 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
1f890 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
1f8a0 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
1f8b0 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1f8c0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1f8d0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1f8e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
1f8f0 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
1f910 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
1f920 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1f930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f940 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
1f950 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
1f960 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
1f970 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
1f980 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
1f990 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1f9a0 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
1f9b0 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
1f9e0 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
1f9f0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
1fa00 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
1fa10 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
1fa20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1fa30 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
1fa40 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1fa50 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
1fa60 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
1fa70 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
1fa80 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
1fa90 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
1faa0 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
1fab0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
1fac0 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
1fad0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
1fae0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
1faf0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
1fb00 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
1fb10 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
1fb20 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
1fb30 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
1fb40 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
1fb50 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
1fb60 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
1fb70 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
1fb80 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
1fb90 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
1fba0 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
1fbb0 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
1fbc0 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
1fbd0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
1fbe0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1fbf0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
1fc00 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
1fc10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
1fc20 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
1fc30 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
1fc40 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
1fc50 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
1fc60 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
1fc70 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
1fc80 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
1fc90 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
1fca0 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
1fcb0 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
1fcc0 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
1fcd0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
1fce0 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
1fcf0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1fd00 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
1fd10 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
1fd20 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
1fd30 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
1fd40 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
1fd50 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
1fd60 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
1fd70 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d  =%p, hMap=%p, pM
1fd80 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
1fd90 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53            "mmapS
1fda0 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ize=%lld, mmapSi
1fdb0 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d  zeActual=%lld, m
1fdc0 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c  mapSizeMax=%lld\
1fdd0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
1fde0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
1fdf0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
1fe00 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c  File->hMap, pFil
1fe10 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20  e->pMapRegion,. 
1fe20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1fe30 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65  >mmapSize, pFile
1fe40 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
1fe50 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
1fe60 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
1fe70 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
1fe80 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
1fe90 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
1fea0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1feb0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1fec0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
1fed0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
1fee0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
1fef0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
1ff00 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
1ff10 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
1ff30 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
1ff40 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
1ff50 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
1ff60 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
1ff70 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
1ff80 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
1ff90 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
1ffa0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1ffb0 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
1ffc0 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
1fff0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
20000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
20010 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
20020 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
20030 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
20040 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
20050 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  ctual = 0;.  }. 
20060 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
20070 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
20080 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
20090 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
200a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
200b0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
200c0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
200d0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
200e0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
200f0 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
20100 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
20110 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
20120 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
20130 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
20140 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
20150 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20  ->hMap));.      
20160 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
20170 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20180 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
20190 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
201a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201b0 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22   "winUnmapfile2"
201c0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
201d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
201e0 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
201f0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55   }.  OSTRACE(("U
20200 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
20210 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
20220 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
20230 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20240 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20250 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  , pFile));.  ret
20260 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20270 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
20280 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
20290 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
202a0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
202b0 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
202c0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
202d0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
202e0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
202f0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
20300 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68  w). Or, if.** th
20310 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
20320 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
20330 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
20340 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 0a  there are still.
20350 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
20360 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
20370 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
20380 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20390 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
203a0 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
203b0 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
203c0 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
203d0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a  uested size of.*
203e0 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
203f0 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
20400 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
20410 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
20420 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75  then the.** requ
20430 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
20440 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
20450 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
20460 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
20470 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
20480 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
20490 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
204a0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
204b0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75 73  configured.** us
204c0 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
204d0 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63  _MMAP_SIZE, whic
204e0 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
204f0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
20500 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
20510 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20520 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
20530 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
20540 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
20550 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
20560 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
20570 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
20580 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
20590 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
205a0 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28   int winMapfile(
205b0 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71  winFile *pFd, sq
205c0 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
205d0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  e){.  sqlite3_in
205e0 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  t64 nMap = nByte
205f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
20600 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
20610 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
20620 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ==0 );.  OSTRACE
20630 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
20640 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73  %lu, pFile=%p, s
20650 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  ize=%lld\n",.   
20660 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20670 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20680 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a   pFd, nByte));..
20690 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
206a0 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
206b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
206c0 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
206d0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
206e0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
206f0 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20  pFd, &nMap);.   
20700 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
20710 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
20720 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
20730 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
20740 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c  _IOERR_FSTAT\n",
20750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20760 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
20770 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
20780 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
20790 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
207a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
207b0 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
207c0 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
207d0 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
207e0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61  zeMax;.  }.  nMa
207f0 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69  p &= ~(sqlite3_i
20800 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f  nt64)(winSysInfo
20810 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29  .dwPageSize - 1)
20820 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30  ;..  if( nMap==0
20830 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   && pFd->mmapSiz
20840 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  e>0 ){.    winUn
20850 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
20860 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  }.  if( nMap!=pF
20870 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
20880 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
20890 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f  0;.    DWORD pro
208a0 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
208b0 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20  ONLY;.    DWORD 
208c0 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50  flags = FILE_MAP
208d0 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55  _READ;..    winU
208e0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 23  nmapfile(pFd);.#
208f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
20900 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  P_READWRITE.    
20910 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
20920 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
20930 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
20940 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45    protect = PAGE
20950 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
20960 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f    flags |= FILE_
20970 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  MAP_WRITE;.    }
20980 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
20990 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
209a0 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
209b0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
209c0 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e  romApp(pFd->h, N
209d0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d  ULL, protect, nM
209e0 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  ap, NULL);.#elif
209f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
20a00 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
20a10 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
20a20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
20a30 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingW(pFd->h, NUL
20a40 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
20a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a60 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
20a70 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
20a80 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
20a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
20ab0 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
20ac0 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
20ad0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
20ae0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
20af0 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f  ANSI) && SQLITE_
20b00 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45  WIN32_CREATEFILE
20b10 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 70 46 64  MAPPINGA.    pFd
20b20 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
20b30 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
20b40 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
20b50 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b70 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
20b80 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
20b90 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bb0 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
20bc0 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
20bd0 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
20be0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
20bf0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
20c00 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
20c10 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
20c20 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
20c30 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
20c40 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
20c50 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
20c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c70 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
20c80 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
20c90 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
20ca0 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
20cb0 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
20cc0 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
20cd0 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
20ce0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
20cf0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
20d00 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
20d10 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
20d20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
20d30 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
20d40 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
20d50 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
20d60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20d70 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
20d80 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
20d90 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
20da0 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
20db0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
20dc0 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
20dd0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
20de0 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
20df0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
20e00 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
20e10 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
20e20 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
20e30 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
20e40 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
20e50 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
20e60 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
20e70 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
20e80 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
20e90 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
20ea0 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
20eb0 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
20ec0 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
20ed0 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
20ee0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
20ef0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
20f00 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
20f10 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
20f20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
20f30 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
20f40 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
20f70 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
20f80 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
20f90 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
20fa0 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
20fb0 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
20fc0 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
20fd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
20fe0 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
20ff0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
21000 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
21010 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
21020 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21030 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
21040 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
21050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21060 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
21070 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
21080 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
21090 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
210a0 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
210b0 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
210c0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
210d0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
210e0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
210f0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
21100 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21110 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21120 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
21130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
21140 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21150 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
21160 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
21170 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
21180 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
21190 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
211a0 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
211b0 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
211c0 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
211d0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
211e0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
211f0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
21200 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
21210 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
21220 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
21230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
21240 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
21250 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
21260 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
21270 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
21280 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
21290 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
212a0 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
212b0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
212c0 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
212d0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
212e0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
212f0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
21300 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
21310 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
21320 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
21330 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
21340 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c  ventually.** rel
21350 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
21360 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
21370 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
21380 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
21390 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
213a0 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
213b0 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
213c0 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
213d0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
213e0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
213f0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
21400 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
21410 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
21420 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
21430 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
21440 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
21450 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
21460 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
21470 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
21480 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21490 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
214a0 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
214b0 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
214c0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
214d0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
214e0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
214f0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
21500 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
21510 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
21520 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
21530 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21540 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21550 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
21560 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21570 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
21580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21590 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
215a0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
215b0 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
215c0 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
215d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
215e0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
215f0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
21600 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
21610 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
21620 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
21630 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
21640 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
21650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
21660 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
21670 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
21680 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
21690 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
216a0 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
216b0 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
216c0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
216d0 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
216e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
216f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
21700 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
21710 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
21720 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
21730 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65 66  eleases a.** ref
21740 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
21750 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
21760 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29  ll to winFetch()
21770 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  . The second.** 
21780 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
21790 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
217a0 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
217b0 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  e as the corresp
217c0 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65  onding.** argume
217d0 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73  nt that was pass
217e0 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74  ed to the winFet
217f0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
21800 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
21810 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
21820 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
21830 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
21840 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20  being called.** 
21850 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
21860 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
21870 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
21880 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
21890 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f  apping.** may no
218a0 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
218b0 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
218c0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
218d0 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71  nt winUnfetch(sq
218e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
218f0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
21900 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
21910 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
21920 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
21930 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
21940 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
21950 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
21960 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  */..  /* If p==0
21970 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
21980 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
21990 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
219a0 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20  utstanding.  ** 
219b0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
219c0 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
219d0 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
219e0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
219f0 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
21a00 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
21a10 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
21a20 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
21a30 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
21a40 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
21a50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
21a60 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
21a70 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
21a80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
21a90 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
21aa0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
21ab0 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54  [iOff] );..  OST
21ac0 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70  RACE(("UNFETCH p
21ad0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
21ae0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70  , offset=%lld, p
21af0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
21b00 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
21b10 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
21b20 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69   iOff, p));..  i
21b30 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
21b40 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
21b50 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49  }else{.    /* FI
21b60 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73  XME:  If Windows
21b70 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72   truly always pr
21b80 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e  events truncatin
21b90 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a  g or deleting a.
21ba0 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c      ** file whil
21bb0 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68  e a mapping is h
21bc0 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  eld, then the fo
21bd0 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70  llowing winUnmap
21be0 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20  file() call.    
21bf0 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  ** is unnecessar
21c00 79 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  y can be omitted
21c10 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69   - potentially i
21c20 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20  mproving.    ** 
21c30 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f  performance.  */
21c40 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
21c50 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
21c60 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
21c70 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64  chOut>=0 );.#end
21c80 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
21c90 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
21ca0 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
21cb0 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
21cc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
21cd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
21ce0 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  fd));.  return S
21cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
21d00 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
21d10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
21d20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
21d30 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
21d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d50 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
21d60 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
21d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
21d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 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 2f 0a  **************/.
21de0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
21df0 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
21e00 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
21e10 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
21e20 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
21e30 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a  e for win32..*/.
21e40 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
21e50 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
21e60 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  winIoMethod = {.
21e70 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
21e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e90 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
21ea0 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ec0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
21ed0 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
21ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ef0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
21f00 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
21f30 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f50 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
21f60 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
21f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f80 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
21f90 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21fb0 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
21fc0 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20   winLock,       
21fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fe0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
21ff0 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  inUnlock,       
22000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22010 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
22020 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
22030 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
22040 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
22050 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
22060 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
22070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
22080 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
22090 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220b0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
220c0 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
220d0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
220e0 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
220f0 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
22100 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
22130 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
22160 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
22170 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22180 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
22190 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
221a0 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
221b0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
221c0 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63  map */.  winFetc
221d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
221e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
221f0 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74  ch */.  winUnfet
22200 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
22210 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
22220 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  tch */.};../****
22230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22250 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
222a0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
222b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
222c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
222d0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
222e0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
222f0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
22300 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
22310 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
22320 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
22330 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a  __CYGWIN__)./*.*
22340 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65  * Convert a file
22350 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76  name from whatev
22360 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  er the underlyin
22370 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
22380 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66  em.** supports f
22390 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74  or filenames int
223a0 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
223b0 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
223c0 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  lt is.** obtaine
223d0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
223e0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
223f0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
22400 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
22410 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76  ic char *winConv
22420 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
22430 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46  e(const void *zF
22440 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
22450 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
22460 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
22470 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
22480 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ed = winUnicodeT
22490 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29  oUtf8(zFilename)
224a0 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
224b0 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
224c0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
224d0 43 6f 6e 76 65 72 74 65 64 20 3d 20 73 71 6c 69  Converted = sqli
224e0 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
224f0 6f 5f 75 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  o_utf8(zFilename
22500 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
22510 2f 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  /* caller will h
22520 61 6e 64 6c 65 20 6f 75 74 20 6f 66 20 6d 65 6d  andle out of mem
22530 6f 72 79 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ory */.  return 
22540 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 7d 0a 23 65  zConverted;.}.#e
22550 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ndif../*.** Conv
22560 65 72 74 20 61 20 55 54 46 2d 38 20 66 69 6c 65  ert a UTF-8 file
22570 6e 61 6d 65 20 69 6e 74 6f 20 77 68 61 74 65 76  name into whatev
22580 65 72 20 66 6f 72 6d 20 74 68 65 20 75 6e 64 65  er form the unde
22590 72 6c 79 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  rlying.** operat
225a0 69 6e 67 20 73 79 73 74 65 6d 20 77 61 6e 74 73  ing system wants
225b0 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 2e 20 20   filenames in.  
225c0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
225d0 65 20 72 65 73 75 6c 74 0a 2a 2a 20 69 73 20 6f  e result.** is o
225e0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
225f0 6c 6f 63 20 61 6e 64 20 6d 75 73 74 20 62 65 20  loc and must be 
22600 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
22610 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ling.** function
22620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
22630 20 2a 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d   *winConvertFrom
22640 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63 6f 6e  Utf8Filename(con
22650 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
22660 6d 65 29 7b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f  me){.  void *zCo
22670 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69  nverted = 0;.  i
22680 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20  f( osIsNT() ){. 
22690 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20     zConverted = 
226a0 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
226b0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
226c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
226d0 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20  IN32_HAS_ANSI.  
226e0 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e 76 65  else{.    zConve
226f0 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 77  rted = sqlite3_w
22700 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63  in32_utf8_to_mbc
22710 73 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  s(zFilename);.  
22720 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
22730 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
22740 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
22750 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
22760 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
22770 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
22780 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
22790 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
227a0 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66  UTF-8 string buf
227b0 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68  fer.** ends with
227c0 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65 70   a directory sep
227d0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
227e0 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63   or one was succ
227f0 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65  essfully.** adde
22800 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  d to it..*/.stat
22810 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e  ic int winMakeEn
22820 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42  dInDirSep(int nB
22830 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
22840 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20  .  if( zBuf ){. 
22850 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71     int nLen = sq
22860 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
22870 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  uf);.    if( nLe
22880 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
22890 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75   winIsDirSep(zBu
228a0 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  f[nLen-1]) ){.  
228b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
228c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
228d0 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20  nLen+1<nBuf ){. 
228e0 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
228f0 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70  ] = winGetDirSep
22900 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66  ();.        zBuf
22910 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nLen+1] = '\0';
22920 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
22930 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
22940 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
22960 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
22970 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65  e name and store
22980 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70   the resulting p
22990 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75  ointer into pzBu
229a0 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  f..** The pointe
229b0 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a  r returned in pz
229c0 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65 65  Buf must be free
229d0 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72  d via sqlite3_fr
229e0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
229f0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
22a00 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
22a10 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42  pVfs, char **pzB
22a20 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
22a30 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
22a40 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
22a50 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
22a60 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
22a70 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
22a80 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
22a90 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
22aa0 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71  .  int nPre = sq
22ab0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
22ac0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
22ad0 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d  REFIX);.  int nM
22ae0 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20  ax, nBuf, nDir, 
22af0 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nLen;.  char *zB
22b00 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  uf;..  /* It's o
22b10 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
22b20 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
22b30 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
22b40 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
22b50 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
22b60 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
22b70 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
22b80 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
22b90 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
22ba0 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53  ailing..  */.  S
22bb0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
22bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
22bd0 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ERR );..  /* All
22be0 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  ocate a temporar
22bf0 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  y buffer to stor
22c00 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  e the fully qual
22c10 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20  ified file.  ** 
22c20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d  name for the tem
22c30 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66  porary file.  If
22c40 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20   this fails, we 
22c50 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e  cannot continue.
22c60 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70  .  */.  nMax = p
22c70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b  Vfs->mxPathname;
22c80 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32   nBuf = nMax + 2
22c90 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74  ;.  zBuf = sqlit
22ca0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
22cb0 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75  uf );.  if( !zBu
22cc0 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  f ){.    OSTRACE
22cd0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
22ce0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
22cf0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
22d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
22d10 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
22d20 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
22d30 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 74   the effective t
22d40 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
22d50 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68 65 63  ry.  First, chec
22d60 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20 68 61  k if one.  ** ha
22d70 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69 74 6c  s been explicitl
22d80 79 20 73 65 74 20 62 79 20 74 68 65 20 61 70 70  y set by the app
22d90 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65 72 77  lication; otherw
22da0 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f 6e 65  ise, use the one
22db0 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64  .  ** configured
22dc0 20 62 79 20 74 68 65 20 6f 70 65 72 61 74 69 6e   by the operatin
22dd0 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  g system..  */. 
22de0 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d 20 28   nDir = nMax - (
22df0 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20 61 73  nPre + 15);.  as
22e00 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29 3b 0a  sert( nDir>0 );.
22e10 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65    if( sqlite3_te
22e20 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29 7b 0a  mp_directory ){.
22e30 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65 6e 20      int nDirLen 
22e40 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
22e50 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64  0(sqlite3_temp_d
22e60 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 69  irectory);.    i
22e70 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29 7b 0a  f( nDirLen>0 ){.
22e80 20 20 20 20 20 20 69 66 28 20 21 77 69 6e 49 73        if( !winIs
22e90 44 69 72 53 65 70 28 73 71 6c 69 74 65 33 5f 74  DirSep(sqlite3_t
22ea0 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b 6e 44  emp_directory[nD
22eb0 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20  irLen-1]) ){.   
22ec0 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b 3b 0a       nDirLen++;.
22ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
22ee0 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72 20 29  ( nDirLen>nDir )
22ef0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22f00 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
22f10 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22f20 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
22f30 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c 6e 22  =SQLITE_ERROR\n"
22f40 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
22f50 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
22f60 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30 2c 20  QLITE_ERROR, 0, 
22f70 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 31  "winGetTempname1
22f80 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", 0);.      }. 
22f90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
22fa0 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
22fb0 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  , "%s", sqlite3_
22fc0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b  temp_directory);
22fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 20 64  .    }.  }.#if d
22fe0 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f  efined(__CYGWIN_
22ff0 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73  _).  else{.    s
23000 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
23010 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
23020 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65        0, /* gete
23030 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49  nv("SQLITE_TMPDI
23040 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  R") */.       0,
23050 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50 44   /* getenv("TMPD
23060 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  IR") */.       0
23070 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d 50  , /* getenv("TMP
23080 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20  ") */.       0, 
23090 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d 50 22  /* getenv("TEMP"
230a0 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c 20 2f  ) */.       0, /
230b0 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  * getenv("USERPR
230c0 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20 20 20  OFILE") */.     
230d0 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
230e0 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
230f0 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a  .       "/tmp",.
23100 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20 20 20         ".",.    
23110 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
23120 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
23130 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75 6e 73  /.    };.    uns
23140 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 20  igned int i;.   
23150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
23160 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  r = 0;..    if( 
23170 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44  !azDirs[0] ) azD
23180 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28  irs[0] = getenv(
23190 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29  "SQLITE_TMPDIR")
231a0 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44 69 72  ;.    if( !azDir
231b0 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
231c0 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
231d0 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  R");.    if( !az
231e0 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73  Dirs[2] ) azDirs
231f0 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [2] = getenv("TM
23200 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a  P");.    if( !az
23210 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69 72 73  Dirs[3] ) azDirs
23220 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 45  [3] = getenv("TE
23230 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61  MP");.    if( !a
23240 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44 69 72  zDirs[4] ) azDir
23250 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28 22 55  s[4] = getenv("U
23260 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a 20 20  SERPROFILE");.  
23270 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
23280 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65  eof(azDirs)/size
23290 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a  of(azDirs[0]); z
232a0 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29  Dir=azDirs[i++])
232b0 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 7a 43  {.      void *zC
232c0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20 20 20  onverted;.      
232d0 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f  if( zDir==0 ) co
232e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 2f 2a  ntinue;.      /*
232f0 20 49 66 20 74 68 65 20 70 61 74 68 20 73 74 61   If the path sta
23300 72 74 73 20 77 69 74 68 20 61 20 64 72 69 76 65  rts with a drive
23310 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77 65 64   letter followed
23320 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a 20 20   by the colon.  
23330 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74 65 72      ** character
23340 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61  , assume it is a
23350 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76 65 20  lready a native 
23360 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74 68 65  Win32 path; othe
23370 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
23380 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e 76 65  it must be conve
23390 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69 76 65  rted to a native
233a0 20 57 69 6e 33 32 20 70 61 74 68 20 76 69 61 20   Win32 path via 
233b0 74 68 65 20 43 79 67 77 69 6e 20 41 50 49 0a 20  the Cygwin API. 
233c0 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f       ** prior to
233d0 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20 20 20   using it..     
233e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 69   */.      if( wi
233f0 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e  nIsDriveLetterAn
23400 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29 7b 0a  dColon(zDir) ){.
23410 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65 72 74          zConvert
23420 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
23430 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
23440 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 69  zDir);.        i
23450 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29  f( !zConverted )
23460 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
23470 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23480 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
23490 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
234a0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
234b0 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
234c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
234d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
234e0 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  M;.        }.   
234f0 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44 69       if( winIsDi
23500 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b  r(zConverted) ){
23510 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23520 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
23530 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 44  , zBuf, "%s", zD
23540 69 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ir);.          s
23550 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
23560 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
23570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23580 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
23590 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
235a0 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ted);.      }els
235b0 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76  e{.        zConv
235c0 65 72 74 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  erted = sqlite3M
235d0 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2b  allocZero( nMax+
235e0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
235f0 20 21 7a 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a   !zConverted ){.
23600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23610 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
23620 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
23630 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
23640 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
23650 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
23660 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23670 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
23680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
23690 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f     if( cygwin_co
236a0 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20  nv_path(.       
236b0 20 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28           osIsNT(
236c0 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
236d0 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
236e0 49 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69  IX_TO_WIN_A, zDi
236f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
23700 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e     zConverted, n
23710 4d 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20  Max+1)<0 ){.    
23720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23730 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
23740 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23750 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20  3_free(zBuf);.  
23760 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
23770 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
23780 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
23790 43 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20  CONVPATH\n"));. 
237a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
237b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
237c0 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
237d0 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c  H, (DWORD)errno,
237e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
237f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
23800 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
23810 20 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20   zDir);.        
23820 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69  }.        if( wi
23830 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65  nIsDir(zConverte
23840 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  d) ){.          
23850 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
23860 2c 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61  , we know the ca
23870 6e 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72  ndidate director
23880 79 20 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f  y exists and sho
23890 75 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  uld.          **
238a0 20 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76   be used.  Howev
238b0 65 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20  er, we may need 
238c0 74 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73  to convert the s
238d0 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
238e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
238f0 73 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d  s name into UTF-
23900 38 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73  8 (i.e. if it is
23910 20 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f   UTF-16 right no
23920 77 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  w)..          */
23930 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
23940 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76  *zUtf8 = winConv
23950 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
23960 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
23970 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 55           if( !zU
23980 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tf8 ){.         
23990 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
239a0 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
239b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
239c0 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
239d0 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45           OSTRACE
239e0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
239f0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
23a00 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
23a10 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23a20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23a30 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  EM;.          }.
23a40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23a50 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
23a60 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74   zBuf, "%s", zUt
23a70 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
23a80 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74 66  qlite3_free(zUtf
23a90 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  8);.          sq
23aa0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
23ab0 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
23ac0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23ad0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
23ae0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
23af0 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ed);.      }.   
23b00 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53 51   }.  }.#elif !SQ
23b10 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
23b20 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57   !defined(__CYGW
23b30 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  IN__).  else if(
23b40 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
23b50 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a 20   char *zMulti;. 
23b60 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65 50     LPWSTR zWideP
23b70 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ath = sqlite3Mal
23b80 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73 69  locZero( nMax*si
23b90 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20  zeof(WCHAR) );. 
23ba0 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61 74     if( !zWidePat
23bb0 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  h ){.      sqlit
23bc0 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
23bd0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23be0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23bf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23c00 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
23c10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
23c20 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
23c30 20 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d      if( osGetTem
23c40 70 50 61 74 68 57 28 6e 4d 61 78 2c 20 7a 57 69  pPathW(nMax, zWi
23c50 64 65 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20  dePath)==0 ){.  
23c60 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23c70 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20  (zWidePath);.   
23c80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23c90 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
23ca0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
23cb0 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
23cc0 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
23cd0 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
23ce0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
23cf0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
23d00 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
23d10 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
23d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d30 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
23d40 6e 61 6d 65 32 22 2c 20 30 29 3b 0a 20 20 20 20  name2", 0);.    
23d50 7d 0a 20 20 20 20 7a 4d 75 6c 74 69 20 3d 20 77  }.    zMulti = w
23d60 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
23d70 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
23d80 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
23d90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23da0 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
23db0 20 22 25 73 22 2c 20 7a 4d 75 6c 74 69 29 3b 0a   "%s", zMulti);.
23dc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23dd0 65 65 28 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20  ee(zMulti);.    
23de0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
23df0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 7d  WidePath);.    }
23e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
23e10 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61  te3_free(zWidePa
23e20 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  th);.      sqlit
23e30 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
23e40 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
23e50 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
23e60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
23e70 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
23e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
23e90 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
23ea0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
23eb0 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49  E_WIN32_HAS_ANSI
23ec0 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61  .  else{.    cha
23ed0 72 20 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68  r *zUtf8;.    ch
23ee0 61 72 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20  ar *zMbcsPath = 
23ef0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
23f00 6f 28 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69  o( nMax );.    i
23f10 66 28 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b  f( !zMbcsPath ){
23f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23f30 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20  ree(zBuf);.     
23f40 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d   OSTRACE(("TEMP-
23f50 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49  FILENAME rc=SQLI
23f60 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
23f70 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  "));.      retur
23f80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
23f90 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
23fa0 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
23fb0 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61  hA(nMax, zMbcsPa
23fc0 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
23fd0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
23fe0 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
23ff0 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24000 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24010 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
24020 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24030 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24040 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
24050 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
24060 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
24070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24080 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
24090 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e3", 0);.    }. 
240a0 20 20 20 7a 55 74 66 38 20 3d 20 73 71 6c 69 74     zUtf8 = sqlit
240b0 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
240c0 5f 75 74 66 38 28 7a 4d 62 63 73 50 61 74 68 29  _utf8(zMbcsPath)
240d0 3b 0a 20 20 20 20 69 66 28 20 7a 55 74 66 38 20  ;.    if( zUtf8 
240e0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
240f0 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20  _snprintf(nMax, 
24100 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55 74 66  zBuf, "%s", zUtf
24110 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  8);.      sqlite
24120 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a 20  3_free(zUtf8);. 
24130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
24150 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
24160 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24170 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24180 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20  R_NOMEM\n"));.  
24190 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
241a0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
241b0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
241c0 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
241d0 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64  HAS_ANSI */.#end
241e0 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
241f0 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a  _WINRT */..  /*.
24200 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
24210 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70  ke sure the temp
24220 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
24230 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70  ends with an app
24240 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65  ropriate.  ** se
24250 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  parator.  If it 
24260 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65  does not and the
24270 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
24280 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61   space left to a
24290 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69  dd.  ** one, fai
242a0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77  l..  */.  if( !w
242b0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
242c0 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20  p(nDir+1, zBuf) 
242d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
242e0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
242f0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
24300 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
24310 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
24320 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
24330 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
24340 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
24350 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a  name4", 0);.  }.
24360 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
24370 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
24380 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
24390 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
243a0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20  temporary file. 
243b0 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20   ** name in the 
243c0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
243d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c  :.  **.  **   "<
243e0 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
243f0 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58  ory>/etilqs_XXXX
24400 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22  XXXXXXXXXXX\0\0"
24410 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f  .  **.  ** If no
24420 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
24430 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d  _ERROR.  The num
24440 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68  ber 17 is used h
24450 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ere in order to.
24460 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72    ** account for
24470 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
24480 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63  by the 15 charac
24490 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69  ter random suffi
244a0 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74  x and the.  ** t
244b0 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20  wo trailing NUL 
244c0 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65  characters.  The
244d0 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79   final directory
244e0 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
244f0 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c  cter.  ** has al
24500 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69  ready added if i
24510 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t was not alread
24520 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a  y present..  */.
24530 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33    nLen = sqlite3
24540 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
24550 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50    if( (nLen + nP
24560 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20  re + 17) > nBuf 
24570 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24580 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
24590 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
245a0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
245b0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
245c0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
245d0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
245e0 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
245f0 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a  name5", 0);.  }.
24600 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
24610 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e  ntf(nBuf-16-nLen
24620 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
24630 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
24640 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
24650 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
24660 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
24670 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
24680 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
24690 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
246a0 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
246b0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
246c0 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
246d0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
246e0 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
246f0 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
24700 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
24710 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
24720 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
24730 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
24740 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
24750 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
24760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24770 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
24780 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
24790 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
247a0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
247b0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
247c0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
247d0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
247e0 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
247f0 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
24800 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
24810 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
24820 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
24830 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
24840 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
24850 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
24860 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
24870 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
24880 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
24890 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
248a0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
248b0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
248c0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
248d0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
248e0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
248f0 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
24900 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
24910 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
24920 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
24930 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
24940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
24960 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
24970 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
24980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24990 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
249a0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
249b0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
249c0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
249d0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
249e0 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
249f0 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
24a00 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
24a10 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
24a20 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
24a30 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
24a40 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
24a50 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
24a60 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
24a70 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
24a80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
24a90 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
24aa0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
24ab0 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
24ac0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
24ad0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
24ae0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
24af0 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
24b00 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
24b10 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73  fs,        /* Us
24b20 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75  ed to get maximu
24b30 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67  m path name leng
24b40 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  th */.  const ch
24b50 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
24b60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
24b70 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
24b80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
24b90 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
24ba0 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
24bb0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
24bc0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
24bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24be0 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
24bf0 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
24c00 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
24c10 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
24c20 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
24c30 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
24c40 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
24c50 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  0;.  DWORD dwDes
24c60 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
24c70 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
24c80 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
24c90 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
24ca0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
24cb0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
24cc0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
24cd0 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
24ce0 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
24cf0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
24d00 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
24d10 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
24d20 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
24d30 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
24d40 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
24d50 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
24d60 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
24d70 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
24d80 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
24d90 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
24da0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
24db0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
24dc0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
24dd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
24de0 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
24df0 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
24e00 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
24e10 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
24e20 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
24e30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70   */.  char *zTmp
24e40 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72  name = 0; /* For
24e50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
24e60 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72  ame, if necessar
24e70 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  y. */..  int rc 
24e80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
24e90 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
24ea0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
24eb0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
24ec0 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
24ed0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
24ee0 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
24ef0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
24f00 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
24f10 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
24f20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
24f30 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
24f40 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
24f50 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
24f60 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
24f70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
24f80 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
24f90 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
24fa0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
24fb0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
24fc0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
24fd0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
24fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
24ff0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
25000 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
25010 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
25020 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
25030 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
25040 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
25050 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
25060 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
25070 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
25080 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  TER_JOURNAL.    
25090 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
250a0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
250b0 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
250c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
250d0 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
250e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
250f0 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65  N name=%s, pFile
25100 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%p, flags=%x, p
25110 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a  OutFlags=%p\n",.
25120 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38             zUtf8
25130 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c  Name, id, flags,
25140 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20   pOutFlags));.. 
25150 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
25160 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
25170 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ts are true:.  *
25180 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
25190 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
251a0 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
251b0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
251c0 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  t be set, and.  
251d0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
251e0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
251f0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
25200 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
25210 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
25220 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
25230 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
25240 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
25250 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
25260 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
25270 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
25280 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
25290 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
252a0 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
252b0 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
252c0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
252d0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
252e0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
252f0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
25300 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
25310 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
25320 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
25330 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
25340 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
25350 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
25360 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
25370 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
25380 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
25390 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f   never.  ** auto
253a0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
253b0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
253c0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
253d0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
253e0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
253f0 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25400 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25410 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
25420 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25430 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25440 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25450 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
25460 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25470 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
25480 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
25490 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
254a0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
254b0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
254c0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
254d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
254e0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
254f0 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
25500 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
25510 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
25520 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
25530 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
25540 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
25550 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
25560 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
25570 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65  P_DB.       || e
25580 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25590 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
255a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
255b0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
255c0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  L.       || eTyp
255d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
255e0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
255f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25600 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
25610 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
25620 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
25630 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
25640 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
25650 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73  _WAL.  );..  ass
25660 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
25670 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
25680 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69   0, sizeof(winFi
25690 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  le));.  pFile->h
256a0 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
256b0 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51  E_VALUE;..#if SQ
256c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
256d0 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26  if( !zUtf8Name &
256e0 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  & !sqlite3_temp_
256f0 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
25700 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
25710 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20  ITE_ERROR,.     
25720 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70     "sqlite3_temp
25730 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61  _directory varia
25740 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65  ble should be se
25750 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20  t for WinRT");. 
25760 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25770 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
25780 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
25790 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
257a0 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a   generate a.  **
257b0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
257c0 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f  name to use.  */
257d0 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
257e0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
257f0 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73   isDelete && !is
25800 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  OpenJournal );. 
25810 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65     rc = winGetTe
25820 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54  mpname(pVfs, &zT
25830 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
25840 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25850 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
25860 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
25870 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d  rc=%s", zUtf8Nam
25880 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
25890 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
258a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
258b0 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20      zUtf8Name = 
258c0 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
258d0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
258e0 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
258f0 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
25900 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
25910 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68  t.  ** URIs with
25920 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
25930 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
25940 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
25950 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
25960 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
25970 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25980 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
25990 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c  OPEN_MAIN_DB) ||
259a0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
259b0 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20  _OPEN_URI) ||.  
259c0 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73       zUtf8Name[s
259d0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
259e0 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  Utf8Name)+1]==0 
259f0 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
25a00 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
25a10 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
25a20 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
25a30 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
25a40 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
25a50 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
25a60 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
25a70 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
25a80 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
25a90 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
25aa0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
25ab0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
25ac0 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  MEM", zUtf8Name)
25ad0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25ae0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
25af0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77 69 6e  ;.  }..  if( win
25b00 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
25b10 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
25b20 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
25b30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
25b40 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
25b50 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
25b60 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
25b70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
25b80 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  DIR", zUtf8Name)
25b90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
25ba0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53  LITE_CANTOPEN_IS
25bb0 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  DIR;.  }..  if( 
25bc0 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20  isReadWrite ){. 
25bd0 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65     dwDesiredAcce
25be0 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41  ss = GENERIC_REA
25bf0 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
25c00 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
25c10 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73 20  dwDesiredAccess 
25c20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44 3b 0a  = GENERIC_READ;.
25c30 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49 54 45    }..  /* SQLITE
25c40 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
25c50 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  is used to make 
25c60 73 75 72 65 20 74 68 61 74 20 61 20 6e 65 77 20  sure that a new 
25c70 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63 72 65  file is.  ** cre
25c80 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64 6f 65  ated. SQLite doe
25c90 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f 20 69  sn't use it to i
25ca0 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75 73 69  ndicate "exclusi
25cb0 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a 2a 20  ve access".  ** 
25cc0 61 73 20 69 74 20 69 73 20 75 73 75 61 6c 6c 79  as it is usually
25cd0 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20 20 2a   understood..  *
25ce0 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73  /.  if( isExclus
25cf0 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20 43 72  ive ){.    /* Cr
25d00 65 61 74 65 73 20 61 20 6e 65 77 20 66 69 6c 65  eates a new file
25d10 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64 6f 65  , only if it doe
25d20 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
25d30 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  ist. */.    /* I
25d40 66 20 74 68 65 20 66 69 6c 65 20 65 78 69 73 74  f the file exist
25d50 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a 2f 0a  s, it fails. */.
25d60 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
25d70 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52 45 41  sposition = CREA
25d80 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73 65 20  TE_NEW;.  }else 
25d90 69 66 28 20 69 73 43 72 65 61 74 65 20 29 7b 0a  if( isCreate ){.
25da0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78 69 73      /* Open exis
25db0 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20 63 72  ting file, or cr
25dc0 65 61 74 65 20 69 66 20 69 74 20 64 6f 65 73 6e  eate if it doesn
25dd0 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20 20 20  't exist */.    
25de0 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73  dwCreationDispos
25df0 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41 4c 57  ition = OPEN_ALW
25e00 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  AYS;.  }else{.  
25e10 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66 69 6c    /* Opens a fil
25e20 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 65 78  e, only if it ex
25e30 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64 77 43  ists. */.    dwC
25e40 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69  reationDispositi
25e50 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53 54 49  on = OPEN_EXISTI
25e60 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53 68 61  NG;.  }..  dwSha
25e70 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f 53 48  reMode = FILE_SH
25e80 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
25e90 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a 20 20  SHARE_WRITE;..  
25ea0 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a  if( isDelete ){.
25eb0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
25ec0 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67 73 41  NCE.    dwFlagsA
25ed0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46  ndAttributes = F
25ee0 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 48 49  ILE_ATTRIBUTE_HI
25ef0 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65 6d 70  DDEN;.    isTemp
25f00 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20   = 1;.#else.    
25f10 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62  dwFlagsAndAttrib
25f20 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54 54 52  utes = FILE_ATTR
25f30 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 0a  IBUTE_TEMPORARY.
25f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
25f60 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
25f70 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20 20 20  HIDDEN.         
25f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f90 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41        | FILE_FLA
25fa0 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53  G_DELETE_ON_CLOS
25fb0 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  E;.#endif.  }els
25fc0 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e  e{.    dwFlagsAn
25fd0 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 46 49  dAttributes = FI
25fe0 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52  LE_ATTRIBUTE_NOR
25ff0 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20 52 65  MAL;.  }.  /* Re
26000 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65 20 69  ports from the i
26010 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68 61 74  nternet are that
26020 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 73 20   performance is 
26030 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65 74 74  always.  ** bett
26040 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41 47 5f  er if FILE_FLAG_
26050 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 69 73  RANDOM_ACCESS is
26060 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74 20 23   used.  Ticket #
26070 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53 51 4c  2699. */.#if SQL
26080 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 64  ITE_OS_WINCE.  d
26090 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
260a0 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c 41 47  tes |= FILE_FLAG
260b0 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a  _RANDOM_ACCESS;.
260c0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6f 73  #endif..  if( os
260d0 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
260e0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
260f0 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58    CREATEFILE2_EX
26100 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
26110 53 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65  S extendedParame
26120 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65 6e 64  ters;.    extend
26130 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 53  edParameters.dwS
26140 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43 52 45  ize = sizeof(CRE
26150 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44 45  ATEFILE2_EXTENDE
26160 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b 0a 20  D_PARAMETERS);. 
26170 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
26180 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74 74 72  eters.dwFileAttr
26190 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20 20 20  ibutes =.       
261a0 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41       dwFlagsAndA
261b0 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c 45  ttributes & FILE
261c0 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53 4b 3b  _ATTRIBUTE_MASK;
261d0 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
261e0 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 46 6c  ameters.dwFileFl
261f0 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41 6e 64  ags = dwFlagsAnd
26200 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49 4c  Attributes & FIL
26210 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20 20 20  E_FLAG_MASK;.   
26220 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
26230 65 72 73 2e 64 77 53 65 63 75 72 69 74 79 51 6f  ers.dwSecurityQo
26240 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52 49 54  sFlags = SECURIT
26250 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20 20 20  Y_ANONYMOUS;.   
26260 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74   extendedParamet
26270 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79 41 74  ers.lpSecurityAt
26280 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c 4c 3b  tributes = NULL;
26290 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
262a0 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c 61 74  ameters.hTemplat
262b0 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  eFile = NULL;.  
262c0 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f 73    while( (h = os
262d0 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c 50 43  CreateFile2((LPC
262e0 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
262f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26310 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
26320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
26340 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20 20 20  ShareMode,.     
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 43 72 65 61 74           dwCreat
26370 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a  ionDisposition,.
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 20 20 20 20 20 20 26 65                &e
263a0 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
263b0 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  s))==INVALID_HAN
263c0 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263e0 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
263f0 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
26400 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
26410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26420 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23 65  Noop */.    }.#e
26430 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 28  lse.    while( (
26440 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
26450 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
26460 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20  erted,.         
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26480 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
26490 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  cess,.          
264a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264b0 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c      dwShareMode,
264c0 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20   NULL,.         
264d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
264e0 20 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44       dwCreationD
264f0 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20  isposition,.    
26500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26510 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
26520 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a  sAndAttributes,.
26530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
26550 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  LL))==INVALID_HA
26560 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20  NDLE_VALUE &&.  
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52              winR
26590 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
265a0 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
265c0 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 23   Noop */.    }.#
265d0 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64 65 66  endif.  }.#ifdef
265e0 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
265f0 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
26600 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20 6f     while( (h = o
26610 73 43 72 65 61 74 65 46 69 6c 65 41 28 28 4c 50  sCreateFileA((LP
26620 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  CSTR)zConverted,
26630 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26650 77 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 0a  wDesiredAccess,.
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
26680 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c 4c 2c  ShareMode, NULL,
26690 0a 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 20 20 20 20 20 20 64                 d
266b0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
266c0 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
266d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266e0 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74      dwFlagsAndAt
266f0 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20 20 20  tributes,.      
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26710 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29 3d 3d          NULL))==
26720 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
26730 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20 20 20  ALUE &&.        
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 20 20 20 20 77 69 6e 52 65 74 72 79 49 6f        winRetryIo
26760 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45  err(&cnt, &lastE
26770 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  rrno) ){.       
26780 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f 70 20          /* Noop 
26790 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  */.    }.  }.#en
267a0 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72  dif.  winLogIoer
267b0 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  r(cnt, __LINE__)
267c0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
267d0 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e 61 6d  PEN file=%p, nam
267e0 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25 6c 78  e=%s, access=%lx
267f0 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a  , rc=%s\n", h, z
26800 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20 20 20  Utf8Name,.      
26810 20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63       dwDesiredAc
26820 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41 4c 49  cess, (h==INVALI
26830 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 29 20  D_HANDLE_VALUE) 
26840 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22 6f 6b  ? "failed" : "ok
26850 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d 3d 49  "));..  if( h==I
26860 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
26870 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  LUE ){.    pFile
26880 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61  ->lastErrno = la
26890 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69 6e  stErrno;.    win
268a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
268b0 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c 65 2d  CANTOPEN, pFile-
268c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77 69 6e  >lastErrno, "win
268d0 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61 6d 65  Open", zUtf8Name
268e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
268f0 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  ree(zConverted);
26900 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
26910 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 20  e(zTmpname);.   
26920 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
26930 20 26 26 20 21 69 73 45 78 63 6c 75 73 69 76 65   && !isExclusive
26940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
26950 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c 20 7a   winOpen(pVfs, z
26960 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20  Name, id,.      
26970 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c 49 54     ((flags|SQLIT
26980 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29  E_OPEN_READONLY)
26990 20 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   &.             
269a0 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49 54 45          ~(SQLITE
269b0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53 51 4c  _OPEN_CREATE|SQL
269c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
269d0 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20 20 70  TE)),.         p
269e0 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20 20 7d  OutFlags);.    }
269f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
26a00 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
26a10 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
26a20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   }..  if( pOutFl
26a30 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ags ){.    if( i
26a40 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
26a50 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d      *pOutFlags =
26a60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
26a70 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  DWRITE;.    }els
26a80 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  e{.      *pOutFl
26a90 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
26aa0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
26ab0 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45  }.  }..  OSTRACE
26ac0 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c  (("OPEN file=%p,
26ad0 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73   name=%s, access
26ae0 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67 73 3d  =%lx, pOutFlags=
26af0 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73 3d 25  %p, *pOutFlags=%
26b00 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  d, ".           
26b10 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20 7a 55  "rc=%s\n", h, zU
26b20 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73 69 72  tf8Name, dwDesir
26b30 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74 46 6c  edAccess, pOutFl
26b40 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 20 3f  ags, pOutFlags ?
26b50 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70 4f 75  .           *pOu
26b60 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68 3d 3d  tFlags : 0, (h==
26b70 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
26b80 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22  ALUE) ? "failed"
26b90 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69 66 20   : "ok"));..#if 
26ba0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
26bb0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
26bc0 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51 4c 49  e && eType==SQLI
26bd0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 0a  TE_OPEN_MAIN_DB.
26be0 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
26bf0 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 28  winceCreateLock(
26c00 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29 21 3d  zName, pFile))!=
26c10 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b 0a 20  SQLITE_OK.  ){. 
26c20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65     osCloseHandle
26c30 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (h);.    sqlite3
26c40 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
26c50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
26c60 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
26c70 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
26c80 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65 3d 25  N-CE-LOCK name=%
26c90 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 4e 61  s, rc=%s\n", zNa
26ca0 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  me, sqlite3ErrNa
26cb0 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 72 65  me(rc)));.    re
26cc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
26cd0 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20 20 20  f( isTemp ){.   
26ce0 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
26cf0 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76 65 72  nClose = zConver
26d00 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e  ted;.  }else.#en
26d10 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69  dif.  {.    sqli
26d20 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
26d30 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  ted);.  }..  sql
26d40 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61  ite3_free(zTmpna
26d50 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  me);.  pFile->pM
26d60 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f 4d 65  ethod = &winIoMe
26d70 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  thod;.  pFile->p
26d80 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 46  Vfs = pVfs;.  pF
26d90 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 66  ile->h = h;.  if
26da0 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a  ( isReadonly ){.
26db0 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
26dc0 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c 45 5f  lags |= WINFILE_
26dd0 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  RDONLY;.  }.  if
26de0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
26df0 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22 70 73  olean(zName, "ps
26e00 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
26e10 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
26e20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63   ){.    pFile->c
26e30 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46  trlFlags |= WINF
26e40 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
26e50 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
26e60 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 70   = NO_ERROR;.  p
26e70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 7a 4e  File->zPath = zN
26e80 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ame;.#if SQLITE_
26e90 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
26ea0 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20 3d 20    pFile->hMap = 
26eb0 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  NULL;.  pFile->p
26ec0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
26ed0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
26ee0 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d   = 0;.  pFile->m
26ef0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
26f00 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  0;.  pFile->mmap
26f10 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65  SizeMax = sqlite
26f20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
26f30 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Mmap;.#endif..  
26f40 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
26f50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26f60 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
26f70 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2a  e named file..**
26f80 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 57 69  .** Note that Wi
26f90 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74 20 61  ndows does not a
26fa0 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f 20 62  llow a file to b
26fb0 65 20 64 65 6c 65 74 65 64 20 69 66 20 73 6f 6d  e deleted if som
26fc0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
26fd0 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e 2e 20  ss has it open. 
26fe0 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76 69 72   Sometimes a vir
26ff0 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20 69 6e  us scanner or in
27000 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d 0a 2a  dexing program.*
27010 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20 6a 6f  * will open a jo
27020 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f 72 74  urnal file short
27030 6c 79 20 61 66 74 65 72 20 69 74 20 69 73 20 63  ly after it is c
27040 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65 72 20  reated in order 
27050 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65 76 65  to do.** whateve
27060 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68 69 6c  r it does.  Whil
27070 65 20 74 68 69 73 20 6f 74 68 65 72 20 70 72 6f  e this other pro
27080 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
27090 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70 65 6e  the.** file open
270a0 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75 6e 61  , we will be una
270b0 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 69 74  ble to delete it
270c0 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
270d0 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62 6c 65  d this.** proble
270e0 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30 30 20  m, we delay 100 
270f0 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e 64  milliseconds and
27100 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65 20 61   try to delete a
27110 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74 6f 20  gain.  Up.** to 
27120 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54 54 45  MX_DELETION_ATTE
27130 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20 61 74  MPTs deletion at
27140 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e 20 62  tempts are run b
27150 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a 2a 20  efore giving.** 
27160 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  up and returning
27170 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   an error..*/.st
27180 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65  atic int winDele
27190 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
271a0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
271b0 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e    /* Not used on
271c0 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f 6e 73   win32 */.  cons
271d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
271e0 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  e,      /* Name 
271f0 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74  of file to delet
27200 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44  e */.  int syncD
27210 69 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ir              
27220 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 6f     /* Not used o
27230 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a 20 20  n win32 */.){.  
27240 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69  int cnt = 0;.  i
27250 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44 20 61  nt rc;.  DWORD a
27260 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  ttr;.  DWORD las
27270 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f  tErrno = 0;.  vo
27280 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a  id *zConverted;.
27290 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
272a0 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e 55 53  ER(pVfs);.  UNUS
272b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73 79 6e  ED_PARAMETER(syn
272c0 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75 6c 61  cDir);..  Simula
272d0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
272e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
272f0 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41 43 45  LETE);.  OSTRACE
27300 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
27310 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c 6e 22  s, syncDir=%d\n"
27320 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 79 6e  , zFilename, syn
27330 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76  cDir));..  zConv
27340 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
27350 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
27360 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
27370 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
27380 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
27390 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d  E(("DELETE name=
273a0 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %s, rc=SQLITE_IO
273b0 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46  ERR_NOMEM\n", zF
273c0 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72  ilename));.    r
273d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
273e0 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  RR_NOMEM;.  }.  
273f0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
27400 20 20 20 20 64 6f 20 7b 0a 23 69 66 20 53 51 4c      do {.#if SQL
27410 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
27420 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
27430 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
27440 74 72 44 61 74 61 3b 0a 20 20 20 20 20 20 6d 65  trData;.      me
27450 6d 73 65 74 28 26 73 41 74 74 72 44 61 74 61 2c  mset(&sAttrData,
27460 20 30 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72   0, sizeof(sAttr
27470 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 69 66  Data));.      if
27480 20 28 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72   ( osGetFileAttr
27490 69 62 75 74 65 73 45 78 57 28 7a 43 6f 6e 76 65  ibutesExW(zConve
274a0 72 74 65 64 2c 20 47 65 74 46 69 6c 65 45 78 49  rted, GetFileExI
274b0 6e 66 6f 53 74 61 6e 64 61 72 64 2c 0a 20 20 20  nfoStandard,.   
274c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
274d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
274e0 73 41 74 74 72 44 61 74 61 29 20 29 7b 0a 20 20  sAttrData) ){.  
274f0 20 20 20 20 20 20 61 74 74 72 20 3d 20 73 41 74        attr = sAt
27500 74 72 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74  trData.dwFileAtt
27510 72 69 62 75 74 65 73 3b 0a 20 20 20 20 20 20 7d  ributes;.      }
27520 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6c 61  else{.        la
27530 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
27540 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
27550 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
27560 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f  o==ERROR_FILE_NO
27570 54 5f 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20  T_FOUND.        
27580 20 7c 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45   || lastErrno==E
27590 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
275a0 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  UND ){.         
275b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
275c0 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b  RR_DELETE_NOENT;
275d0 20 2f 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65   /* Already gone
275e0 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  ? */.        }el
275f0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
27600 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
27610 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27620 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27630 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 61 74  }.#else.      at
27640 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  tr = osGetFileAt
27650 74 72 69 62 75 74 65 73 57 28 7a 43 6f 6e 76 65  tributesW(zConve
27660 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
27670 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d 49      if ( attr==I
27680 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
27690 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20 20  IBUTES ){.      
276a0 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
276b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
276c0 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73 74          if( last
276d0 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49 4c  Errno==ERROR_FIL
276e0 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20 20  E_NOT_FOUND.    
276f0 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72 6e       || lastErrn
27700 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e 4f  o==ERROR_PATH_NO
27710 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20 20  T_FOUND ){.     
27720 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
27730 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f  _IOERR_DELETE_NO
27740 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79 20  ENT; /* Already 
27750 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20 20  gone? */.       
27760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27770 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
27780 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
27790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
277a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
277b0 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49   attr&FILE_ATTRI
277c0 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20 29  BUTE_DIRECTORY )
277d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
277e0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
277f0 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a 20  Files only. */. 
27800 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
27810 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
27820 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 7a   osDeleteFileW(z
27830 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20 20  Converted) ){.  
27840 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
27850 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65 64  E_OK; /* Deleted
27860 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   OK. */.        
27870 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
27880 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52 65       if ( !winRe
27890 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
278a0 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
278b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
278c0 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20 6d  E_ERROR; /* No m
278d0 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f 0a  ore retries. */.
278e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
278f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68 69       }.    } whi
27900 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 69 66 64 65  le(1);.  }.#ifde
27910 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
27920 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
27930 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 61      do {.      a
27940 74 74 72 20 3d 20 6f 73 47 65 74 46 69 6c 65 41  ttr = osGetFileA
27950 74 74 72 69 62 75 74 65 73 41 28 7a 43 6f 6e 76  ttributesA(zConv
27960 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 69 66  erted);.      if
27970 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
27980 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
27990 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
279a0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
279b0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
279c0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
279d0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
279e0 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
279f0 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
27a00 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
27a10 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
27a20 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
27a30 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
27a40 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
27a50 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
27a60 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
27a70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
27a80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27a90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27aa0 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
27ab0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
27ac0 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
27ad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27ae0 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
27af0 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
27b00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27b10 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
27b20 65 74 65 46 69 6c 65 41 28 7a 43 6f 6e 76 65 72  eteFileA(zConver
27b30 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
27b40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
27b50 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
27b60 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
27b70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
27b80 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
27b90 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
27ba0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
27bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
27bc0 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
27bd0 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
27be0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
27bf0 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
27c00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
27c10 28 20 72 63 20 26 26 20 72 63 21 3d 53 51 4c 49  ( rc && rc!=SQLI
27c20 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
27c30 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 72 63 20  NOENT ){.    rc 
27c40 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  = winLogError(SQ
27c50 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
27c60 45 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  E, lastErrno, "w
27c70 69 6e 44 65 6c 65 74 65 22 2c 20 7a 46 69 6c 65  inDelete", zFile
27c80 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
27c90 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28      winLogIoerr(
27ca0 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  cnt, __LINE__);.
27cb0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
27cc0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
27cd0 20 20 4f 53 54 52 41 43 45 28 28 22 44 45 4c 45    OSTRACE(("DELE
27ce0 54 45 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 25  TE name=%s, rc=%
27cf0 73 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  s\n", zFilename,
27d00 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
27d10 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
27d20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  rc;.}../*.** Che
27d30 63 6b 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  ck the existence
27d40 20 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61   and status of a
27d50 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
27d60 20 69 6e 74 20 77 69 6e 41 63 63 65 73 73 28 0a   int winAccess(.
27d70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
27d80 56 66 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Vfs,         /* 
27d90 4e 6f 74 20 75 73 65 64 20 6f 6e 20 77 69 6e 33  Not used on win3
27da0 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
27db0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
27dc0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
27dd0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
27de0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
27df0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79             /* Ty
27e00 70 65 20 6f 66 20 74 65 73 74 20 74 6f 20 6d 61  pe of test to ma
27e10 6b 65 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ke on this file 
27e20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  */.  int *pResOu
27e30 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
27e40 2f 2a 20 4f 55 54 3a 20 52 65 73 75 6c 74 20 2a  /* OUT: Result *
27e50 2f 0a 29 7b 0a 20 20 44 57 4f 52 44 20 61 74 74  /.){.  DWORD att
27e60 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  r;.  int rc = 0;
27e70 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
27e80 6e 6f 20 3d 20 30 3b 0a 20 20 76 6f 69 64 20 2a  no = 0;.  void *
27e90 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 55 4e  zConverted;.  UN
27ea0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
27eb0 56 66 73 29 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  Vfs);..  Simulat
27ec0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
27ed0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
27ee0 43 45 53 53 3b 20 29 3b 0a 20 20 4f 53 54 52 41  CESS; );.  OSTRA
27ef0 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
27f00 3d 25 73 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%s, flags=%x, p
27f10 52 65 73 4f 75 74 3d 25 70 5c 6e 22 2c 0a 20 20  ResOut=%p\n",.  
27f20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61           zFilena
27f30 6d 65 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f  me, flags, pResO
27f40 75 74 29 29 3b 0a 0a 20 20 7a 43 6f 6e 76 65 72  ut));..  zConver
27f50 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
27f60 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
27f70 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
27f80 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
27f90 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
27fa0 28 22 41 43 43 45 53 53 20 6e 61 6d 65 3d 25 73  ("ACCESS name=%s
27fb0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  , rc=SQLITE_IOER
27fc0 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20 7a 46 69 6c  R_NOMEM\n", zFil
27fd0 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74  ename));.    ret
27fe0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
27ff0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66  _NOMEM;.  }.  if
28000 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
28010 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
28020 20 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54     WIN32_FILE_AT
28030 54 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74  TRIBUTE_DATA sAt
28040 74 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73  trData;.    mems
28050 65 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30  et(&sAttrData, 0
28060 2c 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61  , sizeof(sAttrDa
28070 74 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ta));.    while(
28080 20 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c   !(rc = osGetFil
28090 65 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28  eAttributesExW((
280a0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
280b0 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 20 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74   GetFileExInfoSt
280e0 61 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20  andard,.        
280f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28100 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29       &sAttrData)
28110 29 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65  ) && winRetryIoe
28120 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
28130 72 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28  rno) ){}.    if(
28140 20 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20   rc ){.      /* 
28150 46 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43  For an SQLITE_AC
28160 43 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72  CESS_EXISTS quer
28170 79 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d  y, treat a zero-
28180 6c 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20  length file.    
28190 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f    ** as if it do
281a0 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20  es not exist..  
281b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
281c0 20 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54      flags==SQLIT
281d0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a  E_ACCESS_EXISTS.
281e0 20 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74            && sAt
281f0 74 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65  trData.nFileSize
28200 48 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20 20  High==0.        
28210 20 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e    && sAttrData.n
28220 46 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29  FileSizeLow==0 )
28230 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d  {.        attr =
28240 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54   INVALID_FILE_AT
28250 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20  TRIBUTES;.      
28260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
28270 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e  ttr = sAttrData.
28280 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  dwFileAttributes
28290 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
282a0 6c 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  lse{.      winLo
282b0 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49  gIoerr(cnt, __LI
282c0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66 28  NE__);.      if(
282d0 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f   lastErrno!=ERRO
282e0 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44  R_FILE_NOT_FOUND
282f0 20 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45   && lastErrno!=E
28300 52 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f  RROR_PATH_NOT_FO
28310 55 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73  UND ){.        s
28320 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
28330 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
28340 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
28350 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
28360 5f 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72  _ACCESS, lastErr
28370 6e 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c  no, "winAccess",
28380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28390 20 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c              zFil
283a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
283b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74  lse{.        att
283c0 72 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45  r = INVALID_FILE
283d0 5f 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20  _ATTRIBUTES;.   
283e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
283f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
28400 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
28410 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f  se{.    attr = o
28420 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
28430 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76  esA((char*)zConv
28440 65 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  erted);.  }.#end
28450 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  if.  sqlite3_fre
28460 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
28470 20 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29   switch( flags )
28480 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
28490 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
284a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
284b0 43 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20  CCESS_EXISTS:.  
284c0 20 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49      rc = attr!=I
284d0 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52  NVALID_FILE_ATTR
284e0 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72  IBUTES;.      br
284f0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
28500 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
28510 57 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20  WRITE:.      rc 
28520 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f  = attr!=INVALID_
28530 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20  FILE_ATTRIBUTES 
28540 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
28550 28 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54  (attr & FILE_ATT
28560 52 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29  RIBUTE_READONLY)
28570 3d 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ==0;.      break
28580 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
28590 20 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e       assert(!"In
285a0 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75  valid flags argu
285b0 6d 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70  ment");.  }.  *p
285c0 52 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f  ResOut = rc;.  O
285d0 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
285e0 6e 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74  name=%s, pResOut
285f0 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
28600 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
28610 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46  ",.           zF
28620 69 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74  ilename, pResOut
28630 2c 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20  , *pResOut));.  
28640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
28660 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
28670 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74  he specified pat
28680 68 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69  h name starts wi
28690 74 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65  th a drive lette
286a0 72 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79  r.** followed by
286b0 20 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74   a colon charact
286c0 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  er..*/.static BO
286d0 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  OL winIsDriveLet
286e0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63  terAndColon(.  c
286f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
28700 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e  name.){.  return
28710 20 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68   ( sqlite3Isalph
28720 61 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20  a(zPathname[0]) 
28730 26 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d  && zPathname[1]=
28740 3d 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  =':' );.}../*.**
28750 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   Returns non-zer
28760 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69  o if the specifi
28770 65 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  ed path name sho
28780 75 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62  uld be used verb
28790 61 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e  atim.  If.** non
287a0 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
287b0 64 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63  d from this func
287c0 74 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e  tion, the callin
287d0 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
287e0 73 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68  simply.** use th
287f0 65 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20  e provided path 
28800 6e 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f  name verbatim -O
28810 52 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e  R- resolve it in
28820 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e  to a full path n
28830 61 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ame.** using the
28840 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65   GetFullPathName
28850 20 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74   Win32 API funct
28860 69 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c  ion (if availabl
28870 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  e)..*/.static BO
28880 4f 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d  OL winIsVerbatim
28890 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
288a0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d  t char *zPathnam
288b0 65 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49  e.){.  /*.  ** I
288c0 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
288d0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f  starts with a fo
288e0 72 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61  rward slash or a
288f0 20 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69   backslash, it i
28900 73 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20  s either.  ** a 
28910 6c 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20  legal UNC name, 
28920 61 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76  a volume relativ
28930 65 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62  e path, or an ab
28940 73 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65  solute path name
28950 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e   in the.  ** "Un
28960 69 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69  ix" format on Wi
28970 6e 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73  ndows.  There is
28980 20 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20   no easy way to 
28990 64 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65  differentiate be
289a0 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66  tween.  ** the f
289b0 69 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20  inal two cases; 
289c0 74 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65  therefore, we re
289d0 74 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72  turn the safer r
289e0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54  eturn value of T
289f0 52 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  RUE.  ** so that
28a00 20 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   callers of this
28a10 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
28a20 69 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72  imply use it ver
28a30 62 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66  batim..  */.  if
28a40 20 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a   ( winIsDirSep(z
28a50 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a  Pathname[0]) ){.
28a60 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
28a70 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
28a80 49 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65  If the path name
28a90 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c   starts with a l
28aa0 65 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f  etter and a colo
28ab0 6e 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61  n it is either a
28ac0 20 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c   volume.  ** rel
28ad0 61 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e  ative path or an
28ae0 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20   absolute path. 
28af0 20 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73   Callers of this
28b00 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e   function must n
28b10 6f 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20  ot.  ** attempt 
28b20 74 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61  to treat it as a
28b30 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28b40 61 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73  ame (i.e. they s
28b50 68 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65  hould simply use
28b60 0a 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69  .  ** it verbati
28b70 6d 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20  m)..  */.  if ( 
28b80 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
28b90 41 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61  AndColon(zPathna
28ba0 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  me) ){.    retur
28bb0 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f  n TRUE;.  }..  /
28bc0 2a 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74  *.  ** If we get
28bd0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
28be0 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68  the path name sh
28bf0 6f 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74  ould almost cert
28c00 61 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c  ainly be a purel
28c10 79 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20  y.  ** relative 
28c20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20  one (i.e. not a 
28c30 55 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62  UNC name, not ab
28c40 73 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20  solute, and not 
28c50 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29  volume relative)
28c60 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
28c70 46 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  FALSE;.}../*.** 
28c80 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
28c90 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
28ca0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
28cb0 57 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a  Write the full.*
28cc0 2a 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  * pathname into 
28cd0 7a 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20  zOut[].  zOut[] 
28ce0 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74  will be at least
28cf0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
28d00 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69  e.** bytes in si
28d10 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
28d20 74 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  t winFullPathnam
28d30 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
28d40 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
28d50 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
28d60 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
28d70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
28d80 6c 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f  lative,        /
28d90 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
28da0 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
28db0 2f 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20  /.  int nFull,  
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dd0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
28de0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
28df0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
28e00 46 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20  Full            
28e10 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
28e20 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23   buffer */.){..#
28e30 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  if defined(__CYG
28e40 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74  WIN__).  Simulat
28e50 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
28e60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b   SQLITE_ERROR );
28e70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28e80 54 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73  TER(nFull);.  as
28e90 73 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66  sert( nFull>=pVf
28ea0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b  s->mxPathname );
28eb0 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f  .  if ( sqlite3_
28ec0 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26  data_directory &
28ed0 26 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d  & !winIsVerbatim
28ee0 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69  Pathname(zRelati
28ef0 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ve) ){.    /*.  
28f00 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72    ** NOTE: We ar
28f10 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
28f20 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e   relative path n
28f30 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ame and the data
28f40 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69  .    **       di
28f50 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
28f60 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65   set.  Therefore
28f70 2c 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  , use it as the 
28f80 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  basis.    **    
28f90 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e     for convertin
28fa0 67 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70  g the relative p
28fb0 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61  ath name to an a
28fc0 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20  bsolute.    **  
28fd0 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70       one by prep
28fe0 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  ending the data 
28ff0 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20  directory and a 
29000 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20  slash..    */.  
29010 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73    char *zOut = s
29020 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
29030 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ( pVfs->mxPathna
29040 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  me+1 );.    if( 
29050 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72  !zOut ){.      r
29060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
29070 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  RR_NOMEM;.    }.
29080 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
29090 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
290a0 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
290b0 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
290c0 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
290d0 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c 0a 20 20 20  _TO_WIN_A) |.   
290e0 20 20 20 20 20 20 20 20 20 43 43 50 5f 52 45 4c           CCP_REL
290f0 41 54 49 56 45 2c 20 7a 52 65 6c 61 74 69 76 65  ATIVE, zRelative
29100 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d 78  , zOut, pVfs->mx
29110 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29 7b  Pathname+1)<0 ){
29120 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
29130 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
29140 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
29150 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
29160 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28 44  PEN_CONVPATH, (D
29170 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20 20  WORD)errno,.    
29180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29190 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
291a0 68 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69  hname1", zRelati
291b0 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ve);.    }else{.
291c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74 66        char *zUtf
291d0 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54 6f  8 = winConvertTo
291e0 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f 75  Utf8Filename(zOu
291f0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a  t);.      if( !z
29200 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20  Utf8 ){.        
29210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
29220 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
29230 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29240 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
29250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
29260 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
29270 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29280 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
29290 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
292a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
292b0 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f  te3_data_directo
292c0 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70  ry, winGetDirSep
292d0 28 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  (), zUtf8);.    
292e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
292f0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
29300 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
29310 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
29320 20 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d      char *zOut =
29330 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
29340 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ro( pVfs->mxPath
29350 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66  name+1 );.    if
29360 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20  ( !zOut ){.     
29370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29380 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  OERR_NOMEM;.    
29390 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77 69 6e  }.    if( cygwin
293a0 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20  _conv_path(.    
293b0 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28          (osIsNT(
293c0 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f  ) ? CCP_POSIX_TO
293d0 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53  _WIN_W : CCP_POS
293e0 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20  IX_TO_WIN_A),.  
293f0 20 20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74            zRelat
29400 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d  ive, zOut, pVfs-
29410 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30  >mxPathname+1)<0
29420 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
29430 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
29440 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
29450 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
29460 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c  NTOPEN_CONVPATH,
29470 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20   (DWORD)errno,. 
29480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29490 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c          "winFull
294a0 50 61 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c  Pathname2", zRel
294b0 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73  ative);.    }els
294c0 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  e{.      char *z
294d0 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72  Utf8 = winConver
294e0 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  tToUtf8Filename(
294f0 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28  zOut);.      if(
29500 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20   !zUtf8 ){.     
29510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
29520 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72  zOut);.        r
29530 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
29540 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
29550 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
29560 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
29570 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
29580 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
29590 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
295a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
295b0 55 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c  Utf8);.      sql
295c0 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b  ite3_free(zOut);
295d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
295e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
295f0 65 6e 64 69 66 0a 0a 23 69 66 20 28 53 51 4c 49  endif..#if (SQLI
29600 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 53  TE_OS_WINCE || S
29610 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 29 20  QLITE_OS_WINRT) 
29620 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59  && !defined(__CY
29630 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61  GWIN__).  Simula
29640 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
29650 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29  n SQLITE_ERROR )
29660 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73  ;.  /* WinCE has
29670 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61   no concept of a
29680 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
29690 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74  me, or so I am t
296a0 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20 57 69 6e  old. */.  /* Win
296b0 52 54 20 68 61 73 20 6e 6f 20 77 61 79 20 74 6f  RT has no way to
296c0 20 63 6f 6e 76 65 72 74 20 61 20 72 65 6c 61 74   convert a relat
296d0 69 76 65 20 70 61 74 68 20 74 6f 20 61 6e 20 61  ive path to an a
296e0 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20 2a 2f 0a  bsolute one. */.
296f0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
29700 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
29710 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
29720 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
29730 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
29740 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
29750 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
29760 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
29770 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
29780 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
29790 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
297a0 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
297b0 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
297c0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
297d0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
297e0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
297f0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
29800 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
29810 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
29820 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
29830 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62  irectory and a b
29840 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f  ackslash..    */
29850 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
29860 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c  rintf(MIN(nFull,
29870 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29880 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63  e), zFull, "%s%c
29890 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
298a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
298b0 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
298c0 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29  , winGetDirSep()
298d0 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
298e0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
298f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
29900 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
29910 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
29920 20 22 25 73 22 2c 20 7a 52 65 6c 61 74 69 76 65   "%s", zRelative
29930 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
29940 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
29950 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  f..#if !SQLITE_O
29960 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
29970 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21  TE_OS_WINRT && !
29980 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e  defined(__CYGWIN
29990 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e 42 79 74  __).  DWORD nByt
299a0 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  e;.  void *zConv
299b0 65 72 74 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a  erted;.  char *z
299c0 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Out;..  /* If th
299d0 69 73 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67  is path name beg
299e0 69 6e 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20  ins with "/X:", 
299f0 77 68 65 72 65 20 22 58 22 20 69 73 20 61 6e 79  where "X" is any
29a00 20 61 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a   alphabetic.  **
29a10 20 63 68 61 72 61 63 74 65 72 2c 20 64 69 73 63   character, disc
29a20 61 72 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ard the initial 
29a30 22 2f 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74  "/" from the pat
29a40 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  hname..  */.  if
29a50 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d  ( zRelative[0]==
29a60 27 2f 27 20 26 26 20 77 69 6e 49 73 44 72 69 76  '/' && winIsDriv
29a70 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
29a80 7a 52 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a  zRelative+1) ){.
29a90 20 20 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b      zRelative++;
29aa0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74 27 73 20  .  }..  /* It's 
29ab0 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
29ac0 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
29ad0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
29ae0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
29af0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
29b00 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
29b10 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
29b20 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
29b30 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
29b40 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
29b50 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
29b60 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
29b70 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
29b80 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
29b90 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
29ba0 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
29bb0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
29bc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
29bd0 52 52 4f 52 20 29 3b 0a 20 20 69 66 20 28 20 73  RROR );.  if ( s
29be0 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
29bf0 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56  ctory && !winIsV
29c00 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28  erbatimPathname(
29c10 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20  zRelative) ){.  
29c20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
29c30 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67  : We are dealing
29c40 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76 65   with a relative
29c50 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74   path name and t
29c60 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20  he data.    **  
29c70 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20 68       directory h
29c80 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68  as been set.  Th
29c90 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20  erefore, use it 
29ca0 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20 20  as the basis.   
29cb0 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f   **       for co
29cc0 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c  nverting the rel
29cd0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
29ce0 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20  to an absolute. 
29cf0 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20     **       one 
29d00 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68  by prepending th
29d10 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79  e data directory
29d20 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73 68   and a backslash
29d30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
29d40 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
29d50 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
29d60 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
29d70 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20 20  l, "%s%c%s",.   
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64    sqlite3_data_d
29da0 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65 74  irectory, winGet
29db0 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61 74  DirSep(), zRelat
29dc0 69 76 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ive);.    return
29dd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
29de0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
29df0 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
29e00 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65 6c 61 74  8Filename(zRelat
29e10 69 76 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e  ive);.  if( zCon
29e20 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20  verted==0 ){.   
29e30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29e40 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  OERR_NOMEM;.  }.
29e50 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
29e60 7b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54 65  {.    LPWSTR zTe
29e70 6d 70 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  mp;.    nByte = 
29e80 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
29e90 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e  eW((LPCWSTR)zCon
29ea0 76 65 72 74 65 64 2c 20 30 2c 20 30 2c 20 30 29  verted, 0, 0, 0)
29eb0 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d  ;.    if( nByte=
29ec0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
29ed0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
29ee0 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ted);.      retu
29ef0 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53  rn winLogError(S
29f00 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46  QLITE_CANTOPEN_F
29f10 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61  ULLPATH, osGetLa
29f20 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68      "winFullPath
29f50 6e 61 6d 65 31 22 2c 20 7a 52 65 6c 61 74 69 76  name1", zRelativ
29f60 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  e);.    }.    nB
29f70 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20 20 7a 54  yte += 3;.    zT
29f80 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  emp = sqlite3Mal
29f90 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65 2a 73  locZero( nByte*s
29fa0 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30 5d 29 20  izeof(zTemp[0]) 
29fb0 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 65 6d 70  );.    if( zTemp
29fc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
29fd0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
29fe0 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72 65 74  rted);.      ret
29ff0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
2a000 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2a010 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46    nByte = osGetF
2a020 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50  ullPathNameW((LP
2a030 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64  CWSTR)zConverted
2a040 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20  , nByte, zTemp, 
2a050 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  0);.    if( nByt
2a060 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
2a070 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
2a080 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73 71  erted);.      sq
2a090 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2a0a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a0b0 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
2a0c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
2a0d0 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45  PATH, osGetLastE
2a0e0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a100 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d   "winFullPathnam
2a110 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  e2", zRelative);
2a120 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a130 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2a140 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20  ed);.    zOut = 
2a150 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38  winUnicodeToUtf8
2a160 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c  (zTemp);.    sql
2a170 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29  ite3_free(zTemp)
2a180 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
2a190 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2a1a0 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63  SI.  else{.    c
2a1b0 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20  har *zTemp;.    
2a1c0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2a1d0 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72  lPathNameA((char
2a1e0 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c  *)zConverted, 0,
2a1f0 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   0, 0);.    if( 
2a200 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2a210 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a220 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a230 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
2a240 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
2a250 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f  OPEN_FULLPATH, o
2a260 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
2a270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a280 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75            "winFu
2a290 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52  llPathname3", zR
2a2a0 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a  elative);.    }.
2a2b0 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a      nByte += 3;.
2a2c0 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69      zTemp = sqli
2a2d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
2a2e0 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d  Byte*sizeof(zTem
2a2f0 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28  p[0]) );.    if(
2a300 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20   zTemp==0 ){.   
2a310 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a320 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2a330 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a340 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
2a350 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20 3d 20    }.    nByte = 
2a360 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d  osGetFullPathNam
2a370 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  eA((char*)zConve
2a380 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65  rted, nByte, zTe
2a390 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mp, 0);.    if( 
2a3a0 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
2a3b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a3c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
2a3d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a3e0 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72 65 74  Temp);.      ret
2a3f0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
2a400 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
2a410 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c  FULLPATH, osGetL
2a420 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a440 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74       "winFullPat
2a450 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61 74 69  hname4", zRelati
2a460 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ve);.    }.    s
2a470 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2a480 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75  verted);.    zOu
2a490 74 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  t = sqlite3_win3
2a4a0 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 7a  2_mbcs_to_utf8(z
2a4b0 54 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  Temp);.    sqlit
2a4c0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2a4d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
2a4e0 20 7a 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c   zOut ){.    sql
2a4f0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49  ite3_snprintf(MI
2a500 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d  N(nFull, pVfs->m
2a510 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c  xPathname), zFul
2a520 6c 2c 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a  l, "%s", zOut);.
2a530 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a540 28 7a 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75  (zOut);.    retu
2a550 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a560 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2a570 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  n SQLITE_IOERR_N
2a580 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OMEM;.  }.#endif
2a590 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
2a5a0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
2a5b0 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
2a5c0 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
2a5d0 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
2a5e0 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
2a5f0 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
2a600 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
2a610 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
2a620 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
2a630 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  library..*/.stat
2a640 69 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70  ic void *winDlOp
2a650 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
2a660 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
2a670 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
2a680 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65  HANDLE h;.#if de
2a690 66 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f  fined(__CYGWIN__
2a6a0 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20  ).  int nFull = 
2a6b0 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a6c0 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  +1;.  char *zFul
2a6d0 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  l = sqlite3Mallo
2a6e0 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a  cZero( nFull );.
2a6f0 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
2a700 65 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46  ed = 0;.  if( zF
2a710 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53  ull==0 ){.    OS
2a720 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2a730 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2a740 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2a750 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2a760 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2a770 20 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68   if( winFullPath
2a780 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
2a790 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75  name, nFull, zFu
2a7a0 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ll)!=SQLITE_OK )
2a7b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2a7c0 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f  ee(zFull);.    O
2a7d0 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2a7e0 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2a7f0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2a800 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20  , (void*)0));.  
2a810 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
2a820 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
2a830 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66  inConvertFromUtf
2a840 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29  8Filename(zFull)
2a850 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2a860 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20  (zFull);.#else. 
2a870 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2a880 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72  d = winConvertFr
2a890 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a  omUtf8Filename(z
2a8a0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55  Filename);.  UNU
2a8b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2a8c0 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  fs);.#endif.  if
2a8d0 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
2a8e0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
2a8f0 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c  "DLOPEN name=%s,
2a900 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a   handle=%p\n", z
2a910 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a  Filename, (void*
2a920 29 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  )0));.    return
2a930 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73   0;.  }.  if( os
2a940 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
2a950 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
2a960 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b    h = osLoadPack
2a970 61 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43  agedLibrary((LPC
2a980 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
2a990 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68   0);.#else.    h
2a9a0 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
2a9b0 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76  W((LPCWSTR)zConv
2a9c0 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  erted);.#endif. 
2a9d0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2a9e0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2a9f0 20 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20    else{.    h = 
2aa00 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28  osLoadLibraryA((
2aa10 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64  char*)zConverted
2aa20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
2aa30 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e  OSTRACE(("DLOPEN
2aa40 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65   name=%s, handle
2aa50 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d  =%p\n", zFilenam
2aa60 65 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20  e, (void*)h));. 
2aa70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2aa80 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74  onverted);.  ret
2aa90 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a  urn (void*)h;.}.
2aaa0 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
2aab0 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
2aac0 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
2aad0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
2aae0 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
2aaf0 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20  AMETER(pVfs);.  
2ab00 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
2ab10 73 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  sg(osGetLastErro
2ab20 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f  r(), nBuf, zBufO
2ab30 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ut);.}.static vo
2ab40 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71  id (*winDlSym(sq
2ab50 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2ab60 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63  void *pH,const c
2ab70 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
2ab80 29 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f  ){.  FARPROC pro
2ab90 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
2aba0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70  METER(pVfs);.  p
2abb0 72 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41  roc = osGetProcA
2abc0 64 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29  ddressA((HANDLE)
2abd0 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54  pH, zSym);.  OST
2abe0 52 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e  RACE(("DLSYM han
2abf0 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25  dle=%p, symbol=%
2ac00 73 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22  s, address=%p\n"
2ac10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f  ,.           (vo
2ac20 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76  id*)pH, zSym, (v
2ac30 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72  oid*)proc));.  r
2ac40 65 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76  eturn (void(*)(v
2ac50 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61  oid))proc;.}.sta
2ac60 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c  tic void winDlCl
2ac70 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
2ac80 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
2ac90 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
2aca0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2acb0 0a 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79  .  osFreeLibrary
2acc0 28 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65  ((HANDLE)pHandle
2acd0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44  );.  OSTRACE(("D
2ace0 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70  LCLOSE handle=%p
2acf0 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e  \n", (void*)pHan
2ad00 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  dle));.}.#else /
2ad10 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
2ad20 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
2ad30 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
2ad40 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70   #define winDlOp
2ad50 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
2ad60 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23  winDlError 0.  #
2ad70 64 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20  define winDlSym 
2ad80 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69    0.  #define wi
2ad90 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69  nDlClose 0.#endi
2ada0 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  f.../*.** Write 
2adb0 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
2adc0 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
2add0 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
2ade0 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
2adf0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
2ae00 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2ae10 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2ae20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 55    int n = 0;.  U
2ae30 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2ae40 70 56 66 73 29 3b 0a 23 69 66 20 64 65 66 69 6e  pVfs);.#if defin
2ae50 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
2ae60 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
2ae70 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
2ae80 53 29 0a 20 20 6e 20 3d 20 6e 42 75 66 3b 0a 20  S).  n = nBuf;. 
2ae90 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2aea0 20 6e 42 75 66 29 3b 0a 23 65 6c 73 65 0a 20 20   nBuf);.#else.  
2aeb0 69 66 28 20 73 69 7a 65 6f 66 28 53 59 53 54 45  if( sizeof(SYSTE
2aec0 4d 54 49 4d 45 29 3c 3d 6e 42 75 66 2d 6e 20 29  MTIME)<=nBuf-n )
2aed0 7b 0a 20 20 20 20 53 59 53 54 45 4d 54 49 4d 45  {.    SYSTEMTIME
2aee0 20 78 3b 0a 20 20 20 20 6f 73 47 65 74 53 79 73   x;.    osGetSys
2aef0 74 65 6d 54 69 6d 65 28 26 78 29 3b 0a 20 20 20  temTime(&x);.   
2af00 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d   memcpy(&zBuf[n]
2af10 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
2af20 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f  ;.    n += sizeo
2af30 66 28 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  f(x);.  }.  if( 
2af40 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 3c 3d 6e  sizeof(DWORD)<=n
2af50 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20 44 57 4f  Buf-n ){.    DWO
2af60 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75  RD pid = osGetCu
2af70 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
2af80 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42  ;.    memcpy(&zB
2af90 75 66 5b 6e 5d 2c 20 26 70 69 64 2c 20 73 69 7a  uf[n], &pid, siz
2afa0 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 20 20 6e  eof(pid));.    n
2afb0 20 2b 3d 20 73 69 7a 65 6f 66 28 70 69 64 29 3b   += sizeof(pid);
2afc0 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
2afd0 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28 20 73  OS_WINRT.  if( s
2afe0 69 7a 65 6f 66 28 55 4c 4f 4e 47 4c 4f 4e 47 29  izeof(ULONGLONG)
2aff0 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
2b000 55 4c 4f 4e 47 4c 4f 4e 47 20 63 6e 74 20 3d 20  ULONGLONG cnt = 
2b010 6f 73 47 65 74 54 69 63 6b 43 6f 75 6e 74 36 34  osGetTickCount64
2b020 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
2b030 7a 42 75 66 5b 6e 5d 2c 20 26 63 6e 74 2c 20 73  zBuf[n], &cnt, s
2b040 69 7a 65 6f 66 28 63 6e 74 29 29 3b 0a 20 20 20  izeof(cnt));.   
2b050 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 63 6e 74   n += sizeof(cnt
2b060 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  );.  }.#else.  i
2b070 66 28 20 73 69 7a 65 6f 66 28 44 57 4f 52 44 29  f( sizeof(DWORD)
2b080 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
2b090 44 57 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65  DWORD cnt = osGe
2b0a0 74 54 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20  tTickCount();.  
2b0b0 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
2b0c0 5d 2c 20 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28  ], &cnt, sizeof(
2b0d0 63 6e 74 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20  cnt));.    n += 
2b0e0 73 69 7a 65 6f 66 28 63 6e 74 29 3b 0a 20 20 7d  sizeof(cnt);.  }
2b0f0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 69  .#endif.  if( si
2b100 7a 65 6f 66 28 4c 41 52 47 45 5f 49 4e 54 45 47  zeof(LARGE_INTEG
2b110 45 52 29 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20  ER)<=nBuf-n ){. 
2b120 20 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52     LARGE_INTEGER
2b130 20 69 3b 0a 20 20 20 20 6f 73 51 75 65 72 79 50   i;.    osQueryP
2b140 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65  erformanceCounte
2b150 72 28 26 69 29 3b 0a 20 20 20 20 6d 65 6d 63 70  r(&i);.    memcp
2b160 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 69 2c 20  y(&zBuf[n], &i, 
2b170 73 69 7a 65 6f 66 28 69 29 29 3b 0a 20 20 20 20  sizeof(i));.    
2b180 6e 20 2b 3d 20 73 69 7a 65 6f 66 28 69 29 3b 0a  n += sizeof(i);.
2b190 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
2b1a0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2b1b0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2b1c0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
2b1d0 5f 55 55 49 44 0a 20 20 69 66 28 20 73 69 7a 65  _UUID.  if( size
2b1e0 6f 66 28 55 55 49 44 29 3c 3d 6e 42 75 66 2d 6e  of(UUID)<=nBuf-n
2b1f0 20 29 7b 0a 20 20 20 20 55 55 49 44 20 69 64 3b   ){.    UUID id;
2b200 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c  .    memset(&id,
2b210 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29   0, sizeof(UUID)
2b220 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65  );.    osUuidCre
2b230 61 74 65 28 26 69 64 29 3b 0a 20 20 20 20 6d 65  ate(&id);.    me
2b240 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26  mcpy(&zBuf[n], &
2b250 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29  id, sizeof(UUID)
2b260 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65  );.    n += size
2b270 6f 66 28 55 55 49 44 29 3b 0a 20 20 7d 0a 20 20  of(UUID);.  }.  
2b280 69 66 28 20 73 69 7a 65 6f 66 28 55 55 49 44 29  if( sizeof(UUID)
2b290 3c 3d 6e 42 75 66 2d 6e 20 29 7b 0a 20 20 20 20  <=nBuf-n ){.    
2b2a0 55 55 49 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d  UUID id;.    mem
2b2b0 73 65 74 28 26 69 64 2c 20 30 2c 20 73 69 7a 65  set(&id, 0, size
2b2c0 6f 66 28 55 55 49 44 29 29 3b 0a 20 20 20 20 6f  of(UUID));.    o
2b2d0 73 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65  sUuidCreateSeque
2b2e0 6e 74 69 61 6c 28 26 69 64 29 3b 0a 20 20 20 20  ntial(&id);.    
2b2f0 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e 5d 2c  memcpy(&zBuf[n],
2b300 20 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49   &id, sizeof(UUI
2b310 44 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  D));.    n += si
2b320 7a 65 6f 66 28 55 55 49 44 29 3b 0a 20 20 7d 0a  zeof(UUID);.  }.
2b330 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a  #endif.#endif /*
2b340 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2b350 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64  TEST) || defined
2b360 28 53 51 4c 49 54 45 5f 5a 45 52 4f 5f 50 52 4e  (SQLITE_ZERO_PRN
2b370 47 5f 53 45 45 44 29 20 2a 2f 0a 20 20 72 65 74  G_SEED) */.  ret
2b380 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
2b390 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
2b3a0 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
2b3b0 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
2b3c0 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
2b3d0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 6c  static int winSl
2b3e0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
2b3f0 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f  *pVfs, int micro
2b400 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  sec){.  sqlite3_
2b410 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69 63  win32_sleep((mic
2b420 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30 29  rosec+999)/1000)
2b430 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2b440 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72 65  ETER(pVfs);.  re
2b450 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b  turn ((microsec+
2b460 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30 3b  999)/1000)*1000;
2b470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
2b480 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
2b490 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
2b4a0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
2b4b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
2b4c0 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
2b4d0 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
2b4e0 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
2b4f0 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
2b500 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
2b510 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
2b520 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
2b530 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2b540 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
2b550 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
2b560 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
2b570 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
2b580 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
2b590 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
2b5a0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
2b5b0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
2b5c0 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
2b5d0 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
2b5e0 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
2b5f0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
2b600 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
2b610 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
2b620 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
2b630 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
2b640 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
2b650 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
2b660 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2b670 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
2b680 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
2b690 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
2b6a0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
2b6b0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
2b6c0 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
2b6d0 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
2b6e0 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
2b6f0 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
2b700 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
2b710 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
2b720 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
2b730 61 6e 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e  and date.** cann
2b740 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2b750 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2b760 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
2b770 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2b780 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
2b790 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49  *piNow){.  /* FI
2b7a0 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72 65  LETIME structure
2b7b0 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c   is a 64-bit val
2b7c0 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ue representing 
2b7d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
2b7e0 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e     100-nanosecon
2b7f0 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63  d intervals sinc
2b800 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30  e January 1, 160
2b810 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e  1 (= JD 2305813.
2b820 35 29 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54  5)..  */.  FILET
2b830 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69 63  IME ft;.  static
2b840 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2b850 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d 65  nt64 winFiletime
2b860 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33 35  Epoch = 23058135
2b870 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
2b880 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66 20  8640000;.#ifdef 
2b890 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 74  SQLITE_TEST.  st
2b8a0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2b8b0 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70 6f  e3_int64 unixEpo
2b8c0 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28 73  ch = 24405875*(s
2b8d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2b8e0 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f  0000;.#endif.  /
2b8f0 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69  * 2^32 - to avoi
2b900 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20  d use of LL and 
2b910 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63 20  warnings in gcc 
2b920 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  */.  static cons
2b930 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  t sqlite3_int64 
2b940 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d 0a  max32BitValue =.
2b950 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69        (sqlite3_i
2b960 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30 20  nt64)2000000000 
2b970 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  + (sqlite3_int64
2b980 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20 20  )2000000000 +.  
2b990 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2b9a0 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a 23  64)294967296;..#
2b9b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
2b9c0 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45 20  CE.  SYSTEMTIME 
2b9d0 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79 73  time;.  osGetSys
2b9e0 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a  temTime(&time);.
2b9f0 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54 69    /* if SystemTi
2ba00 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20 66  meToFileTime() f
2ba10 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e 73  ails, it returns
2ba20 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28   zero. */.  if (
2ba30 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f 46  !osSystemTimeToF
2ba40 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26 66  ileTime(&time,&f
2ba50 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t)){.    return 
2ba60 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2ba70 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74 53  }.#else.  osGetS
2ba80 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
2ba90 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e 64  ime( &ft );.#end
2baa0 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77  if..  *piNow = w
2bab0 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68 20  inFiletimeEpoch 
2bac0 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  +.            ((
2bad0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
2bae0 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d  ft.dwHighDateTim
2baf0 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75 65  e)*max32BitValue
2bb00 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) +.            
2bb10 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2bb20 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69  4)ft.dwLowDateTi
2bb30 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74  me)/(sqlite3_int
2bb40 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64 65  64)10000;..#ifde
2bb50 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2bb60 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
2bb70 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
2bb80 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
2bb90 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
2bba0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2bbb0 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
2bbc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
2bbd0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2bbe0 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  s);.  return SQL
2bbf0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
2bc00 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2bc10 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2bc20 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2bc30 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
2bc40 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
2bc50 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
2bc60 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
2bc70 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
2bc80 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
2bc90 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
2bca0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
2bcb0 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
2bcc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2bcd0 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  nCurrentTime(sql
2bce0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
2bcf0 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
2bd00 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
2bd10 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72  te3_int64 i;.  r
2bd20 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54 69  c = winCurrentTi
2bd30 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26 69  meInt64(pVfs, &i
2bd40 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b 0a  );.  if( !rc ){.
2bd50 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38      *prNow = i/8
2bd60 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20  6400000.0;.  }. 
2bd70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2bd80 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69 73  *.** The idea is
2bd90 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63 74   that this funct
2bda0 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61  ion works like a
2bdb0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a   combination of.
2bdc0 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28  ** GetLastError(
2bdd0 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73  ) and FormatMess
2bde0 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73  age() on Windows
2bdf0 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a   (or errno and.*
2be00 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20 6f  * strerror_r() o
2be10 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20 61  n Unix). After a
2be20 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
2be30 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20  ned by an OS.** 
2be40 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65  function, SQLite
2be50 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
2be60 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20 70  tion with zBuf p
2be70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20  ointing to.** a 
2be80 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20 62  buffer of nBuf b
2be90 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61 79  ytes. The OS lay
2bea0 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61  er should popula
2beb0 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  te the.** buffer
2bec0 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d   with a nul-term
2bed0 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e 63  inated UTF-8 enc
2bee0 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73 61  oded error messa
2bef0 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  ge.** describing
2bf00 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72 72   the last IO err
2bf10 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75 72  or to have occur
2bf20 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  red within the c
2bf30 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64  alling.** thread
2bf40 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
2bf50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
2bf60 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74 68  too large for th
2bf70 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66 65  e supplied buffe
2bf80 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20  r,.** it should 
2bf90 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  be truncated. Th
2bfa0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2bfb0 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 0a  f xGetLastError.
2bfc0 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  ** is zero if th
2bfd0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2bfe0 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66 66  fits in the buff
2bff0 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a  er, or non-zero.
2c000 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69 66  ** otherwise (if
2c010 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61 73   the message was
2c020 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66 20   truncated). If 
2c030 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
2c040 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74  rned,.** then it
2c050 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
2c060 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  y to include the
2c070 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
2c080 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20  character.** in 
2c090 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65  the output buffe
2c0a0 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70  r..**.** Not sup
2c0b0 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  plying an error 
2c0c0 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61 76  message will hav
2c0d0 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66 66  e no adverse eff
2c0e0 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65  ect.** on SQLite
2c0f0 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f 20  . It is fine to 
2c100 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e  have an implemen
2c110 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76 65  tation that neve
2c120 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e 20  r.** returns an 
2c130 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a  error message:.*
2c140 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74 4c  *.**   int xGetL
2c150 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33  astError(sqlite3
2c160 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
2c170 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
2c180 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ){.**     assert
2c190 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b  (zBuf[0]=='\0');
2c1a0 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20 30  .**     return 0
2c1b0 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48  ;.**   }.**.** H
2c1c0 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72 72  owever if an err
2c1d0 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73 75  or message is su
2c1e0 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c 20  pplied, it will 
2c1f0 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a  be incorporated.
2c200 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e 74  ** by sqlite int
2c210 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  o the error mess
2c220 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  age available to
2c230 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67 0a   the user using.
2c240 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ** sqlite3_errms
2c250 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61  g(), possibly ma
2c260 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20 65  king IO errors e
2c270 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e 0a  asier to debug..
2c280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2c290 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71  nGetLastError(sq
2c2a0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2c2b0 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20   int nBuf, char 
2c2c0 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44  *zBuf){.  UNUSED
2c2d0 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2c2e0 3b 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 47 65  ;.  return winGe
2c2f0 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 6f 73  tLastErrorMsg(os
2c300 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
2c310 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 7d 0a 0a  nBuf, zBuf);.}..
2c320 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2c330 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a   and deinitializ
2c340 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  e the operating 
2c350 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
2c360 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c370 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a  _os_init(void){.
2c380 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
2c390 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a  _vfs winVfs = {.
2c3a0 20 20 20 20 33 2c 20 20 20 20 20 20 20 20 20 20      3,          
2c3b0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72           /* iVer
2c3c0 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  sion */.    size
2c3d0 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20  of(winFile),    
2c3e0 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a   /* szOsFile */.
2c3f0 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32      SQLITE_WIN32
2c400 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c  _MAX_PATH_BYTES,
2c410 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a   /* mxPathname *
2c420 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20  /.    0,        
2c430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
2c440 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33  ext */.    "win3
2c450 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
2c460 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20  /* zName */.    
2c470 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
2c480 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61       /* pAppData
2c490 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c   */.    winOpen,
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c4b0 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  xOpen */.    win
2c4c0 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20  Delete,         
2c4d0 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a    /* xDelete */.
2c4e0 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20      winAccess,  
2c4f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63           /* xAcc
2c500 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75  ess */.    winFu
2c510 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20  llPathname,     
2c520 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  /* xFullPathname
2c530 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65   */.    winDlOpe
2c540 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n,           /* 
2c550 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  xDlOpen */.    w
2c560 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  inDlError,      
2c570 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20      /* xDlError 
2c580 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c  */.    winDlSym,
2c590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c5a0 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e  DlSym */.    win
2c5b0 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  DlClose,        
2c5c0 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f    /* xDlClose */
2c5d0 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65  .    winRandomne
2c5e0 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61  ss,       /* xRa
2c5f0 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20  ndomness */.    
2c600 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20  winSleep,       
2c610 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a       /* xSleep *
2c620 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2c630 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43  Time,      /* xC
2c640 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20  urrentTime */.  
2c650 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f    winGetLastErro
2c660 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61  r,     /* xGetLa
2c670 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77  stError */.    w
2c680 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  inCurrentTimeInt
2c690 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54  64, /* xCurrentT
2c6a0 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20  imeInt64 */.    
2c6b0 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  winSetSystemCall
2c6c0 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74  ,    /* xSetSyst
2c6d0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2c6e0 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nGetSystemCall, 
2c6f0 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d     /* xGetSystem
2c700 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e  Call */.    winN
2c710 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20  extSystemCall,  
2c720 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43   /* xNextSystemC
2c730 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20  all */.  };.#if 
2c740 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
2c750 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20  IN32_HAS_WIDE). 
2c760 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
2c770 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56  vfs winLongPathV
2c780 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20  fs = {.    3,   
2c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c7a0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
2c7b0 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c     sizeof(winFil
2c7c0 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46  e),     /* szOsF
2c7d0 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54  ile */.    SQLIT
2c7e0 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48  E_WINNT_MAX_PATH
2c7f0 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74  _BYTES, /* mxPat
2c800 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20  hname */.    0, 
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
2c830 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74    "win32-longpat
2c840 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20  h",    /* zName 
2c850 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20  */.    0,       
2c860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70              /* p
2c870 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77  AppData */.    w
2c880 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  inOpen,         
2c890 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a      /* xOpen */.
2c8a0 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20      winDelete,  
2c8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
2c8c0 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63  ete */.    winAc
2c8d0 63 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  cess,           
2c8e0 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20  /* xAccess */.  
2c8f0 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d    winFullPathnam
2c900 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50  e,     /* xFullP
2c910 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77  athname */.    w
2c920 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  inDlOpen,       
2c930 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
2c940 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72  /.    winDlError
2c950 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2c960 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69  lError */.    wi
2c970 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20  nDlSym,         
2c980 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a     /* xDlSym */.
2c990 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20      winDlClose, 
2c9a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
2c9b0 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52  lose */.    winR
2c9c0 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20  andomness,      
2c9d0 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20   /* xRandomness 
2c9e0 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c  */.    winSleep,
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2ca00 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e  Sleep */.    win
2ca10 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20  CurrentTime,    
2ca20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d    /* xCurrentTim
2ca30 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c  e */.    winGetL
2ca40 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a  astError,     /*
2ca50 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a   xGetLastError *
2ca60 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74  /.    winCurrent
2ca70 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43  TimeInt64, /* xC
2ca80 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
2ca90 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73  */.    winSetSys
2caa0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2cab0 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  SetSystemCall */
2cac0 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73 74 65  .    winGetSyste
2cad0 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65  mCall,    /* xGe
2cae0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2caf0 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d     winNextSystem
2cb00 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74  Call,   /* xNext
2cb10 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20  SystemCall */.  
2cb20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  };.#endif..  /* 
2cb30 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61  Double-check tha
2cb40 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d  t the aSyscall[]
2cb50 20 61 72 72 61 79 20 68 61 73 20 62 65 65 6e 20   array has been 
2cb60 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a  constructed.  **
2cb70 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65   correctly.  See
2cb80 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65   ticket [bb3a86e
2cb90 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20  890c8e96ab] */. 
2cba0 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69   assert( ArraySi
2cbb0 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d 38 30  ze(aSyscall)==80
2cbc0 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65   );..  /* get me
2cbd0 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74  mory map allocat
2cbe0 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20  ion granularity 
2cbf0 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e  */.  memset(&win
2cc00 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  SysInfo, 0, size
2cc10 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29  of(SYSTEM_INFO))
2cc20 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
2cc30 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74  WINRT.  osGetNat
2cc40 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77  iveSystemInfo(&w
2cc50 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73  inSysInfo);.#els
2cc60 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49  e.  osGetSystemI
2cc70 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29  nfo(&winSysInfo)
2cc80 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
2cc90 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2cca0 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c  AllocationGranul
2ccb0 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73  arity>0 );.  ass
2ccc0 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2ccd0 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a  dwPageSize>0 );.
2cce0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
2ccf0 65 67 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c  egister(&winVfs,
2cd00 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65   1);..#if define
2cd10 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
2cd20 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74  AS_WIDE).  sqlit
2cd30 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
2cd40 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c  &winLongPathVfs,
2cd50 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72   0);.#endif..  r
2cd60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2cd70 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .}..int sqlite3_
2cd80 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69  os_end(void){.#i
2cd90 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
2cda0 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a  T.  if( sleepObj
2cdb0 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73  !=NULL ){.    os
2cdc0 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65  CloseHandle(slee
2cdd0 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70  pObj);.    sleep
2cde0 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Obj = NULL;.  }.
2cdf0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2ce00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
2ce10 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2ce20 53 5f 57 49 4e 20 2a 2f 0a                       S_WIN */.