/ Hex Artifact Content
Login

Artifact 9c84a48d56074d36866775a76089da69acb21594:


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 69 73 20 69 73 20 63 61 63 68 65 20 73 69 7a  his is cache siz
2bb0: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 63 61  e used in the ca
2bc0: 6c 63 75 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  lculation of the
2bd0: 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f 66   initial size of
2be0: 20 74 68 65 0a 20 2a 20 57 69 6e 33 32 2d 73 70   the. * Win32-sp
2bf0: 65 63 69 66 69 63 20 68 65 61 70 2e 20 20 49 74  ecific heap.  It
2c00: 20 63 61 6e 6e 6f 74 20 62 65 20 6e 65 67 61 74   cannot be negat
2c10: 69 76 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66  ive.. */.#ifndef
2c20: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41   SQLITE_WIN32_CA
2c30: 43 48 45 5f 53 49 5a 45 0a 23 20 20 69 66 20 53  CHE_SIZE.#  if S
2c40: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
2c50: 43 48 45 5f 53 49 5a 45 3e 3d 30 0a 23 20 20 20  CHE_SIZE>=0.#   
2c60: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
2c70: 49 4e 33 32 5f 43 41 43 48 45 5f 53 49 5a 45 20  IN32_CACHE_SIZE 
2c80: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
2c90: 43 41 43 48 45 5f 53 49 5a 45 29 0a 23 20 20 65  CACHE_SIZE).#  e
2ca0: 6c 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20  lse.#    define 
2cb0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 41 43  SQLITE_WIN32_CAC
2cc0: 48 45 5f 53 49 5a 45 20 28 2d 28 53 51 4c 49 54  HE_SIZE (-(SQLIT
2cd0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
2ce0: 53 49 5a 45 29 29 0a 23 20 20 65 6e 64 69 66 0a  SIZE)).#  endif.
2cf0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
2d00: 65 20 69 6e 69 74 69 61 6c 20 73 69 7a 65 20 6f  e initial size o
2d10: 66 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63  f the Win32-spec
2d20: 69 66 69 63 20 68 65 61 70 2e 20 20 54 68 69 73  ific heap.  This
2d30: 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
2d40: 72 6f 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ro.. */.#ifndef 
2d50: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
2d60: 50 5f 49 4e 49 54 5f 53 49 5a 45 0a 23 20 20 64  P_INIT_SIZE.#  d
2d70: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e  efine SQLITE_WIN
2d80: 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a  32_HEAP_INIT_SIZ
2d90: 45 20 28 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  E ((SQLITE_WIN32
2da0: 5f 43 41 43 48 45 5f 53 49 5a 45 29 20 2a 20 5c  _CACHE_SIZE) * \
2db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f          (SQLITE_
2de0: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
2df0: 45 29 20 2b 20 34 31 39 34 33 30 34 29 0a 23 65  E) + 4194304).#e
2e00: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ndif../*. * The 
2e10: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
2e20: 74 68 65 20 57 69 6e 33 32 2d 73 70 65 63 69 66  the Win32-specif
2e30: 69 63 20 68 65 61 70 2e 20 20 54 68 69 73 20 76  ic heap.  This v
2e40: 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72 6f  alue may be zero
2e50: 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .. */.#ifndef SQ
2e60: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
2e70: 4d 41 58 5f 53 49 5a 45 0a 23 20 20 64 65 66 69  MAX_SIZE.#  defi
2e80: 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ne SQLITE_WIN32_
2e90: 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 20 20 28  HEAP_MAX_SIZE  (
2ea0: 30 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  0).#endif../*. *
2eb0: 20 54 68 65 20 65 78 74 72 61 20 66 6c 61 67 73   The extra flags
2ec0: 20 74 6f 20 75 73 65 20 69 6e 20 63 61 6c 6c 73   to use in calls
2ed0: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 68 65   to the Win32 he
2ee0: 61 70 20 41 50 49 73 2e 20 20 54 68 69 73 20 76  ap APIs.  This v
2ef0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 20 2a 20 7a  alue may be. * z
2f00: 65 72 6f 20 66 6f 72 20 74 68 65 20 64 65 66 61  ero for the defa
2f10: 75 6c 74 20 62 65 68 61 76 69 6f 72 2e 0a 20 2a  ult behavior.. *
2f20: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
2f40: 53 0a 23 20 20 64 65 66 69 6e 65 20 53 51 4c 49  S.#  define SQLI
2f50: 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c  TE_WIN32_HEAP_FL
2f60: 41 47 53 20 20 20 20 20 28 30 29 0a 23 65 6e 64  AGS     (0).#end
2f70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 77  if.../*.** The w
2f80: 69 6e 4d 65 6d 44 61 74 61 20 73 74 72 75 63 74  inMemData struct
2f90: 75 72 65 20 73 74 6f 72 65 73 20 69 6e 66 6f 72  ure stores infor
2fa0: 6d 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  mation required 
2fb0: 62 79 20 74 68 65 20 57 69 6e 33 32 2d 73 70 65  by the Win32-spe
2fc0: 63 69 66 69 63 0a 2a 2a 20 73 71 6c 69 74 65 33  cific.** sqlite3
2fd0: 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 69 6d 70  _mem_methods imp
2fe0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
2ff0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 77  typedef struct w
3000: 69 6e 4d 65 6d 44 61 74 61 20 77 69 6e 4d 65 6d  inMemData winMem
3010: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 77 69 6e  Data;.struct win
3020: 4d 65 6d 44 61 74 61 20 7b 0a 23 69 66 6e 64 65  MemData {.#ifnde
3030: 66 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d  f NDEBUG.  u32 m
3040: 61 67 69 63 31 3b 20 20 20 2f 2a 20 4d 61 67 69  agic1;   /* Magi
3050: 63 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65  c number to dete
3060: 63 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72  ct structure cor
3070: 72 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64  ruption. */.#end
3080: 69 66 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  if.  HANDLE hHea
3090: 70 3b 20 2f 2a 20 54 68 65 20 68 61 6e 64 6c 65  p; /* The handle
30a0: 20 74 6f 20 6f 75 72 20 68 65 61 70 2e 20 2a 2f   to our heap. */
30b0: 0a 20 20 42 4f 4f 4c 20 62 4f 77 6e 65 64 3b 20  .  BOOL bOwned; 
30c0: 20 2f 2a 20 44 6f 20 77 65 20 6f 77 6e 20 74 68   /* Do we own th
30d0: 65 20 68 65 61 70 20 28 69 2e 65 2e 20 64 65 73  e heap (i.e. des
30e0: 74 72 6f 79 20 69 74 20 6f 6e 20 73 68 75 74 64  troy it on shutd
30f0: 6f 77 6e 29 3f 20 2a 2f 0a 23 69 66 6e 64 65 66  own)? */.#ifndef
3100: 20 4e 44 45 42 55 47 0a 20 20 75 33 32 20 6d 61   NDEBUG.  u32 ma
3110: 67 69 63 32 3b 20 20 20 2f 2a 20 4d 61 67 69 63  gic2;   /* Magic
3120: 20 6e 75 6d 62 65 72 20 74 6f 20 64 65 74 65 63   number to detec
3130: 74 20 73 74 72 75 63 74 75 72 65 20 63 6f 72 72  t structure corr
3140: 75 70 74 69 6f 6e 2e 20 2a 2f 0a 23 65 6e 64 69  uption. */.#endi
3150: 66 0a 7d 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44  f.};..#ifndef ND
3160: 45 42 55 47 0a 23 64 65 66 69 6e 65 20 57 49 4e  EBUG.#define WIN
3170: 4d 45 4d 5f 4d 41 47 49 43 31 20 20 20 20 20 30  MEM_MAGIC1     0
3180: 78 34 32 62 32 38 33 30 62 0a 23 64 65 66 69 6e  x42b2830b.#defin
3190: 65 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20  e WINMEM_MAGIC2 
31a0: 20 20 20 20 30 78 62 64 34 64 37 63 66 34 0a 23      0xbd4d7cf4.#
31b0: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 73 74  endif..static st
31c0: 72 75 63 74 20 77 69 6e 4d 65 6d 44 61 74 61 20  ruct winMemData 
31d0: 77 69 6e 5f 6d 65 6d 5f 64 61 74 61 20 3d 20 7b  win_mem_data = {
31e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
31f0: 20 20 57 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 2c    WINMEM_MAGIC1,
3200: 0a 23 65 6e 64 69 66 0a 20 20 4e 55 4c 4c 2c 20  .#endif.  NULL, 
3210: 46 41 4c 53 45 0a 23 69 66 6e 64 65 66 20 4e 44  FALSE.#ifndef ND
3220: 45 42 55 47 0a 20 20 2c 57 49 4e 4d 45 4d 5f 4d  EBUG.  ,WINMEM_M
3230: 41 47 49 43 32 0a 23 65 6e 64 69 66 0a 7d 3b 0a  AGIC2.#endif.};.
3240: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
3250: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 41 73  #define winMemAs
3260: 73 65 72 74 4d 61 67 69 63 31 28 29 20 61 73 73  sertMagic1() ass
3270: 65 72 74 28 20 77 69 6e 5f 6d 65 6d 5f 64 61 74  ert( win_mem_dat
3280: 61 2e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  a.magic1==WINMEM
3290: 5f 4d 41 47 49 43 31 20 29 0a 23 64 65 66 69 6e  _MAGIC1 ).#defin
32a0: 65 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61  e winMemAssertMa
32b0: 67 69 63 32 28 29 20 61 73 73 65 72 74 28 20 77  gic2() assert( w
32c0: 69 6e 5f 6d 65 6d 5f 64 61 74 61 2e 6d 61 67 69  in_mem_data.magi
32d0: 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47 49 43  c2==WINMEM_MAGIC
32e0: 32 20 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d  2 ).#define winM
32f0: 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 20  emAssertMagic() 
3300: 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67   winMemAssertMag
3310: 69 63 31 28 29 3b 20 77 69 6e 4d 65 6d 41 73 73  ic1(); winMemAss
3320: 65 72 74 4d 61 67 69 63 32 28 29 3b 0a 23 65 6c  ertMagic2();.#el
3330: 73 65 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65  se.#define winMe
3340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 0a 23  mAssertMagic().#
3350: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 77  endif..#define w
3360: 69 6e 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28  inMemGetDataPtr(
3370: 29 20 20 26 77 69 6e 5f 6d 65 6d 5f 64 61 74 61  )  &win_mem_data
3380: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47  .#define winMemG
3390: 65 74 48 65 61 70 28 29 20 20 20 20 20 77 69 6e  etHeap()     win
33a0: 5f 6d 65 6d 5f 64 61 74 61 2e 68 48 65 61 70 0a  _mem_data.hHeap.
33b0: 23 64 65 66 69 6e 65 20 77 69 6e 4d 65 6d 47 65  #define winMemGe
33c0: 74 4f 77 6e 65 64 28 29 20 20 20 20 77 69 6e 5f  tOwned()    win_
33d0: 6d 65 6d 5f 64 61 74 61 2e 62 4f 77 6e 65 64 0a  mem_data.bOwned.
33e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69  .static void *wi
33f0: 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69 6e 74 20 6e  nMemMalloc(int n
3400: 42 79 74 65 73 29 3b 0a 73 74 61 74 69 63 20 76  Bytes);.static v
3410: 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28 76  oid winMemFree(v
3420: 6f 69 64 20 2a 70 50 72 69 6f 72 29 3b 0a 73 74  oid *pPrior);.st
3430: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
3440: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
3450: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
3460: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  s);.static int w
3470: 69 6e 4d 65 6d 53 69 7a 65 28 76 6f 69 64 20 2a  inMemSize(void *
3480: 70 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77  p);.static int w
3490: 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e 74  inMemRoundup(int
34a0: 20 6e 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   n);.static int 
34b0: 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64 20  winMemInit(void 
34c0: 2a 70 41 70 70 44 61 74 61 29 3b 0a 73 74 61 74  *pAppData);.stat
34d0: 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68  ic void winMemSh
34e0: 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70  utdown(void *pAp
34f0: 70 44 61 74 61 29 3b 0a 0a 63 6f 6e 73 74 20 73  pData);..const s
3500: 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f  qlite3_mem_metho
3510: 64 73 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65  ds *sqlite3MemGe
3520: 74 57 69 6e 33 32 28 76 6f 69 64 29 3b 0a 23 65  tWin32(void);.#e
3530: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57  ndif /* SQLITE_W
3540: 49 4e 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a  IN32_MALLOC */..
3550: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
3560: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69 73 20  ing variable is 
3570: 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74 20 6f  (normally) set o
3580: 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20 63 68  nce and never ch
3590: 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65 61 66  anges.** thereaf
35a0: 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72 64 73  ter.  It records
35b0: 20 77 68 65 74 68 65 72 20 74 68 65 20 6f 70 65   whether the ope
35c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 73  rating system is
35d0: 20 57 69 6e 39 78 0a 2a 2a 20 6f 72 20 57 69 6e   Win9x.** or Win
35e0: 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20 20 4f  NT..**.** 0:   O
35f0: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
3600: 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a 20 20  unknown..** 1:  
3610: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
3620: 6d 20 69 73 20 57 69 6e 39 78 2e 0a 2a 2a 20 32  m is Win9x..** 2
3630: 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79  :   Operating sy
3640: 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e 0a 2a  stem is WinNT..*
3650: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 74 6f  *.** In order to
3660: 20 66 61 63 69 6c 69 74 61 74 65 20 74 65 73 74   facilitate test
3670: 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54 20 73  ing on a WinNT s
3680: 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73 74 20  ystem, the test 
3690: 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e 20 6d  fixture.** can m
36a0: 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68 69 73  anually set this
36b0: 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f 20 65   value to 1 to e
36c0: 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62 65 68  mulate Win98 beh
36d0: 61 76 69 6f 72 2e 0a 2a 2f 0a 23 69 66 64 65 66  avior..*/.#ifdef
36e0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 4c 4f 4e   SQLITE_TEST.LON
36f0: 47 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56  G SQLITE_WIN32_V
3700: 4f 4c 41 54 49 4c 45 20 73 71 6c 69 74 65 33 5f  OLATILE sqlite3_
3710: 6f 73 5f 74 79 70 65 20 3d 20 30 3b 0a 23 65 6c  os_type = 0;.#el
3720: 73 65 0a 73 74 61 74 69 63 20 4c 4f 4e 47 20 53  se.static LONG S
3730: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 56 4f 4c 41  QLITE_WIN32_VOLA
3740: 54 49 4c 45 20 73 71 6c 69 74 65 33 5f 6f 73 5f  TILE sqlite3_os_
3750: 74 79 70 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  type = 0;.#endif
3760: 0a 0a 23 69 66 6e 64 65 66 20 53 59 53 43 41 4c  ..#ifndef SYSCAL
3770: 4c 0a 23 20 20 64 65 66 69 6e 65 20 53 59 53 43  L.#  define SYSC
3780: 41 4c 4c 20 73 71 6c 69 74 65 33 5f 73 79 73 63  ALL sqlite3_sysc
3790: 61 6c 6c 5f 70 74 72 0a 23 65 6e 64 69 66 0a 0a  all_ptr.#endif..
37a0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
37b0: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  ion is not avail
37c0: 61 62 6c 65 20 6f 6e 20 57 69 6e 64 6f 77 73 20  able on Windows 
37d0: 43 45 20 6f 72 20 57 69 6e 52 54 2e 0a 20 2a 2f  CE or WinRT.. */
37e0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
37f0: 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f  WINCE || SQLITE_
3800: 4f 53 5f 57 49 4e 52 54 0a 23 20 20 64 65 66 69  OS_WINRT.#  defi
3810: 6e 65 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  ne osAreFileApis
3820: 41 4e 53 49 28 29 20 20 20 20 20 20 20 31 0a 23  ANSI()       1.#
3830: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  endif../*.** Man
3840: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
3850: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
3860: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
3870: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
3880: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
3890: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
38a0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
38b0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
38c0: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
38d0: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
38e0: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
38f0: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
3900: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
3910: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
3920: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
3930: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
3940: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69  static struct wi
3950: 6e 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  n_syscall {.  co
3960: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3980: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3990: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
39a0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
39b0: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
39c0: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
39d0: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
39e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
39f0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
3a00: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
3a10: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
3a20: 5d 20 3d 20 7b 0a 23 69 66 20 21 53 51 4c 49 54  ] = {.#if !SQLIT
3a30: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
3a40: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
3a50: 20 7b 20 22 41 72 65 46 69 6c 65 41 70 69 73 41   { "AreFileApisA
3a60: 4e 53 49 22 2c 20 20 20 20 20 20 20 20 20 28 53  NSI",         (S
3a70: 59 53 43 41 4c 4c 29 41 72 65 46 69 6c 65 41 70  YSCALL)AreFileAp
3a80: 69 73 41 4e 53 49 2c 20 20 20 20 20 20 20 20 20  isANSI,         
3a90: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
3aa0: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 22  AreFileApisANSI"
3ab0: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
3ac0: 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20  LL)0,           
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3ae0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
3af0: 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e   osAreFileApisAN
3b00: 53 49 0a 23 64 65 66 69 6e 65 20 6f 73 41 72 65  SI.#define osAre
3b10: 46 69 6c 65 41 70 69 73 41 4e 53 49 20 28 28 42  FileApisANSI ((B
3b20: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 56 4f 49  OOL(WINAPI*)(VOI
3b30: 44 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  D))aSyscall[0].p
3b40: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
3b50: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
3b60: 49 4e 43 45 20 26 26 20 64 65 66 69 6e 65 64 28  INCE && defined(
3b70: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
3b80: 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 68 61 72  _WIDE).  { "Char
3b90: 4c 6f 77 65 72 57 22 2c 20 20 20 20 20 20 20 20  LowerW",        
3ba0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43        (SYSCALL)C
3bb0: 68 61 72 4c 6f 77 65 72 57 2c 20 20 20 20 20 20  harLowerW,      
3bc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
3bd0: 73 65 0a 20 20 7b 20 22 43 68 61 72 4c 6f 77 65  se.  { "CharLowe
3be0: 72 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rW",            
3bf0: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c10: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
3c20: 0a 23 64 65 66 69 6e 65 20 6f 73 43 68 61 72 4c  .#define osCharL
3c30: 6f 77 65 72 57 20 28 28 4c 50 57 53 54 52 28 57  owerW ((LPWSTR(W
3c40: 49 4e 41 50 49 2a 29 28 4c 50 57 53 54 52 29 29  INAPI*)(LPWSTR))
3c50: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3c60: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
3c70: 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 64 65  E_OS_WINCE && de
3c80: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
3c90: 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b  32_HAS_WIDE).  {
3ca0: 20 22 43 68 61 72 55 70 70 65 72 57 22 2c 20 20   "CharUpperW",  
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3cc0: 43 41 4c 4c 29 43 68 61 72 55 70 70 65 72 57 2c  CALL)CharUpperW,
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ce0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 68  },.#else.  { "Ch
3cf0: 61 72 55 70 70 65 72 57 22 2c 20 20 20 20 20 20  arUpperW",      
3d00: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
3d10: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3d20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3d30: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
3d40: 73 43 68 61 72 55 70 70 65 72 57 20 28 28 4c 50  sCharUpperW ((LP
3d50: 57 53 54 52 28 57 49 4e 41 50 49 2a 29 28 4c 50  WSTR(WINAPI*)(LP
3d60: 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 32  WSTR))aSyscall[2
3d70: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3d80: 20 22 43 6c 6f 73 65 48 61 6e 64 6c 65 22 2c 20   "CloseHandle", 
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
3da0: 43 41 4c 4c 29 43 6c 6f 73 65 48 61 6e 64 6c 65  CALL)CloseHandle
3db0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20  ,             0 
3dc0: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c  },..#define osCl
3dd0: 6f 73 65 48 61 6e 64 6c 65 20 28 28 42 4f 4f 4c  oseHandle ((BOOL
3de0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
3df0: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
3e00: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
3e20: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20  2_HAS_ANSI).  { 
3e30: 22 43 72 65 61 74 65 46 69 6c 65 41 22 2c 20 20  "CreateFileA",  
3e40: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
3e50: 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 41 2c  ALL)CreateFileA,
3e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
3e70: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
3e80: 61 74 65 46 69 6c 65 41 22 2c 20 20 20 20 20 20  ateFileA",      
3e90: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
3ea0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3eb0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3ec0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
3ed0: 43 72 65 61 74 65 46 69 6c 65 41 20 28 28 48 41  CreateFileA ((HA
3ee0: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
3ef0: 43 53 54 52 2c 44 57 4f 52 44 2c 44 57 4f 52 44  CSTR,DWORD,DWORD
3f00: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53 45  , \.        LPSE
3f10: 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45  CURITY_ATTRIBUTE
3f20: 53 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 48 41  S,DWORD,DWORD,HA
3f30: 4e 44 4c 45 29 29 61 53 79 73 63 61 6c 6c 5b 34  NDLE))aSyscall[4
3f40: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3f50: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
3f60: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
3f70: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49  ITE_WIN32_HAS_WI
3f80: 44 45 29 0a 20 20 7b 20 22 43 72 65 61 74 65 46  DE).  { "CreateF
3f90: 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20 20 20  ileW",          
3fa0: 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65 61     (SYSCALL)Crea
3fb0: 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20 20 20  teFileW,        
3fc0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
3fd0: 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65 57    { "CreateFileW
3fe0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
3ff0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4020: 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46 69  efine osCreateFi
4030: 6c 65 57 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  leW ((HANDLE(WIN
4040: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44 57  API*)(LPCWSTR,DW
4050: 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  ORD,DWORD, \.   
4060: 20 20 20 20 20 4c 50 53 45 43 55 52 49 54 59 5f       LPSECURITY_
4070: 41 54 54 52 49 42 55 54 45 53 2c 44 57 4f 52 44  ATTRIBUTES,DWORD
4080: 2c 44 57 4f 52 44 2c 48 41 4e 44 4c 45 29 29 61  ,DWORD,HANDLE))a
4090: 53 79 73 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72  Syscall[5].pCurr
40a0: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
40b0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
40c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
40d0: 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20  32_HAS_ANSI) && 
40e0: 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66 69  \.        (!defi
40f0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4100: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4110: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 20  AX_MMAP_SIZE>0) 
4120: 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53 51 4c  && \.        SQL
4130: 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41 54 45  ITE_WIN32_CREATE
4140: 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20 20 7b  FILEMAPPINGA.  {
4150: 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70   "CreateFileMapp
4160: 69 6e 67 41 22 2c 20 20 20 20 20 20 28 53 59 53  ingA",      (SYS
4170: 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d  CALL)CreateFileM
4180: 61 70 70 69 6e 67 41 2c 20 20 20 20 20 20 30 20  appingA,      0 
4190: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72  },.#else.  { "Cr
41a0: 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
41b0: 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c  ",      (SYSCALL
41c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41d0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
41e0: 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f  endif..#define o
41f0: 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
4200: 6e 67 41 20 28 28 48 41 4e 44 4c 45 28 57 49 4e  ngA ((HANDLE(WIN
4210: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 53  API*)(HANDLE,LPS
4220: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
4230: 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57  ES, \.        DW
4240: 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c  ORD,DWORD,DWORD,
4250: 4c 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c  LPCSTR))aSyscall
4260: 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [6].pCurrent)..#
4270: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
4280: 43 45 20 7c 7c 20 28 21 53 51 4c 49 54 45 5f 4f  CE || (!SQLITE_O
4290: 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e  S_WINRT && defin
42a0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
42b0: 48 41 53 5f 57 49 44 45 29 20 26 26 20 5c 0a 20  HAS_WIDE) && \. 
42c0: 20 20 20 20 20 20 20 28 21 64 65 66 69 6e 65 64         (!defined
42d0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
42e0: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
42f0: 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 29 0a 20 20  MMAP_SIZE>0)).  
4300: 7b 20 22 43 72 65 61 74 65 46 69 6c 65 4d 61 70  { "CreateFileMap
4310: 70 69 6e 67 57 22 2c 20 20 20 20 20 20 28 53 59  pingW",      (SY
4320: 53 43 41 4c 4c 29 43 72 65 61 74 65 46 69 6c 65  SCALL)CreateFile
4330: 4d 61 70 70 69 6e 67 57 2c 20 20 20 20 20 20 30  MappingW,      0
4340: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43   },.#else.  { "C
4350: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
4360: 57 22 2c 20 20 20 20 20 20 28 53 59 53 43 41 4c  W",      (SYSCAL
4370: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
4380: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
4390: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
43a0: 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
43b0: 69 6e 67 57 20 28 28 48 41 4e 44 4c 45 28 57 49  ingW ((HANDLE(WI
43c0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
43d0: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
43e0: 54 45 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  TES, \.        D
43f0: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
4400: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
4410: 6c 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[7].pCurrent).
4420: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4430: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41  (SQLITE_WIN32_HA
4450: 53 5f 57 49 44 45 29 0a 20 20 7b 20 22 43 72 65  S_WIDE).  { "Cre
4460: 61 74 65 4d 75 74 65 78 57 22 2c 20 20 20 20 20  ateMutexW",     
4470: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
4480: 43 72 65 61 74 65 4d 75 74 65 78 57 2c 20 20 20  CreateMutexW,   
4490: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
44a0: 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65 4d  lse.  { "CreateM
44b0: 75 74 65 78 57 22 2c 20 20 20 20 20 20 20 20 20  utexW",         
44c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
44f0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65 61  ..#define osCrea
4500: 74 65 4d 75 74 65 78 57 20 28 28 48 41 4e 44 4c  teMutexW ((HANDL
4510: 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 45 43  E(WINAPI*)(LPSEC
4520: 55 52 49 54 59 5f 41 54 54 52 49 42 55 54 45 53  URITY_ATTRIBUTES
4530: 2c 42 4f 4f 4c 2c 20 5c 0a 20 20 20 20 20 20 20  ,BOOL, \.       
4540: 20 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61   LPCWSTR))aSysca
4550: 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[8].pCurrent).
4560: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
4570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
4580: 53 49 29 0a 20 20 7b 20 22 44 65 6c 65 74 65 46  SI).  { "DeleteF
4590: 69 6c 65 41 22 2c 20 20 20 20 20 20 20 20 20 20  ileA",          
45a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65 6c 65     (SYSCALL)Dele
45b0: 74 65 46 69 6c 65 41 2c 20 20 20 20 20 20 20 20  teFileA,        
45c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
45d0: 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c 65 41    { "DeleteFileA
45e0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
45f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4620: 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65 46 69  efine osDeleteFi
4630: 6c 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  leA ((BOOL(WINAP
4640: 49 2a 29 28 4c 50 43 53 54 52 29 29 61 53 79 73  I*)(LPCSTR))aSys
4650: 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65 6e 74  call[9].pCurrent
4660: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  )..#if defined(S
4670: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
4680: 57 49 44 45 29 0a 20 20 7b 20 22 44 65 6c 65 74  WIDE).  { "Delet
4690: 65 46 69 6c 65 57 22 2c 20 20 20 20 20 20 20 20  eFileW",        
46a0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 44 65       (SYSCALL)De
46b0: 6c 65 74 65 46 69 6c 65 57 2c 20 20 20 20 20 20  leteFileW,      
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
46d0: 65 0a 20 20 7b 20 22 44 65 6c 65 74 65 46 69 6c  e.  { "DeleteFil
46e0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  eW",            
46f0: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
4720: 23 64 65 66 69 6e 65 20 6f 73 44 65 6c 65 74 65  #define osDelete
4730: 46 69 6c 65 57 20 28 28 42 4f 4f 4c 28 57 49 4e  FileW ((BOOL(WIN
4740: 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29 29 61  API*)(LPCWSTR))a
4750: 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72  Syscall[10].pCur
4760: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
4770: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
4780: 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46  FileTimeToLocalF
4790: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
47a0: 4c 4c 29 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63  LL)FileTimeToLoc
47b0: 61 6c 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  alFileTime, 0 },
47c0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65  .#else.  { "File
47d0: 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69 6c 65 54  TimeToLocalFileT
47e0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
47f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4800: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
4810: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46  dif..#define osF
4820: 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c 46 69  ileTimeToLocalFi
4830: 6c 65 54 69 6d 65 20 28 28 42 4f 4f 4c 28 57 49  leTime ((BOOL(WI
4840: 4e 41 50 49 2a 29 28 43 4f 4e 53 54 20 46 49 4c  NAPI*)(CONST FIL
4850: 45 54 49 4d 45 2a 2c 20 5c 0a 20 20 20 20 20 20  ETIME*, \.      
4860: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
4870: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
4880: 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45  ent)..#if SQLITE
4890: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 46  _OS_WINCE.  { "F
48a0: 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54  ileTimeToSystemT
48b0: 69 6d 65 22 2c 20 20 20 20 28 53 59 53 43 41 4c  ime",    (SYSCAL
48c0: 4c 29 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74  L)FileTimeToSyst
48d0: 65 6d 54 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a  emTime,    0 },.
48e0: 23 65 6c 73 65 0a 20 20 7b 20 22 46 69 6c 65 54  #else.  { "FileT
48f0: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 22  imeToSystemTime"
4900: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c  ,    (SYSCALL)0,
4910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4920: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
4930: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 69  if..#define osFi
4940: 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d 54 69  leTimeToSystemTi
4950: 6d 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49  me ((BOOL(WINAPI
4960: 2a 29 28 43 4f 4e 53 54 20 46 49 4c 45 54 49 4d  *)(CONST FILETIM
4970: 45 2a 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50  E*, \.        LP
4980: 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53 79 73  SYSTEMTIME))aSys
4990: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
49a0: 74 29 0a 0a 20 20 7b 20 22 46 6c 75 73 68 46 69  t)..  { "FlushFi
49b0: 6c 65 42 75 66 66 65 72 73 22 2c 20 20 20 20 20  leBuffers",     
49c0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73     (SYSCALL)Flus
49d0: 68 46 69 6c 65 42 75 66 66 65 72 73 2c 20 20 20  hFileBuffers,   
49e0: 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69       0 },..#defi
49f0: 6e 65 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75  ne osFlushFileBu
4a00: 66 66 65 72 73 20 28 28 42 4f 4f 4c 28 57 49 4e  ffers ((BOOL(WIN
4a10: 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53  API*)(HANDLE))aS
4a20: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
4a30: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4a40: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
4a50: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 46 6f  AS_ANSI).  { "Fo
4a60: 72 6d 61 74 4d 65 73 73 61 67 65 41 22 2c 20 20  rmatMessageA",  
4a70: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
4a80: 29 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 41 2c  )FormatMessageA,
4a90: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4aa0: 65 6c 73 65 0a 20 20 7b 20 22 46 6f 72 6d 61 74  else.  { "Format
4ab0: 4d 65 73 73 61 67 65 41 22 2c 20 20 20 20 20 20  MessageA",      
4ac0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
4ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ae0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4af0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 46 6f 72  f..#define osFor
4b00: 6d 61 74 4d 65 73 73 61 67 65 41 20 28 28 44 57  matMessageA ((DW
4b10: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f  ORD(WINAPI*)(DWO
4b20: 52 44 2c 4c 50 43 56 4f 49 44 2c 44 57 4f 52 44  RD,LPCVOID,DWORD
4b30: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
4b40: 20 20 20 20 20 20 20 20 44 57 4f 52 44 2c 76 61          DWORD,va
4b50: 5f 6c 69 73 74 2a 29 29 61 53 79 73 63 61 6c 6c  _list*))aSyscall
4b60: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
4b70: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
4b80: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
4b90: 45 29 0a 20 20 7b 20 22 46 6f 72 6d 61 74 4d 65  E).  { "FormatMe
4ba0: 73 73 61 67 65 57 22 2c 20 20 20 20 20 20 20 20  ssageW",        
4bb0: 20 20 28 53 59 53 43 41 4c 4c 29 46 6f 72 6d 61    (SYSCALL)Forma
4bc0: 74 4d 65 73 73 61 67 65 57 2c 20 20 20 20 20 20  tMessageW,      
4bd0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
4be0: 20 7b 20 22 46 6f 72 6d 61 74 4d 65 73 73 61 67   { "FormatMessag
4bf0: 65 57 22 2c 20 20 20 20 20 20 20 20 20 20 28 53  eW",          (S
4c00: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c20: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
4c30: 66 69 6e 65 20 6f 73 46 6f 72 6d 61 74 4d 65 73  fine osFormatMes
4c40: 73 61 67 65 57 20 28 28 44 57 4f 52 44 28 57 49  sageW ((DWORD(WI
4c50: 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c 50 43  NAPI*)(DWORD,LPC
4c60: 56 4f 49 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  VOID,DWORD,DWORD
4c70: 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20 20 20 20  ,LPWSTR, \.     
4c80: 20 20 20 44 57 4f 52 44 2c 76 61 5f 6c 69 73 74     DWORD,va_list
4c90: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e  *))aSyscall[15].
4ca0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4cb0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4cc0: 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
4cd0: 4f 4e 29 0a 20 20 7b 20 22 46 72 65 65 4c 69 62  ON).  { "FreeLib
4ce0: 72 61 72 79 22 2c 20 20 20 20 20 20 20 20 20 20  rary",          
4cf0: 20 20 20 28 53 59 53 43 41 4c 4c 29 46 72 65 65     (SYSCALL)Free
4d00: 4c 69 62 72 61 72 79 2c 20 20 20 20 20 20 20 20  Library,        
4d10: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
4d20: 20 20 7b 20 22 46 72 65 65 4c 69 62 72 61 72 79    { "FreeLibrary
4d30: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
4d40: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
4d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d60: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
4d70: 65 66 69 6e 65 20 6f 73 46 72 65 65 4c 69 62 72  efine osFreeLibr
4d80: 61 72 79 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ary ((BOOL(WINAP
4d90: 49 2a 29 28 48 4d 4f 44 55 4c 45 29 29 61 53 79  I*)(HMODULE))aSy
4da0: 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72 65  scall[16].pCurre
4db0: 6e 74 29 0a 0a 20 20 7b 20 22 47 65 74 43 75 72  nt)..  { "GetCur
4dc0: 72 65 6e 74 50 72 6f 63 65 73 73 49 64 22 2c 20  rentProcessId", 
4dd0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74      (SYSCALL)Get
4de0: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
4df0: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
4e00: 69 6e 65 20 6f 73 47 65 74 43 75 72 72 65 6e 74  ine osGetCurrent
4e10: 50 72 6f 63 65 73 73 49 64 20 28 28 44 57 4f 52  ProcessId ((DWOR
4e20: 44 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29  D(WINAPI*)(VOID)
4e30: 29 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43  )aSyscall[17].pC
4e40: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
4e50: 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26  LITE_OS_WINCE &&
4e60: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4e70: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
4e80: 20 20 7b 20 22 47 65 74 44 69 73 6b 46 72 65 65    { "GetDiskFree
4e90: 53 70 61 63 65 41 22 2c 20 20 20 20 20 20 20 28  SpaceA",       (
4ea0: 53 59 53 43 41 4c 4c 29 47 65 74 44 69 73 6b 46  SYSCALL)GetDiskF
4eb0: 72 65 65 53 70 61 63 65 41 2c 20 20 20 20 20 20  reeSpaceA,      
4ec0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
4ed0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ee0: 65 41 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eA",       (SYSC
4ef0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4f10: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
4f20: 65 20 6f 73 47 65 74 44 69 73 6b 46 72 65 65 53  e osGetDiskFreeS
4f30: 70 61 63 65 41 20 28 28 42 4f 4f 4c 28 57 49 4e  paceA ((BOOL(WIN
4f40: 41 50 49 2a 29 28 4c 50 43 53 54 52 2c 4c 50 44  API*)(LPCSTR,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 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[18].pCurrent).
4f90: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
4fa0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
4fb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
4fc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
4fd0: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
4fe0: 22 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63  "GetDiskFreeSpac
4ff0: 65 57 22 2c 20 20 20 20 20 20 20 28 53 59 53 43  eW",       (SYSC
5000: 41 4c 4c 29 47 65 74 44 69 73 6b 46 72 65 65 53  ALL)GetDiskFreeS
5010: 70 61 63 65 57 2c 20 20 20 20 20 20 20 30 20 7d  paceW,       0 }
5020: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5030: 44 69 73 6b 46 72 65 65 53 70 61 63 65 57 22 2c  DiskFreeSpaceW",
5040: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5050: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
5060: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5070: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
5080: 47 65 74 44 69 73 6b 46 72 65 65 53 70 61 63 65  GetDiskFreeSpace
5090: 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  W ((BOOL(WINAPI*
50a0: 29 28 4c 50 43 57 53 54 52 2c 4c 50 44 57 4f 52  )(LPCWSTR,LPDWOR
50b0: 44 2c 4c 50 44 57 4f 52 44 2c 4c 50 44 57 4f 52  D,LPDWORD,LPDWOR
50c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 44  D, \.        LPD
50d0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 31  WORD))aSyscall[1
50e0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
50f0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
5100: 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29  _WIN32_HAS_ANSI)
5110: 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74  .  { "GetFileAtt
5120: 72 69 62 75 74 65 73 41 22 2c 20 20 20 20 20 20  ributesA",      
5130: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
5140: 41 74 74 72 69 62 75 74 65 73 41 2c 20 20 20 20  AttributesA,    
5150: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
5160: 20 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75   "GetFileAttribu
5170: 74 65 73 41 22 2c 20 20 20 20 20 20 28 53 59 53  tesA",      (SYS
5180: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
5190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
51a0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
51b0: 6e 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72  ne osGetFileAttr
51c0: 69 62 75 74 65 73 41 20 28 28 44 57 4f 52 44 28  ibutesA ((DWORD(
51d0: 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52 29  WINAPI*)(LPCSTR)
51e0: 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70 43  )aSyscall[20].pC
51f0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
5200: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
5210: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5220: 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
5230: 20 20 7b 20 22 47 65 74 46 69 6c 65 41 74 74 72    { "GetFileAttr
5240: 69 62 75 74 65 73 57 22 2c 20 20 20 20 20 20 28  ibutesW",      (
5250: 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65 41  SYSCALL)GetFileA
5260: 74 74 72 69 62 75 74 65 73 57 2c 20 20 20 20 20  ttributesW,     
5270: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
5280: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5290: 65 73 57 22 2c 20 20 20 20 20 20 28 53 59 53 43  esW",      (SYSC
52a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
52c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
52d0: 65 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  e osGetFileAttri
52e0: 62 75 74 65 73 57 20 28 28 44 57 4f 52 44 28 57  butesW ((DWORD(W
52f0: 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 29  INAPI*)(LPCWSTR)
5300: 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43  )aSyscall[21].pC
5310: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
5320: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
5330: 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 7b 20  2_HAS_WIDE).  { 
5340: 22 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  "GetFileAttribut
5350: 65 73 45 78 57 22 2c 20 20 20 20 28 53 59 53 43  esExW",    (SYSC
5360: 41 4c 4c 29 47 65 74 46 69 6c 65 41 74 74 72 69  ALL)GetFileAttri
5370: 62 75 74 65 73 45 78 57 2c 20 20 20 20 30 20 7d  butesExW,    0 }
5380: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74  ,.#else.  { "Get
5390: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78  FileAttributesEx
53a0: 57 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29  W",    (SYSCALL)
53b0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
53c0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
53d0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
53e0: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
53f0: 73 45 78 57 20 28 28 42 4f 4f 4c 28 57 49 4e 41  sExW ((BOOL(WINA
5400: 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 47 45 54  PI*)(LPCWSTR,GET
5410: 5f 46 49 4c 45 45 58 5f 49 4e 46 4f 5f 4c 45 56  _FILEEX_INFO_LEV
5420: 45 4c 53 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ELS, \.        L
5430: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
5440: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
5450: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5460: 4e 52 54 0a 20 20 7b 20 22 47 65 74 46 69 6c 65  NRT.  { "GetFile
5470: 53 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20  Size",          
5480: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
5490: 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
54a0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
54b0: 20 20 7b 20 22 47 65 74 46 69 6c 65 53 69 7a 65    { "GetFileSize
54c0: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
54d0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
54e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54f0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5500: 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c 65 53  efine osGetFileS
5510: 69 7a 65 20 28 28 44 57 4f 52 44 28 57 49 4e 41  ize ((DWORD(WINA
5520: 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50 44 57  PI*)(HANDLE,LPDW
5530: 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ORD))aSyscall[23
5540: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5550: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
5560: 45 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  E && defined(SQL
5570: 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
5580: 53 49 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c  SI).  { "GetFull
5590: 50 61 74 68 4e 61 6d 65 41 22 2c 20 20 20 20 20  PathNameA",     
55a0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46     (SYSCALL)GetF
55b0: 75 6c 6c 50 61 74 68 4e 61 6d 65 41 2c 20 20 20  ullPathNameA,   
55c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
55d0: 20 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68    { "GetFullPath
55e0: 4e 61 6d 65 41 22 2c 20 20 20 20 20 20 20 20 28  NameA",        (
55f0: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
5620: 65 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50  efine osGetFullP
5630: 61 74 68 4e 61 6d 65 41 20 28 28 44 57 4f 52 44  athNameA ((DWORD
5640: 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 53 54 52  (WINAPI*)(LPCSTR
5650: 2c 44 57 4f 52 44 2c 4c 50 53 54 52 2c 20 5c 0a  ,DWORD,LPSTR, \.
5660: 20 20 20 20 20 20 20 20 4c 50 53 54 52 2a 29 29          LPSTR*))
5670: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
5680: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c  rrent)..#if !SQL
5690: 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
56a0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
56b0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
56c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44  TE_WIN32_HAS_WID
56d0: 45 29 0a 20 20 7b 20 22 47 65 74 46 75 6c 6c 50  E).  { "GetFullP
56e0: 61 74 68 4e 61 6d 65 57 22 2c 20 20 20 20 20 20  athNameW",      
56f0: 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 46 75    (SYSCALL)GetFu
5700: 6c 6c 50 61 74 68 4e 61 6d 65 57 2c 20 20 20 20  llPathNameW,    
5710: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
5720: 20 7b 20 22 47 65 74 46 75 6c 6c 50 61 74 68 4e   { "GetFullPathN
5730: 61 6d 65 57 22 2c 20 20 20 20 20 20 20 20 28 53  ameW",        (S
5740: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
5770: 66 69 6e 65 20 6f 73 47 65 74 46 75 6c 6c 50 61  fine osGetFullPa
5780: 74 68 4e 61 6d 65 57 20 28 28 44 57 4f 52 44 28  thNameW ((DWORD(
5790: 57 49 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52  WINAPI*)(LPCWSTR
57a0: 2c 44 57 4f 52 44 2c 4c 50 57 53 54 52 2c 20 5c  ,DWORD,LPWSTR, \
57b0: 0a 20 20 20 20 20 20 20 20 4c 50 57 53 54 52 2a  .        LPWSTR*
57c0: 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70  ))aSyscall[25].p
57d0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 47  Current)..  { "G
57e0: 65 74 4c 61 73 74 45 72 72 6f 72 22 2c 20 20 20  etLastError",   
57f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
5800: 4c 29 47 65 74 4c 61 73 74 45 72 72 6f 72 2c 20  L)GetLastError, 
5810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
5820: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 4c 61  .#define osGetLa
5830: 73 74 45 72 72 6f 72 20 28 28 44 57 4f 52 44 28  stError ((DWORD(
5840: 57 49 4e 41 50 49 2a 29 28 56 4f 49 44 29 29 61  WINAPI*)(VOID))a
5850: 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72  Syscall[26].pCur
5860: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
5870: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5880: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 29 0a  LOAD_EXTENSION).
5890: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
58a0: 4e 43 45 0a 20 20 2f 2a 20 54 68 65 20 47 65 74  NCE.  /* The Get
58b0: 50 72 6f 63 41 64 64 72 65 73 73 41 28 29 20 72  ProcAddressA() r
58c0: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 61  outine is only a
58d0: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 57 69 6e 64  vailable on Wind
58e0: 6f 77 73 20 43 45 2e 20 2a 2f 0a 20 20 7b 20 22  ows CE. */.  { "
58f0: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 41 22  GetProcAddressA"
5900: 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41  ,         (SYSCA
5910: 4c 4c 29 47 65 74 50 72 6f 63 41 64 64 72 65 73  LL)GetProcAddres
5920: 73 41 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c  sA,         0 },
5930: 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 41 6c 6c 20  .#else.  /* All 
5940: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 20 70 6c  other Windows pl
5950: 61 74 66 6f 72 6d 73 20 65 78 70 65 63 74 20 47  atforms expect G
5960: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 29 20  etProcAddress() 
5970: 74 6f 20 74 61 6b 65 0a 20 20 2a 2a 20 61 6e 20  to take.  ** an 
5980: 41 4e 53 49 20 73 74 72 69 6e 67 20 72 65 67 61  ANSI string rega
5990: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 5f 55  rdless of the _U
59a0: 4e 49 43 4f 44 45 20 73 65 74 74 69 6e 67 20 2a  NICODE setting *
59b0: 2f 0a 20 20 7b 20 22 47 65 74 50 72 6f 63 41 64  /.  { "GetProcAd
59c0: 64 72 65 73 73 41 22 2c 20 20 20 20 20 20 20 20  dressA",        
59d0: 20 28 53 59 53 43 41 4c 4c 29 47 65 74 50 72 6f   (SYSCALL)GetPro
59e0: 63 41 64 64 72 65 73 73 2c 20 20 20 20 20 20 20  cAddress,       
59f0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
5a00: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 50 72 6f  else.  { "GetPro
5a10: 63 41 64 64 72 65 73 73 41 22 2c 20 20 20 20 20  cAddressA",     
5a20: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5a40: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5a50: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5a60: 50 72 6f 63 41 64 64 72 65 73 73 41 20 28 28 46  ProcAddressA ((F
5a70: 41 52 50 52 4f 43 28 57 49 4e 41 50 49 2a 29 28  ARPROC(WINAPI*)(
5a80: 48 4d 4f 44 55 4c 45 2c 20 5c 0a 20 20 20 20 20  HMODULE, \.     
5a90: 20 20 20 4c 50 43 53 54 52 29 29 61 53 79 73 63     LPCSTR))aSysc
5aa0: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
5ab0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
5ac0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 47 65 74  S_WINRT.  { "Get
5ad0: 53 79 73 74 65 6d 49 6e 66 6f 22 2c 20 20 20 20  SystemInfo",    
5ae0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
5af0: 47 65 74 53 79 73 74 65 6d 49 6e 66 6f 2c 20 20  GetSystemInfo,  
5b00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
5b10: 6c 73 65 0a 20 20 7b 20 22 47 65 74 53 79 73 74  lse.  { "GetSyst
5b20: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 20 20 20  emInfo",        
5b30: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
5b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b50: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
5b60: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 53  ..#define osGetS
5b70: 79 73 74 65 6d 49 6e 66 6f 20 28 28 56 4f 49 44  ystemInfo ((VOID
5b80: 28 57 49 4e 41 50 49 2a 29 28 4c 50 53 59 53 54  (WINAPI*)(LPSYST
5b90: 45 4d 5f 49 4e 46 4f 29 29 61 53 79 73 63 61 6c  EM_INFO))aSyscal
5ba0: 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[28].pCurrent).
5bb0: 0a 20 20 7b 20 22 47 65 74 53 79 73 74 65 6d 54  .  { "GetSystemT
5bc0: 69 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ime",           
5bd0: 28 53 59 53 43 41 4c 4c 29 47 65 74 53 79 73 74  (SYSCALL)GetSyst
5be0: 65 6d 54 69 6d 65 2c 20 20 20 20 20 20 20 20 20  emTime,         
5bf0: 20 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20    0 },..#define 
5c00: 6f 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 20  osGetSystemTime 
5c10: 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28  ((VOID(WINAPI*)(
5c20: 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 29 61 53  LPSYSTEMTIME))aS
5c30: 79 73 63 61 6c 6c 5b 32 39 5d 2e 70 43 75 72 72  yscall[29].pCurr
5c40: 65 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54  ent)..#if !SQLIT
5c50: 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22  E_OS_WINCE.  { "
5c60: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
5c70: 69 6c 65 54 69 6d 65 22 2c 20 28 53 59 53 43 41  ileTime", (SYSCA
5c80: 4c 4c 29 47 65 74 53 79 73 74 65 6d 54 69 6d 65  LL)GetSystemTime
5c90: 41 73 46 69 6c 65 54 69 6d 65 2c 20 30 20 7d 2c  AsFileTime, 0 },
5ca0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 53  .#else.  { "GetS
5cb0: 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65 54  ystemTimeAsFileT
5cc0: 69 6d 65 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  ime", (SYSCALL)0
5cd0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5ce0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
5cf0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47  dif..#define osG
5d00: 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69  etSystemTimeAsFi
5d10: 6c 65 54 69 6d 65 20 28 28 56 4f 49 44 28 57 49  leTime ((VOID(WI
5d20: 4e 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20  NAPI*)( \.      
5d30: 20 20 4c 50 46 49 4c 45 54 49 4d 45 29 29 61 53    LPFILETIME))aS
5d40: 79 73 63 61 6c 6c 5b 33 30 5d 2e 70 43 75 72 72  yscall[30].pCurr
5d50: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5d60: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
5d70: 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22 47 65  AS_ANSI).  { "Ge
5d80: 74 54 65 6d 70 50 61 74 68 41 22 2c 20 20 20 20  tTempPathA",    
5d90: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
5da0: 29 47 65 74 54 65 6d 70 50 61 74 68 41 2c 20 20  )GetTempPathA,  
5db0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
5dc0: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d  else.  { "GetTem
5dd0: 70 50 61 74 68 41 22 2c 20 20 20 20 20 20 20 20  pPathA",        
5de0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
5df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e00: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
5e10: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
5e20: 54 65 6d 70 50 61 74 68 41 20 28 28 44 57 4f 52  TempPathA ((DWOR
5e30: 44 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  D(WINAPI*)(DWORD
5e40: 2c 4c 50 53 54 52 29 29 61 53 79 73 63 61 6c 6c  ,LPSTR))aSyscall
5e50: 5b 33 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [31].pCurrent)..
5e60: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
5e70: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
5e80: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
5e90: 5f 57 49 44 45 29 0a 20 20 7b 20 22 47 65 74 54  _WIDE).  { "GetT
5ea0: 65 6d 70 50 61 74 68 57 22 2c 20 20 20 20 20 20  empPathW",      
5eb0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 47        (SYSCALL)G
5ec0: 65 74 54 65 6d 70 50 61 74 68 57 2c 20 20 20 20  etTempPathW,    
5ed0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
5ee0: 73 65 0a 20 20 7b 20 22 47 65 74 54 65 6d 70 50  se.  { "GetTempP
5ef0: 61 74 68 57 22 2c 20 20 20 20 20 20 20 20 20 20  athW",          
5f00: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
5f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f20: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
5f30: 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 54 65  .#define osGetTe
5f40: 6d 70 50 61 74 68 57 20 28 28 44 57 4f 52 44 28  mpPathW ((DWORD(
5f50: 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 2c 4c  WINAPI*)(DWORD,L
5f60: 50 57 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PWSTR))aSyscall[
5f70: 33 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  32].pCurrent)..#
5f80: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
5f90: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
5fa0: 43 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  Count",         
5fb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
5fc0: 69 63 6b 43 6f 75 6e 74 2c 20 20 20 20 20 20 20  ickCount,       
5fd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
5fe0: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
5ff0: 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 28  t",            (
6000: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6020: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6030: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
6040: 6f 75 6e 74 20 28 28 44 57 4f 52 44 28 57 49 4e  ount ((DWORD(WIN
6050: 41 50 49 2a 29 28 56 4f 49 44 29 29 61 53 79 73  API*)(VOID))aSys
6060: 63 61 6c 6c 5b 33 33 5d 2e 70 43 75 72 72 65 6e  call[33].pCurren
6070: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
6080: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
6090: 5f 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45  _ANSI) && SQLITE
60a0: 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49 4f  _WIN32_GETVERSIO
60b0: 4e 45 58 0a 20 20 7b 20 22 47 65 74 56 65 72 73  NEX.  { "GetVers
60c0: 69 6f 6e 45 78 41 22 2c 20 20 20 20 20 20 20 20  ionExA",        
60d0: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 56     (SYSCALL)GetV
60e0: 65 72 73 69 6f 6e 45 78 41 2c 20 20 20 20 20 20  ersionExA,      
60f0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6100: 20 20 7b 20 22 47 65 74 56 65 72 73 69 6f 6e 45    { "GetVersionE
6110: 78 41 22 2c 20 20 20 20 20 20 20 20 20 20 20 28  xA",           (
6120: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6140: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
6150: 65 66 69 6e 65 20 6f 73 47 65 74 56 65 72 73 69  efine osGetVersi
6160: 6f 6e 45 78 41 20 28 28 42 4f 4f 4c 28 57 49 4e  onExA ((BOOL(WIN
6170: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
6180: 20 4c 50 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f   LPOSVERSIONINFO
6190: 41 29 29 61 53 79 73 63 61 6c 6c 5b 33 34 5d 2e  A))aSyscall[34].
61a0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
61b0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
61c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
61d0: 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45  E_WIN32_HAS_WIDE
61e0: 29 20 26 26 20 5c 0a 20 20 20 20 20 20 20 20 53  ) && \.        S
61f0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56  QLITE_WIN32_GETV
6200: 45 52 53 49 4f 4e 45 58 0a 20 20 7b 20 22 47 65  ERSIONEX.  { "Ge
6210: 74 56 65 72 73 69 6f 6e 45 78 57 22 2c 20 20 20  tVersionExW",   
6220: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
6230: 29 47 65 74 56 65 72 73 69 6f 6e 45 78 57 2c 20  )GetVersionExW, 
6240: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6250: 65 6c 73 65 0a 20 20 7b 20 22 47 65 74 56 65 72  else.  { "GetVer
6260: 73 69 6f 6e 45 78 57 22 2c 20 20 20 20 20 20 20  sionExW",       
6270: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
6280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6290: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
62a0: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  f..#define osGet
62b0: 56 65 72 73 69 6f 6e 45 78 57 20 28 28 42 4f 4f  VersionExW ((BOO
62c0: 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20 20  L(WINAPI*)( \.  
62d0: 20 20 20 20 20 20 4c 50 4f 53 56 45 52 53 49 4f        LPOSVERSIO
62e0: 4e 49 4e 46 4f 57 29 29 61 53 79 73 63 61 6c 6c  NINFOW))aSyscall
62f0: 5b 33 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [35].pCurrent)..
6300: 20 20 7b 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c    { "HeapAlloc",
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6320: 53 59 53 43 41 4c 4c 29 48 65 61 70 41 6c 6c 6f  SYSCALL)HeapAllo
6330: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
6340: 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f   0 },..#define o
6350: 73 48 65 61 70 41 6c 6c 6f 63 20 28 28 4c 50 56  sHeapAlloc ((LPV
6360: 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  OID(WINAPI*)(HAN
6370: 44 4c 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20  DLE,DWORD, \.   
6380: 20 20 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79       SIZE_T))aSy
6390: 73 63 61 6c 6c 5b 33 36 5d 2e 70 43 75 72 72 65  scall[36].pCurre
63a0: 6e 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  nt)..#if !SQLITE
63b0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
63c0: 65 61 70 43 72 65 61 74 65 22 2c 20 20 20 20 20  eapCreate",     
63d0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
63e0: 4c 29 48 65 61 70 43 72 65 61 74 65 2c 20 20 20  L)HeapCreate,   
63f0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6400: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6410: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
6420: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6440: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6450: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6460: 61 70 43 72 65 61 74 65 20 28 28 48 41 4e 44 4c  apCreate ((HANDL
6470: 45 28 57 49 4e 41 50 49 2a 29 28 44 57 4f 52 44  E(WINAPI*)(DWORD
6480: 2c 53 49 5a 45 5f 54 2c 20 5c 0a 20 20 20 20 20  ,SIZE_T, \.     
6490: 20 20 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63     SIZE_T))aSysc
64a0: 61 6c 6c 5b 33 37 5d 2e 70 43 75 72 72 65 6e 74  all[37].pCurrent
64b0: 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f  )..#if !SQLITE_O
64c0: 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61  S_WINRT.  { "Hea
64d0: 70 44 65 73 74 72 6f 79 22 2c 20 20 20 20 20 20  pDestroy",      
64e0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
64f0: 48 65 61 70 44 65 73 74 72 6f 79 2c 20 20 20 20  HeapDestroy,    
6500: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6510: 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 44 65 73  lse.  { "HeapDes
6520: 74 72 6f 79 22 2c 20 20 20 20 20 20 20 20 20 20  troy",          
6530: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6560: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70  ..#define osHeap
6570: 44 65 73 74 72 6f 79 20 28 28 42 4f 4f 4c 28 57  Destroy ((BOOL(W
6580: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 29 29  INAPI*)(HANDLE))
6590: 61 53 79 73 63 61 6c 6c 5b 33 38 5d 2e 70 43 75  aSyscall[38].pCu
65a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 48 65 61  rrent)..  { "Hea
65b0: 70 46 72 65 65 22 2c 20 20 20 20 20 20 20 20 20  pFree",         
65c0: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
65d0: 48 65 61 70 46 72 65 65 2c 20 20 20 20 20 20 20  HeapFree,       
65e0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23           0 },..#
65f0: 64 65 66 69 6e 65 20 6f 73 48 65 61 70 46 72 65  define osHeapFre
6600: 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a  e ((BOOL(WINAPI*
6610: 29 28 48 41 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c  )(HANDLE,DWORD,L
6620: 50 56 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b  PVOID))aSyscall[
6630: 33 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  39].pCurrent).. 
6640: 20 7b 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22   { "HeapReAlloc"
6650: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53  ,             (S
6660: 59 53 43 41 4c 4c 29 48 65 61 70 52 65 41 6c 6c  YSCALL)HeapReAll
6670: 6f 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  oc,             
6680: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
6690: 48 65 61 70 52 65 41 6c 6c 6f 63 20 28 28 4c 50  HeapReAlloc ((LP
66a0: 56 4f 49 44 28 57 49 4e 41 50 49 2a 29 28 48 41  VOID(WINAPI*)(HA
66b0: 4e 44 4c 45 2c 44 57 4f 52 44 2c 4c 50 56 4f 49  NDLE,DWORD,LPVOI
66c0: 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 53 49 5a  D, \.        SIZ
66d0: 45 5f 54 29 29 61 53 79 73 63 61 6c 6c 5b 34 30  E_T))aSyscall[40
66e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
66f0: 20 22 48 65 61 70 53 69 7a 65 22 2c 20 20 20 20   "HeapSize",    
6700: 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53              (SYS
6710: 43 41 4c 4c 29 48 65 61 70 53 69 7a 65 2c 20 20  CALL)HeapSize,  
6720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6730: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  },..#define osHe
6740: 61 70 53 69 7a 65 20 28 28 53 49 5a 45 5f 54 28  apSize ((SIZE_T(
6750: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
6760: 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20  DWORD, \.       
6770: 20 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61   LPCVOID))aSysca
6780: 6c 6c 5b 34 31 5d 2e 70 43 75 72 72 65 6e 74 29  ll[41].pCurrent)
6790: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
67a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48 65 61 70  _WINRT.  { "Heap
67b0: 56 61 6c 69 64 61 74 65 22 2c 20 20 20 20 20 20  Validate",      
67c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 48        (SYSCALL)H
67d0: 65 61 70 56 61 6c 69 64 61 74 65 2c 20 20 20 20  eapValidate,    
67e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
67f0: 73 65 0a 20 20 7b 20 22 48 65 61 70 56 61 6c 69  se.  { "HeapVali
6800: 64 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  date",          
6810: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6830: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
6840: 0a 23 64 65 66 69 6e 65 20 6f 73 48 65 61 70 56  .#define osHeapV
6850: 61 6c 69 64 61 74 65 20 28 28 42 4f 4f 4c 28 57  alidate ((BOOL(W
6860: 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44  INAPI*)(HANDLE,D
6870: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
6880: 4c 50 43 56 4f 49 44 29 29 61 53 79 73 63 61 6c  LPCVOID))aSyscal
6890: 6c 5b 34 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[42].pCurrent).
68a0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
68b0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
68c0: 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 48  _OS_WINRT.  { "H
68d0: 65 61 70 43 6f 6d 70 61 63 74 22 2c 20 20 20 20  eapCompact",    
68e0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
68f0: 4c 29 48 65 61 70 43 6f 6d 70 61 63 74 2c 20 20  L)HeapCompact,  
6900: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6910: 23 65 6c 73 65 0a 20 20 7b 20 22 48 65 61 70 43  #else.  { "HeapC
6920: 6f 6d 70 61 63 74 22 2c 20 20 20 20 20 20 20 20  ompact",        
6930: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6950: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6960: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 48 65  if..#define osHe
6970: 61 70 43 6f 6d 70 61 63 74 20 28 28 55 49 4e 54  apCompact ((UINT
6980: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
6990: 2c 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c  ,DWORD))aSyscall
69a0: 5b 34 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [43].pCurrent)..
69b0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
69c0: 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
69d0: 49 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  I) && !defined(S
69e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
69f0: 45 58 54 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22  EXTENSION).  { "
6a00: 4c 6f 61 64 4c 69 62 72 61 72 79 41 22 2c 20 20  LoadLibraryA",  
6a10: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6a20: 4c 4c 29 4c 6f 61 64 4c 69 62 72 61 72 79 41 2c  LL)LoadLibraryA,
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6a40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64  .#else.  { "Load
6a50: 4c 69 62 72 61 72 79 41 22 2c 20 20 20 20 20 20  LibraryA",      
6a60: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6a70: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6a80: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6a90: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c  dif..#define osL
6aa0: 6f 61 64 4c 69 62 72 61 72 79 41 20 28 28 48 4d  oadLibraryA ((HM
6ab0: 4f 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c  ODULE(WINAPI*)(L
6ac0: 50 43 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b  PCSTR))aSyscall[
6ad0: 34 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  44].pCurrent)..#
6ae0: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
6af0: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
6b00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
6b10: 57 49 44 45 29 20 26 26 20 5c 0a 20 20 20 20 20  WIDE) && \.     
6b20: 20 20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49     !defined(SQLI
6b30: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
6b40: 45 4e 53 49 4f 4e 29 0a 20 20 7b 20 22 4c 6f 61  ENSION).  { "Loa
6b50: 64 4c 69 62 72 61 72 79 57 22 2c 20 20 20 20 20  dLibraryW",     
6b60: 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29         (SYSCALL)
6b70: 4c 6f 61 64 4c 69 62 72 61 72 79 57 2c 20 20 20  LoadLibraryW,   
6b80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6b90: 6c 73 65 0a 20 20 7b 20 22 4c 6f 61 64 4c 69 62  lse.  { "LoadLib
6ba0: 72 61 72 79 57 22 2c 20 20 20 20 20 20 20 20 20  raryW",         
6bb0: 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20     (SYSCALL)0,  
6bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bd0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
6be0: 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4c 6f 61 64  ..#define osLoad
6bf0: 4c 69 62 72 61 72 79 57 20 28 28 48 4d 4f 44 55  LibraryW ((HMODU
6c00: 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  LE(WINAPI*)(LPCW
6c10: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 34 35  STR))aSyscall[45
6c20: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
6c30: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
6c40: 54 0a 20 20 7b 20 22 4c 6f 63 61 6c 46 72 65 65  T.  { "LocalFree
6c50: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
6c60: 20 28 53 59 53 43 41 4c 4c 29 4c 6f 63 61 6c 46   (SYSCALL)LocalF
6c70: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ree,            
6c80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
6c90: 7b 20 22 4c 6f 63 61 6c 46 72 65 65 22 2c 20 20  { "LocalFree",  
6ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
6cb0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
6cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
6cd0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
6ce0: 69 6e 65 20 6f 73 4c 6f 63 61 6c 46 72 65 65 20  ine osLocalFree 
6cf0: 28 28 48 4c 4f 43 41 4c 28 57 49 4e 41 50 49 2a  ((HLOCAL(WINAPI*
6d00: 29 28 48 4c 4f 43 41 4c 29 29 61 53 79 73 63 61  )(HLOCAL))aSysca
6d10: 6c 6c 5b 34 36 5d 2e 70 43 75 72 72 65 6e 74 29  ll[46].pCurrent)
6d20: 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  ..#if !SQLITE_OS
6d30: 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54  _WINCE && !SQLIT
6d40: 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22  E_OS_WINRT.  { "
6d50: 4c 6f 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20  LockFile",      
6d60: 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41            (SYSCA
6d70: 4c 4c 29 4c 6f 63 6b 46 69 6c 65 2c 20 20 20 20  LL)LockFile,    
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
6d90: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b  .#else.  { "Lock
6da0: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
6db0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6de0: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c  dif..#ifndef osL
6df0: 6f 63 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20  ockFile.#define 
6e00: 6f 73 4c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  osLockFile ((BOO
6e10: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
6e20: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
6e30: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
6e40: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  WORD))aSyscall[4
6e50: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
6e60: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
6e70: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 4c  _OS_WINCE.  { "L
6e80: 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20  ockFileEx",     
6e90: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
6ea0: 4c 29 4c 6f 63 6b 46 69 6c 65 45 78 2c 20 20 20  L)LockFileEx,   
6eb0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6ec0: 23 65 6c 73 65 0a 20 20 7b 20 22 4c 6f 63 6b 46  #else.  { "LockF
6ed0: 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20 20 20  ileEx",         
6ee0: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
6ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f00: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6f10: 69 66 0a 0a 23 69 66 6e 64 65 66 20 6f 73 4c 6f  if..#ifndef osLo
6f20: 63 6b 46 69 6c 65 45 78 0a 23 64 65 66 69 6e 65  ckFileEx.#define
6f30: 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 20 28 28   osLockFileEx ((
6f40: 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 48 41  BOOL(WINAPI*)(HA
6f50: 4e 44 4c 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44  NDLE,DWORD,DWORD
6f60: 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20 5c 0a  ,DWORD,DWORD, \.
6f70: 20 20 20 20 20 20 20 20 4c 50 4f 56 45 52 4c 41          LPOVERLA
6f80: 50 50 45 44 29 29 61 53 79 73 63 61 6c 6c 5b 34  PPED))aSyscall[4
6f90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  8].pCurrent).#en
6fa0: 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
6fb0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 28 21 53 51  OS_WINCE || (!SQ
6fc0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
6fd0: 20 5c 0a 20 20 20 20 20 20 20 20 28 21 64 65 66   \.        (!def
6fe0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ff0: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7000: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29  MAX_MMAP_SIZE>0)
7010: 29 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  ).  { "MapViewOf
7020: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  File",          
7030: 20 28 53 59 53 43 41 4c 4c 29 4d 61 70 56 69 65   (SYSCALL)MapVie
7040: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7050: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
7060: 7b 20 22 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  { "MapViewOfFile
7070: 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 53 59  ",           (SY
7080: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
7090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
70a0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66   },.#endif..#def
70b0: 69 6e 65 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  ine osMapViewOfF
70c0: 69 6c 65 20 28 28 4c 50 56 4f 49 44 28 57 49 4e  ile ((LPVOID(WIN
70d0: 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 44 57 4f  API*)(HANDLE,DWO
70e0: 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 20  RD,DWORD,DWORD, 
70f0: 5c 0a 20 20 20 20 20 20 20 20 53 49 5a 45 5f 54  \.        SIZE_T
7100: 29 29 61 53 79 73 63 61 6c 6c 5b 34 39 5d 2e 70  ))aSyscall[49].p
7110: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 4d  Current)..  { "M
7120: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
7130: 61 72 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  ar",     (SYSCAL
7140: 4c 29 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64  L)MultiByteToWid
7150: 65 43 68 61 72 2c 20 20 20 20 20 30 20 7d 2c 0a  eChar,     0 },.
7160: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6c 74 69  .#define osMulti
7170: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 20 28  ByteToWideChar (
7180: 28 69 6e 74 28 57 49 4e 41 50 49 2a 29 28 55 49  (int(WINAPI*)(UI
7190: 4e 54 2c 44 57 4f 52 44 2c 4c 50 43 53 54 52 2c  NT,DWORD,LPCSTR,
71a0: 69 6e 74 2c 4c 50 57 53 54 52 2c 20 5c 0a 20 20  int,LPWSTR, \.  
71b0: 20 20 20 20 20 20 69 6e 74 29 29 61 53 79 73 63        int))aSysc
71c0: 61 6c 6c 5b 35 30 5d 2e 70 43 75 72 72 65 6e 74  all[50].pCurrent
71d0: 29 0a 0a 20 20 7b 20 22 51 75 65 72 79 50 65 72  )..  { "QueryPer
71e0: 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74 65 72 22  formanceCounter"
71f0: 2c 20 28 53 59 53 43 41 4c 4c 29 51 75 65 72 79  , (SYSCALL)Query
7200: 50 65 72 66 6f 72 6d 61 6e 63 65 43 6f 75 6e 74  PerformanceCount
7210: 65 72 2c 20 30 20 7d 2c 0a 0a 23 64 65 66 69 6e  er, 0 },..#defin
7220: 65 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d  e osQueryPerform
7230: 61 6e 63 65 43 6f 75 6e 74 65 72 20 28 28 42 4f  anceCounter ((BO
7240: 4f 4c 28 57 49 4e 41 50 49 2a 29 28 20 5c 0a 20  OL(WINAPI*)( \. 
7250: 20 20 20 20 20 20 20 4c 41 52 47 45 5f 49 4e 54         LARGE_INT
7260: 45 47 45 52 2a 29 29 61 53 79 73 63 61 6c 6c 5b  EGER*))aSyscall[
7270: 35 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  51].pCurrent).. 
7280: 20 7b 20 22 52 65 61 64 46 69 6c 65 22 2c 20 20   { "ReadFile",  
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
72a0: 59 53 43 41 4c 4c 29 52 65 61 64 46 69 6c 65 2c  YSCALL)ReadFile,
72b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72c0: 30 20 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73  0 },..#define os
72d0: 52 65 61 64 46 69 6c 65 20 28 28 42 4f 4f 4c 28  ReadFile ((BOOL(
72e0: 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c  WINAPI*)(HANDLE,
72f0: 4c 50 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44  LPVOID,DWORD,LPD
7300: 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20  WORD, \.        
7310: 4c 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53  LPOVERLAPPED))aS
7320: 79 73 63 61 6c 6c 5b 35 32 5d 2e 70 43 75 72 72  yscall[52].pCurr
7330: 65 6e 74 29 0a 0a 20 20 7b 20 22 53 65 74 45 6e  ent)..  { "SetEn
7340: 64 4f 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20  dOfFile",       
7350: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65       (SYSCALL)Se
7360: 74 45 6e 64 4f 66 46 69 6c 65 2c 20 20 20 20 20  tEndOfFile,     
7370: 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65         0 },..#de
7380: 66 69 6e 65 20 6f 73 53 65 74 45 6e 64 4f 66 46  fine osSetEndOfF
7390: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
73a0: 49 2a 29 28 48 41 4e 44 4c 45 29 29 61 53 79 73  I*)(HANDLE))aSys
73b0: 63 61 6c 6c 5b 35 33 5d 2e 70 43 75 72 72 65 6e  call[53].pCurren
73c0: 74 29 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  t)..#if !SQLITE_
73d0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 53 65  OS_WINRT.  { "Se
73e0: 74 46 69 6c 65 50 6f 69 6e 74 65 72 22 2c 20 20  tFilePointer",  
73f0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7400: 29 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 2c  )SetFilePointer,
7410: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7420: 65 6c 73 65 0a 20 20 7b 20 22 53 65 74 46 69 6c  else.  { "SetFil
7430: 65 50 6f 69 6e 74 65 72 22 2c 20 20 20 20 20 20  ePointer",      
7440: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7470: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 53 65 74  f..#define osSet
7480: 46 69 6c 65 50 6f 69 6e 74 65 72 20 28 28 44 57  FilePointer ((DW
7490: 4f 52 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e  ORD(WINAPI*)(HAN
74a0: 44 4c 45 2c 4c 4f 4e 47 2c 50 4c 4f 4e 47 2c 20  DLE,LONG,PLONG, 
74b0: 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52 44 29  \.        DWORD)
74c0: 29 61 53 79 73 63 61 6c 6c 5b 35 34 5d 2e 70 43  )aSyscall[54].pC
74d0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 53 51  urrent)..#if !SQ
74e0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
74f0: 7b 20 22 53 6c 65 65 70 22 2c 20 20 20 20 20 20  { "Sleep",      
7500: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 59               (SY
7510: 53 43 41 4c 4c 29 53 6c 65 65 70 2c 20 20 20 20  SCALL)Sleep,    
7520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
7530: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 53   },.#else.  { "S
7540: 6c 65 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  leep",          
7550: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7560: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
7570: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7580: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
7590: 6f 73 53 6c 65 65 70 20 28 28 56 4f 49 44 28 57  osSleep ((VOID(W
75a0: 49 4e 41 50 49 2a 29 28 44 57 4f 52 44 29 29 61  INAPI*)(DWORD))a
75b0: 53 79 73 63 61 6c 6c 5b 35 35 5d 2e 70 43 75 72  Syscall[55].pCur
75c0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 53 79 73 74  rent)..  { "Syst
75d0: 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65  emTimeToFileTime
75e0: 22 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53  ",    (SYSCALL)S
75f0: 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65 54  ystemTimeToFileT
7600: 69 6d 65 2c 20 20 20 20 30 20 7d 2c 0a 0a 23 64  ime,    0 },..#d
7610: 65 66 69 6e 65 20 6f 73 53 79 73 74 65 6d 54 69  efine osSystemTi
7620: 6d 65 54 6f 46 69 6c 65 54 69 6d 65 20 28 28 42  meToFileTime ((B
7630: 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 43 4f 4e  OOL(WINAPI*)(CON
7640: 53 54 20 53 59 53 54 45 4d 54 49 4d 45 2a 2c 20  ST SYSTEMTIME*, 
7650: 5c 0a 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45  \.        LPFILE
7660: 54 49 4d 45 29 29 61 53 79 73 63 61 6c 6c 5b 35  TIME))aSyscall[5
7670: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
7680: 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
7690: 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53  CE && !SQLITE_OS
76a0: 5f 57 49 4e 52 54 0a 20 20 7b 20 22 55 6e 6c 6f  _WINRT.  { "Unlo
76b0: 63 6b 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20  ckFile",        
76c0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
76d0: 6e 6c 6f 63 6b 46 69 6c 65 2c 20 20 20 20 20 20  nlockFile,      
76e0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
76f0: 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63 6b 46 69  se.  { "UnlockFi
7700: 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
7710: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
7720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7730: 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
7740: 0a 23 69 66 6e 64 65 66 20 6f 73 55 6e 6c 6f 63  .#ifndef osUnloc
7750: 6b 46 69 6c 65 0a 23 64 65 66 69 6e 65 20 6f 73  kFile.#define os
7760: 55 6e 6c 6f 63 6b 46 69 6c 65 20 28 28 42 4f 4f  UnlockFile ((BOO
7770: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
7780: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
7790: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 44  ORD, \.        D
77a0: 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 35  WORD))aSyscall[5
77b0: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e  7].pCurrent).#en
77c0: 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54 45  dif..#if !SQLITE
77d0: 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 7b 20 22 55  _OS_WINCE.  { "U
77e0: 6e 6c 6f 63 6b 46 69 6c 65 45 78 22 2c 20 20 20  nlockFileEx",   
77f0: 20 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c           (SYSCAL
7800: 4c 29 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 2c 20  L)UnlockFileEx, 
7810: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
7820: 23 65 6c 73 65 0a 20 20 7b 20 22 55 6e 6c 6f 63  #else.  { "Unloc
7830: 6b 46 69 6c 65 45 78 22 2c 20 20 20 20 20 20 20  kFileEx",       
7840: 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c       (SYSCALL)0,
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7860: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
7870: 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e  if..#define osUn
7880: 6c 6f 63 6b 46 69 6c 65 45 78 20 28 28 42 4f 4f  lockFileEx ((BOO
7890: 4c 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  L(WINAPI*)(HANDL
78a0: 45 2c 44 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57  E,DWORD,DWORD,DW
78b0: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
78c0: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
78d0: 73 63 61 6c 6c 5b 35 38 5d 2e 70 43 75 72 72 65  scall[58].pCurre
78e0: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
78f0: 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 21 64 65 66  OS_WINCE || !def
7900: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
7910: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
7920: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
7930: 20 20 7b 20 22 55 6e 6d 61 70 56 69 65 77 4f 66    { "UnmapViewOf
7940: 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 28  File",         (
7950: 53 59 53 43 41 4c 4c 29 55 6e 6d 61 70 56 69 65  SYSCALL)UnmapVie
7960: 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20 20 20  wOfFile,        
7970: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7980: 22 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c 65  "UnmapViewOfFile
7990: 22 2c 20 20 20 20 20 20 20 20 20 28 53 59 53 43  ",         (SYSC
79a0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
79c0: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
79d0: 65 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46  e osUnmapViewOfF
79e0: 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49 4e 41 50  ile ((BOOL(WINAP
79f0: 49 2a 29 28 4c 50 43 56 4f 49 44 29 29 61 53 79  I*)(LPCVOID))aSy
7a00: 73 63 61 6c 6c 5b 35 39 5d 2e 70 43 75 72 72 65  scall[59].pCurre
7a10: 6e 74 29 0a 0a 20 20 7b 20 22 57 69 64 65 43 68  nt)..  { "WideCh
7a20: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 22 2c 20  arToMultiByte", 
7a30: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 57 69 64      (SYSCALL)Wid
7a40: 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65  eCharToMultiByte
7a50: 2c 20 20 20 20 20 30 20 7d 2c 0a 0a 23 64 65 66  ,     0 },..#def
7a60: 69 6e 65 20 6f 73 57 69 64 65 43 68 61 72 54 6f  ine osWideCharTo
7a70: 4d 75 6c 74 69 42 79 74 65 20 28 28 69 6e 74 28  MultiByte ((int(
7a80: 57 49 4e 41 50 49 2a 29 28 55 49 4e 54 2c 44 57  WINAPI*)(UINT,DW
7a90: 4f 52 44 2c 4c 50 43 57 53 54 52 2c 69 6e 74 2c  ORD,LPCWSTR,int,
7aa0: 4c 50 53 54 52 2c 69 6e 74 2c 20 5c 0a 20 20 20  LPSTR,int, \.   
7ab0: 20 20 20 20 20 4c 50 43 53 54 52 2c 4c 50 42 4f       LPCSTR,LPBO
7ac0: 4f 4c 29 29 61 53 79 73 63 61 6c 6c 5b 36 30 5d  OL))aSyscall[60]
7ad0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
7ae0: 22 57 72 69 74 65 46 69 6c 65 22 2c 20 20 20 20  "WriteFile",    
7af0: 20 20 20 20 20 20 20 20 20 20 20 28 53 59 53 43             (SYSC
7b00: 41 4c 4c 29 57 72 69 74 65 46 69 6c 65 2c 20 20  ALL)WriteFile,  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7b20: 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 57 72 69  ,..#define osWri
7b30: 74 65 46 69 6c 65 20 28 28 42 4f 4f 4c 28 57 49  teFile ((BOOL(WI
7b40: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 4c 50  NAPI*)(HANDLE,LP
7b50: 43 56 4f 49 44 2c 44 57 4f 52 44 2c 4c 50 44 57  CVOID,DWORD,LPDW
7b60: 4f 52 44 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c  ORD, \.        L
7b70: 50 4f 56 45 52 4c 41 50 50 45 44 29 29 61 53 79  POVERLAPPED))aSy
7b80: 73 63 61 6c 6c 5b 36 31 5d 2e 70 43 75 72 72 65  scall[61].pCurre
7b90: 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  nt)..#if SQLITE_
7ba0: 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20 22 43 72  OS_WINRT.  { "Cr
7bb0: 65 61 74 65 45 76 65 6e 74 45 78 57 22 2c 20 20  eateEventExW",  
7bc0: 20 20 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c          (SYSCALL
7bd0: 29 43 72 65 61 74 65 45 76 65 6e 74 45 78 57 2c  )CreateEventExW,
7be0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
7bf0: 65 6c 73 65 0a 20 20 7b 20 22 43 72 65 61 74 65  else.  { "Create
7c00: 45 76 65 6e 74 45 78 57 22 2c 20 20 20 20 20 20  EventExW",      
7c10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20      (SYSCALL)0, 
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
7c40: 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 43 72 65  f..#define osCre
7c50: 61 74 65 45 76 65 6e 74 45 78 57 20 28 28 48 41  ateEventExW ((HA
7c60: 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  NDLE(WINAPI*)(LP
7c70: 53 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55  SECURITY_ATTRIBU
7c80: 54 45 53 2c 4c 50 43 57 53 54 52 2c 20 5c 0a 20  TES,LPCWSTR, \. 
7c90: 20 20 20 20 20 20 20 44 57 4f 52 44 2c 44 57 4f         DWORD,DWO
7ca0: 52 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 32 5d  RD))aSyscall[62]
7cb0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
7cc0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
7cd0: 0a 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e  .  { "WaitForSin
7ce0: 67 6c 65 4f 62 6a 65 63 74 22 2c 20 20 20 20 20  gleObject",     
7cf0: 28 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72  (SYSCALL)WaitFor
7d00: 53 69 6e 67 6c 65 4f 62 6a 65 63 74 2c 20 20 20  SingleObject,   
7d10: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
7d20: 20 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f   "WaitForSingleO
7d30: 62 6a 65 63 74 22 2c 20 20 20 20 20 28 53 59 53  bject",     (SYS
7d40: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
7d60: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
7d70: 6e 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67  ne osWaitForSing
7d80: 6c 65 4f 62 6a 65 63 74 20 28 28 44 57 4f 52 44  leObject ((DWORD
7d90: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7da0: 2c 20 5c 0a 20 20 20 20 20 20 20 20 44 57 4f 52  , \.        DWOR
7db0: 44 29 29 61 53 79 73 63 61 6c 6c 5b 36 33 5d 2e  D))aSyscall[63].
7dc0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
7dd0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
7de0: 20 20 7b 20 22 57 61 69 74 46 6f 72 53 69 6e 67    { "WaitForSing
7df0: 6c 65 4f 62 6a 65 63 74 45 78 22 2c 20 20 20 28  leObjectEx",   (
7e00: 53 59 53 43 41 4c 4c 29 57 61 69 74 46 6f 72 53  SYSCALL)WaitForS
7e10: 69 6e 67 6c 65 4f 62 6a 65 63 74 45 78 2c 20 20  ingleObjectEx,  
7e20: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
7e30: 22 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62  "WaitForSingleOb
7e40: 6a 65 63 74 45 78 22 2c 20 20 20 28 53 59 53 43  jectEx",   (SYSC
7e50: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
7e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
7e70: 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  ,.#endif..#defin
7e80: 65 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c  e osWaitForSingl
7e90: 65 4f 62 6a 65 63 74 45 78 20 28 28 44 57 4f 52  eObjectEx ((DWOR
7ea0: 44 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  D(WINAPI*)(HANDL
7eb0: 45 2c 44 57 4f 52 44 2c 20 5c 0a 20 20 20 20 20  E,DWORD, \.     
7ec0: 20 20 20 42 4f 4f 4c 29 29 61 53 79 73 63 61 6c     BOOL))aSyscal
7ed0: 6c 5b 36 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[64].pCurrent).
7ee0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
7ef0: 49 4e 52 54 0a 20 20 7b 20 22 53 65 74 46 69 6c  INRT.  { "SetFil
7f00: 65 50 6f 69 6e 74 65 72 45 78 22 2c 20 20 20 20  ePointerEx",    
7f10: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 53 65 74      (SYSCALL)Set
7f20: 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 2c 20 20  FilePointerEx,  
7f30: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
7f40: 0a 20 20 7b 20 22 53 65 74 46 69 6c 65 50 6f 69  .  { "SetFilePoi
7f50: 6e 74 65 72 45 78 22 2c 20 20 20 20 20 20 20 20  nterEx",        
7f60: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
7f90: 64 65 66 69 6e 65 20 6f 73 53 65 74 46 69 6c 65  define osSetFile
7fa0: 50 6f 69 6e 74 65 72 45 78 20 28 28 42 4f 4f 4c  PointerEx ((BOOL
7fb0: 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45  (WINAPI*)(HANDLE
7fc0: 2c 4c 41 52 47 45 5f 49 4e 54 45 47 45 52 2c 20  ,LARGE_INTEGER, 
7fd0: 5c 0a 20 20 20 20 20 20 20 20 50 4c 41 52 47 45  \.        PLARGE
7fe0: 5f 49 4e 54 45 47 45 52 2c 44 57 4f 52 44 29 29  _INTEGER,DWORD))
7ff0: 61 53 79 73 63 61 6c 6c 5b 36 35 5d 2e 70 43 75  aSyscall[65].pCu
8000: 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49  rrent)..#if SQLI
8010: 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 7b 20  TE_OS_WINRT.  { 
8020: 22 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  "GetFileInformat
8030: 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 22 2c 20  ionByHandleEx", 
8040: 28 53 59 53 43 41 4c 4c 29 47 65 74 46 69 6c 65  (SYSCALL)GetFile
8050: 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e  InformationByHan
8060: 64 6c 65 45 78 2c 20 30 20 7d 2c 0a 23 65 6c 73  dleEx, 0 },.#els
8070: 65 0a 20 20 7b 20 22 47 65 74 46 69 6c 65 49 6e  e.  { "GetFileIn
8080: 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61 6e 64 6c  formationByHandl
8090: 65 45 78 22 2c 20 28 53 59 53 43 41 4c 4c 29 30  eEx", (SYSCALL)0
80a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
80b0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
80c0: 23 64 65 66 69 6e 65 20 6f 73 47 65 74 46 69 6c  #define osGetFil
80d0: 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
80e0: 6e 64 6c 65 45 78 20 28 28 42 4f 4f 4c 28 57 49  ndleEx ((BOOL(WI
80f0: 4e 41 50 49 2a 29 28 48 41 4e 44 4c 45 2c 20 5c  NAPI*)(HANDLE, \
8100: 0a 20 20 20 20 20 20 20 20 46 49 4c 45 5f 49 4e  .        FILE_IN
8110: 46 4f 5f 42 59 5f 48 41 4e 44 4c 45 5f 43 4c 41  FO_BY_HANDLE_CLA
8120: 53 53 2c 4c 50 56 4f 49 44 2c 44 57 4f 52 44 29  SS,LPVOID,DWORD)
8130: 29 61 53 79 73 63 61 6c 6c 5b 36 36 5d 2e 70 43  )aSyscall[66].pC
8140: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c  urrent)..#if SQL
8150: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8160: 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  (!defined(SQLITE
8170: 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
8180: 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
8190: 5a 45 3e 30 29 0a 20 20 7b 20 22 4d 61 70 56 69  ZE>0).  { "MapVi
81a0: 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 22  ewOfFileFromApp"
81b0: 2c 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4d 61  ,    (SYSCALL)Ma
81c0: 70 56 69 65 77 4f 66 46 69 6c 65 46 72 6f 6d 41  pViewOfFileFromA
81d0: 70 70 2c 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73  pp,    0 },.#els
81e0: 65 0a 20 20 7b 20 22 4d 61 70 56 69 65 77 4f 66  e.  { "MapViewOf
81f0: 46 69 6c 65 46 72 6f 6d 41 70 70 22 2c 20 20 20  FileFromApp",   
8200: 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20   (SYSCALL)0,    
8210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8220: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8230: 23 64 65 66 69 6e 65 20 6f 73 4d 61 70 56 69 65  #define osMapVie
8240: 77 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 20 28  wOfFileFromApp (
8250: 28 4c 50 56 4f 49 44 28 57 49 4e 41 50 49 2a 29  (LPVOID(WINAPI*)
8260: 28 48 41 4e 44 4c 45 2c 55 4c 4f 4e 47 2c 55 4c  (HANDLE,ULONG,UL
8270: 4f 4e 47 36 34 2c 20 5c 0a 20 20 20 20 20 20 20  ONG64, \.       
8280: 20 53 49 5a 45 5f 54 29 29 61 53 79 73 63 61 6c   SIZE_T))aSyscal
8290: 6c 5b 36 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[67].pCurrent).
82a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
82b0: 49 4e 52 54 0a 20 20 7b 20 22 43 72 65 61 74 65  INRT.  { "Create
82c0: 46 69 6c 65 32 22 2c 20 20 20 20 20 20 20 20 20  File2",         
82d0: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 43 72 65      (SYSCALL)Cre
82e0: 61 74 65 46 69 6c 65 32 2c 20 20 20 20 20 20 20  ateFile2,       
82f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8300: 0a 20 20 7b 20 22 43 72 65 61 74 65 46 69 6c 65  .  { "CreateFile
8310: 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
8320: 28 53 59 53 43 41 4c 4c 29 30 2c 20 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 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
8350: 64 65 66 69 6e 65 20 6f 73 43 72 65 61 74 65 46  define osCreateF
8360: 69 6c 65 32 20 28 28 48 41 4e 44 4c 45 28 57 49  ile2 ((HANDLE(WI
8370: 4e 41 50 49 2a 29 28 4c 50 43 57 53 54 52 2c 44  NAPI*)(LPCWSTR,D
8380: 57 4f 52 44 2c 44 57 4f 52 44 2c 44 57 4f 52 44  WORD,DWORD,DWORD
8390: 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 43 52  , \.        LPCR
83a0: 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e 44  EATEFILE2_EXTEND
83b0: 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 29 61  ED_PARAMETERS))a
83c0: 53 79 73 63 61 6c 6c 5b 36 38 5d 2e 70 43 75 72  Syscall[68].pCur
83d0: 72 65 6e 74 29 0a 0a 23 69 66 20 53 51 4c 49 54  rent)..#if SQLIT
83e0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 21 64  E_OS_WINRT && !d
83f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8400: 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
8410: 4e 29 0a 20 20 7b 20 22 4c 6f 61 64 50 61 63 6b  N).  { "LoadPack
8420: 61 67 65 64 4c 69 62 72 61 72 79 22 2c 20 20 20  agedLibrary",   
8430: 20 20 28 53 59 53 43 41 4c 4c 29 4c 6f 61 64 50    (SYSCALL)LoadP
8440: 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 2c 20  ackagedLibrary, 
8450: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
8460: 20 7b 20 22 4c 6f 61 64 50 61 63 6b 61 67 65 64   { "LoadPackaged
8470: 4c 69 62 72 61 72 79 22 2c 20 20 20 20 20 28 53  Library",     (S
8480: 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20  YSCALL)0,       
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65  0 },.#endif..#de
84b0: 66 69 6e 65 20 6f 73 4c 6f 61 64 50 61 63 6b 61  fine osLoadPacka
84c0: 67 65 64 4c 69 62 72 61 72 79 20 28 28 48 4d 4f  gedLibrary ((HMO
84d0: 44 55 4c 45 28 57 49 4e 41 50 49 2a 29 28 4c 50  DULE(WINAPI*)(LP
84e0: 43 57 53 54 52 2c 20 5c 0a 20 20 20 20 20 20 20  CWSTR, \.       
84f0: 20 44 57 4f 52 44 29 29 61 53 79 73 63 61 6c 6c   DWORD))aSyscall
8500: 5b 36 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [69].pCurrent)..
8510: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
8520: 4e 52 54 0a 20 20 7b 20 22 47 65 74 54 69 63 6b  NRT.  { "GetTick
8530: 43 6f 75 6e 74 36 34 22 2c 20 20 20 20 20 20 20  Count64",       
8540: 20 20 20 28 53 59 53 43 41 4c 4c 29 47 65 74 54     (SYSCALL)GetT
8550: 69 63 6b 43 6f 75 6e 74 36 34 2c 20 20 20 20 20  ickCount64,     
8560: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
8570: 20 20 7b 20 22 47 65 74 54 69 63 6b 43 6f 75 6e    { "GetTickCoun
8580: 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 28  t64",          (
8590: 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20  SYSCALL)0,      
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64   0 },.#endif..#d
85c0: 65 66 69 6e 65 20 6f 73 47 65 74 54 69 63 6b 43  efine osGetTickC
85d0: 6f 75 6e 74 36 34 20 28 28 55 4c 4f 4e 47 4c 4f  ount64 ((ULONGLO
85e0: 4e 47 28 57 49 4e 41 50 49 2a 29 28 56 4f 49 44  NG(WINAPI*)(VOID
85f0: 29 29 61 53 79 73 63 61 6c 6c 5b 37 30 5d 2e 70  ))aSyscall[70].p
8600: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 53 51  Current)..#if SQ
8610: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
8620: 7b 20 22 47 65 74 4e 61 74 69 76 65 53 79 73 74  { "GetNativeSyst
8630: 65 6d 49 6e 66 6f 22 2c 20 20 20 20 20 28 53 59  emInfo",     (SY
8640: 53 43 41 4c 4c 29 47 65 74 4e 61 74 69 76 65 53  SCALL)GetNativeS
8650: 79 73 74 65 6d 49 6e 66 6f 2c 20 20 20 20 20 30  ystemInfo,     0
8660: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 47   },.#else.  { "G
8670: 65 74 4e 61 74 69 76 65 53 79 73 74 65 6d 49 6e  etNativeSystemIn
8680: 66 6f 22 2c 20 20 20 20 20 28 53 59 53 43 41 4c  fo",     (SYSCAL
8690: 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  L)0,            
86a0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
86b0: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
86c0: 6f 73 47 65 74 4e 61 74 69 76 65 53 79 73 74 65  osGetNativeSyste
86d0: 6d 49 6e 66 6f 20 28 28 56 4f 49 44 28 57 49 4e  mInfo ((VOID(WIN
86e0: 41 50 49 2a 29 28 20 5c 0a 20 20 20 20 20 20 20  API*)( \.       
86f0: 20 4c 50 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29   LPSYSTEM_INFO))
8700: 61 53 79 73 63 61 6c 6c 5b 37 31 5d 2e 70 43 75  aSyscall[71].pCu
8710: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
8720: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
8730: 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 7b 20 22  _HAS_ANSI).  { "
8740: 4f 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e  OutputDebugStrin
8750: 67 41 22 2c 20 20 20 20 20 20 28 53 59 53 43 41  gA",      (SYSCA
8760: 4c 4c 29 4f 75 74 70 75 74 44 65 62 75 67 53 74  LL)OutputDebugSt
8770: 72 69 6e 67 41 2c 20 20 20 20 20 20 30 20 7d 2c  ringA,      0 },
8780: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 4f 75 74 70  .#else.  { "Outp
8790: 75 74 44 65 62 75 67 53 74 72 69 6e 67 41 22 2c  utDebugStringA",
87a0: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 30        (SYSCALL)0
87b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
87c0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
87d0: 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73 4f  dif..#define osO
87e0: 75 74 70 75 74 44 65 62 75 67 53 74 72 69 6e 67  utputDebugString
87f0: 41 20 28 28 56 4f 49 44 28 57 49 4e 41 50 49 2a  A ((VOID(WINAPI*
8800: 29 28 4c 50 43 53 54 52 29 29 61 53 79 73 63 61  )(LPCSTR))aSysca
8810: 6c 6c 5b 37 32 5d 2e 70 43 75 72 72 65 6e 74 29  ll[72].pCurrent)
8820: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
8830: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
8840: 49 44 45 29 0a 20 20 7b 20 22 4f 75 74 70 75 74  IDE).  { "Output
8850: 44 65 62 75 67 53 74 72 69 6e 67 57 22 2c 20 20  DebugStringW",  
8860: 20 20 20 20 28 53 59 53 43 41 4c 4c 29 4f 75 74      (SYSCALL)Out
8870: 70 75 74 44 65 62 75 67 53 74 72 69 6e 67 57 2c  putDebugStringW,
8880: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
8890: 0a 20 20 7b 20 22 4f 75 74 70 75 74 44 65 62 75  .  { "OutputDebu
88a0: 67 53 74 72 69 6e 67 57 22 2c 20 20 20 20 20 20  gStringW",      
88b0: 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20 20 20  (SYSCALL)0,     
88c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23    0 },.#endif..#
88e0: 64 65 66 69 6e 65 20 6f 73 4f 75 74 70 75 74 44  define osOutputD
88f0: 65 62 75 67 53 74 72 69 6e 67 57 20 28 28 56 4f  ebugStringW ((VO
8900: 49 44 28 57 49 4e 41 50 49 2a 29 28 4c 50 43 57  ID(WINAPI*)(LPCW
8910: 53 54 52 29 29 61 53 79 73 63 61 6c 6c 5b 37 33  STR))aSyscall[73
8920: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
8930: 20 22 47 65 74 50 72 6f 63 65 73 73 48 65 61 70   "GetProcessHeap
8940: 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59 53  ",          (SYS
8950: 43 41 4c 4c 29 47 65 74 50 72 6f 63 65 73 73 48  CALL)GetProcessH
8960: 65 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  eap,          0 
8970: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 47 65  },..#define osGe
8980: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 28 48  tProcessHeap ((H
8990: 41 4e 44 4c 45 28 57 49 4e 41 50 49 2a 29 28 56  ANDLE(WINAPI*)(V
89a0: 4f 49 44 29 29 61 53 79 73 63 61 6c 6c 5b 37 34  OID))aSyscall[74
89b0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
89c0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
89d0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
89e0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
89f0: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
8a00: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 43  P_SIZE>0).  { "C
8a10: 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
8a20: 46 72 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41  FromApp", (SYSCA
8a30: 4c 4c 29 43 72 65 61 74 65 46 69 6c 65 4d 61 70  LL)CreateFileMap
8a40: 70 69 6e 67 46 72 6f 6d 41 70 70 2c 20 30 20 7d  pingFromApp, 0 }
8a50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 43 72 65  ,.#else.  { "Cre
8a60: 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72  ateFileMappingFr
8a70: 6f 6d 41 70 70 22 2c 20 28 53 59 53 43 41 4c 4c  omApp", (SYSCALL
8a80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
8a90: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
8aa0: 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 6f 73  ndif..#define os
8ab0: 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e  CreateFileMappin
8ac0: 67 46 72 6f 6d 41 70 70 20 28 28 48 41 4e 44 4c  gFromApp ((HANDL
8ad0: 45 28 57 49 4e 41 50 49 2a 29 28 48 41 4e 44 4c  E(WINAPI*)(HANDL
8ae0: 45 2c 20 5c 0a 20 20 20 20 20 20 20 20 4c 50 53  E, \.        LPS
8af0: 45 43 55 52 49 54 59 5f 41 54 54 52 49 42 55 54  ECURITY_ATTRIBUT
8b00: 45 53 2c 55 4c 4f 4e 47 2c 55 4c 4f 4e 47 36 34  ES,ULONG,ULONG64
8b10: 2c 4c 50 43 57 53 54 52 29 29 61 53 79 73 63 61  ,LPCWSTR))aSysca
8b20: 6c 6c 5b 37 35 5d 2e 70 43 75 72 72 65 6e 74 29  ll[75].pCurrent)
8b30: 0a 0a 2f 2a 0a 2a 2a 20 4e 4f 54 45 3a 20 4f 6e  ../*.** NOTE: On
8b40: 20 73 6f 6d 65 20 73 75 62 2d 70 6c 61 74 66 6f   some sub-platfo
8b50: 72 6d 73 2c 20 74 68 65 20 49 6e 74 65 72 6c 6f  rms, the Interlo
8b60: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
8b70: 6e 67 65 20 22 66 75 6e 63 74 69 6f 6e 22 0a 2a  nge "function".*
8b80: 2a 20 20 20 20 20 20 20 69 73 20 72 65 61 6c 6c  *       is reall
8b90: 79 20 6a 75 73 74 20 61 20 6d 61 63 72 6f 20 74  y just a macro t
8ba0: 68 61 74 20 75 73 65 73 20 61 20 63 6f 6d 70 69  hat uses a compi
8bb0: 6c 65 72 20 69 6e 74 72 69 6e 73 69 63 20 28 65  ler intrinsic (e
8bc0: 2e 67 2e 20 78 36 34 29 2e 0a 2a 2a 20 20 20 20  .g. x64)..**    
8bd0: 20 20 20 53 6f 20 64 6f 20 6e 6f 74 20 74 72 79     So do not try
8be0: 20 74 6f 20 6d 61 6b 65 20 74 68 69 73 20 69 73   to make this is
8bf0: 20 69 6e 74 6f 20 61 20 72 65 64 65 66 69 6e 61   into a redefina
8c00: 62 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  ble interface..*
8c10: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 49 6e  /.#if defined(In
8c20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8c30: 45 78 63 68 61 6e 67 65 29 0a 20 20 7b 20 22 49  Exchange).  { "I
8c40: 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72  nterlockedCompar
8c50: 65 45 78 63 68 61 6e 67 65 22 2c 20 28 53 59 53  eExchange", (SYS
8c60: 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20  CALL)0,         
8c70: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
8c80: 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e 74 65 72  .#define osInter
8c90: 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63  lockedCompareExc
8ca0: 68 61 6e 67 65 20 49 6e 74 65 72 6c 6f 63 6b 65  hange Interlocke
8cb0: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
8cc0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 49 6e 74 65  .#else.  { "Inte
8cd0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
8ce0: 63 68 61 6e 67 65 22 2c 20 28 53 59 53 43 41 4c  change", (SYSCAL
8cf0: 4c 29 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  L)InterlockedCom
8d00: 70 61 72 65 45 78 63 68 61 6e 67 65 2c 20 30 20  pareExchange, 0 
8d10: 7d 2c 0a 0a 23 64 65 66 69 6e 65 20 6f 73 49 6e  },..#define osIn
8d20: 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65  terlockedCompare
8d30: 45 78 63 68 61 6e 67 65 20 28 28 4c 4f 4e 47 28  Exchange ((LONG(
8d40: 57 49 4e 41 50 49 2a 29 28 4c 4f 4e 47 20 5c 0a  WINAPI*)(LONG \.
8d50: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 57          SQLITE_W
8d60: 49 4e 33 32 5f 56 4f 4c 41 54 49 4c 45 2a 2c 20  IN32_VOLATILE*, 
8d70: 4c 4f 4e 47 2c 4c 4f 4e 47 29 29 61 53 79 73 63  LONG,LONG))aSysc
8d80: 61 6c 6c 5b 37 36 5d 2e 70 43 75 72 72 65 6e 74  all[76].pCurrent
8d90: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ).#endif /* defi
8da0: 6e 65 64 28 49 6e 74 65 72 6c 6f 63 6b 65 64 43  ned(InterlockedC
8db0: 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 29 20  ompareExchange) 
8dc0: 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  */..#if !SQLITE_
8dd0: 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
8de0: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
8df0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
8e00: 5f 55 55 49 44 0a 20 20 7b 20 22 55 75 69 64 43  _UUID.  { "UuidC
8e10: 72 65 61 74 65 22 2c 20 20 20 20 20 20 20 20 20  reate",         
8e20: 20 20 20 20 20 20 28 53 59 53 43 41 4c 4c 29 55        (SYSCALL)U
8e30: 75 69 64 43 72 65 61 74 65 2c 20 20 20 20 20 20  uidCreate,      
8e40: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73         0 },.#els
8e50: 65 0a 20 20 7b 20 22 55 75 69 64 43 72 65 61 74  e.  { "UuidCreat
8e60: 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
8e70: 20 20 28 53 59 53 43 41 4c 4c 29 30 2c 20 20 20    (SYSCALL)0,   
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 0a     0 },.#endif..
8ea0: 23 64 65 66 69 6e 65 20 6f 73 55 75 69 64 43 72  #define osUuidCr
8eb0: 65 61 74 65 20 28 28 52 50 43 5f 53 54 41 54 55  eate ((RPC_STATU
8ec0: 53 28 52 50 43 5f 45 4e 54 52 59 2a 29 28 55 55  S(RPC_ENTRY*)(UU
8ed0: 49 44 2a 29 29 61 53 79 73 63 61 6c 6c 5b 37 37  ID*))aSyscall[77
8ee0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
8ef0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
8f00: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
8f10: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
8f20: 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44 0a 20  WIN32_USE_UUID. 
8f30: 20 7b 20 22 55 75 69 64 43 72 65 61 74 65 53 65   { "UuidCreateSe
8f40: 71 75 65 6e 74 69 61 6c 22 2c 20 20 20 20 20 28  quential",     (
8f50: 53 59 53 43 41 4c 4c 29 55 75 69 64 43 72 65 61  SYSCALL)UuidCrea
8f60: 74 65 53 65 71 75 65 6e 74 69 61 6c 2c 20 20 20  teSequential,   
8f70: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
8f80: 55 75 69 64 43 72 65 61 74 65 53 65 71 75 65 6e  UuidCreateSequen
8f90: 74 69 61 6c 22 2c 20 20 20 20 20 28 53 59 53 43  tial",     (SYSC
8fa0: 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20 20 20  ALL)0,          
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
8fc0: 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
8fd0: 20 6f 73 55 75 69 64 43 72 65 61 74 65 53 65 71   osUuidCreateSeq
8fe0: 75 65 6e 74 69 61 6c 20 5c 0a 20 20 20 20 20 20  uential \.      
8ff0: 20 20 28 28 52 50 43 5f 53 54 41 54 55 53 28 52    ((RPC_STATUS(R
9000: 50 43 5f 45 4e 54 52 59 2a 29 28 55 55 49 44 2a  PC_ENTRY*)(UUID*
9010: 29 29 61 53 79 73 63 61 6c 6c 5b 37 38 5d 2e 70  ))aSyscall[78].p
9020: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64  Current)..#if !d
9030: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f  efined(SQLITE_NO
9040: 5f 53 59 4e 43 29 20 26 26 20 53 51 4c 49 54 45  _SYNC) && SQLITE
9050: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
9060: 0a 20 20 7b 20 22 46 6c 75 73 68 56 69 65 77 4f  .  { "FlushViewO
9070: 66 46 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  fFile",         
9080: 20 28 53 59 53 43 41 4c 4c 29 46 6c 75 73 68 56   (SYSCALL)FlushV
9090: 69 65 77 4f 66 46 69 6c 65 2c 20 20 20 20 20 20  iewOfFile,      
90a0: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
90b0: 20 22 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c   "FlushViewOfFil
90c0: 65 22 2c 20 20 20 20 20 20 20 20 20 20 28 53 59  e",          (SY
90d0: 53 43 41 4c 4c 29 30 2c 20 20 20 20 20 20 20 20  SCALL)0,        
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
90f0: 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  },.#endif..#defi
9100: 6e 65 20 6f 73 46 6c 75 73 68 56 69 65 77 4f 66  ne osFlushViewOf
9110: 46 69 6c 65 20 5c 0a 20 20 20 20 20 20 20 20 28  File \.        (
9120: 28 42 4f 4f 4c 28 57 49 4e 41 50 49 2a 29 28 4c  (BOOL(WINAPI*)(L
9130: 50 43 56 4f 49 44 2c 53 49 5a 45 5f 54 29 29 61  PCVOID,SIZE_T))a
9140: 53 79 73 63 61 6c 6c 5b 37 39 5d 2e 70 43 75 72  Syscall[79].pCur
9150: 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64  rent)..}; /* End
9160: 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64 65   of the override
9170: 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c 6c  able system call
9180: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s */../*.** This
9190: 20 69 73 20 74 68 65 20 78 53 65 74 53 79 73 74   is the xSetSyst
91a0: 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f 64 20  emCall() method 
91b0: 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 66  of sqlite3_vfs f
91c0: 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a 2a 2a  or all of the.**
91d0: 20 22 77 69 6e 33 32 22 20 56 46 53 65 73 2e 20   "win32" VFSes. 
91e0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
91f0: 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66 75  K opon successfu
9200: 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68 65  lly updating the
9210: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
9220: 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c 49  pointer, or SQLI
9230: 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20 74  TE_NOTFOUND if t
9240: 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66 69  here is no confi
9250: 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74 65  gurable.** syste
9260: 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e 61  m call named zNa
9270: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9280: 74 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61  t winSetSystemCa
9290: 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  ll(.  sqlite3_vf
92a0: 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20 20 20  s *pNotUsed,    
92b0: 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 70      /* The VFS p
92c0: 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75 73 65  ointer.  Not use
92d0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
92e0: 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20  r *zName,       
92f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
9300: 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 6f  system call to o
9310: 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73 71 6c  verride */.  sql
9320: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
9330: 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20 50 6f   pNewFunc  /* Po
9340: 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73 79 73  inter to new sys
9350: 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65 20 2a  tem call value *
9360: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9370: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 20  int i;.  int rc 
9380: 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
9390: 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  D;..  UNUSED_PAR
93a0: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
93b0: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  ;.  if( zName==0
93c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f   ){.    /* If no
93d0: 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65 6e 2c   zName is given,
93e0: 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73 79 73   restore all sys
93f0: 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74 68 65  tem calls to the
9400: 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a  ir default.    *
9410: 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64 20 72  * settings and r
9420: 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 2a  eturn NULL.    *
9430: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
9440: 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28 69 3d  E_OK;.    for(i=
9450: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73  0; i<sizeof(aSys
9460: 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79  call)/sizeof(aSy
9470: 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b  scall[0]); i++){
9480: 0a 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63  .      if( aSysc
9490: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
94a0: 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  ){.        aSysc
94b0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
94c0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  = aSyscall[i].pD
94d0: 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 7d 0a  efault;.      }.
94e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
94f0: 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69     /* If zName i
9500: 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f 70 65  s specified, ope
9510: 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74 68 65  rate on only the
9520: 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   one system call
9530: 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66 69 65  .    ** specifie
9540: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  d..    */.    fo
9550: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
9560: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
9570: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
9580: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
9590: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
95a0: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
95b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
95c0: 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44  ( aSyscall[i].pD
95d0: 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20 20 20  efault==0 ){.   
95e0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
95f0: 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20 61 53  i].pDefault = aS
9600: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
9610: 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  nt;.        }.  
9620: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
9630: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
9640: 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20 29 20  ( pNewFunc==0 ) 
9650: 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79 73 63  pNewFunc = aSysc
9660: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
9670: 0a 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c  .        aSyscal
9680: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20 3d 20  l[i].pCurrent = 
9690: 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20 20 20  pNewFunc;.      
96a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
96b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
96c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
96d0: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
96e0: 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20 63 61  e of a system ca
96f0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
9700: 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f 74   if zName is not
9710: 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a 65 64   a.** recognized
9720: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d   system call nam
9730: 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c 73 6f  e.  NULL is also
9740: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
9750: 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a 2a 20   system call.** 
9760: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 64  is currently und
9770: 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
9780: 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c  c sqlite3_syscal
9790: 6c 5f 70 74 72 20 77 69 6e 47 65 74 53 79 73 74  l_ptr winGetSyst
97a0: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
97b0: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
97c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
97d0: 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  Name.){.  unsign
97e0: 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20 55 4e 55  ed int i;..  UNU
97f0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e  SED_PARAMETER(pN
9800: 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f 72 28 69  otUsed);.  for(i
9810: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 79  =0; i<sizeof(aSy
9820: 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53  scall)/sizeof(aS
9830: 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29  yscall[0]); i++)
9840: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
9850: 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c  (zName, aSyscall
9860: 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
9870: 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b  return aSyscall[
9880: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 7d  i].pCurrent;.  }
9890: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
98a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
98b0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72   name of the fir
98c0: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 61  st system call a
98d0: 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20 49 66 20  fter zName.  If 
98e0: 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74  zName==NULL.** t
98f0: 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 20 6e  hen return the n
9900: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  ame of the first
9910: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
9920: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
9930: 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61  ame.** is the la
9940: 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6f  st system call o
9950: 72 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e 6f  r if zName is no
9960: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  t the name of a 
9970: 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74 65 6d 20  valid.** system 
9980: 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  call..*/.static 
9990: 63 6f 6e 73 74 20 63 68 61 72 20 2a 77 69 6e 4e  const char *winN
99a0: 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 28 73 71  extSystemCall(sq
99b0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 2c 20 63 6f  lite3_vfs *p, co
99c0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
99d0: 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2d 31 3b 0a  {.  int i = -1;.
99e0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
99f0: 54 45 52 28 70 29 3b 0a 20 20 69 66 28 20 7a 4e  TER(p);.  if( zN
9a00: 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ame ){.    for(i
9a10: 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
9a20: 61 53 79 73 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b  aSyscall)-1; i++
9a30: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
9a40: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
9a50: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
9a60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
9a70: 20 20 7d 0a 20 20 66 6f 72 28 69 2b 2b 3b 20 69    }.  for(i++; i
9a80: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
9a90: 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  all); i++){.    
9aa0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
9ab0: 70 43 75 72 72 65 6e 74 21 3d 30 20 29 20 72 65  pCurrent!=0 ) re
9ac0: 74 75 72 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d  turn aSyscall[i]
9ad0: 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a 20 20 72 65  .zName;.  }.  re
9ae0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 64 65  turn 0;.}..#ifde
9af0: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  f SQLITE_WIN32_M
9b00: 41 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 49 66 20 61  ALLOC./*.** If a
9b10: 20 57 69 6e 33 32 20 6e 61 74 69 76 65 20 68 65   Win32 native he
9b20: 61 70 20 68 61 73 20 62 65 65 6e 20 63 6f 6e 66  ap has been conf
9b30: 69 67 75 72 65 64 2c 20 74 68 69 73 20 66 75 6e  igured, this fun
9b40: 63 74 69 6f 6e 20 77 69 6c 6c 20 61 74 74 65 6d  ction will attem
9b50: 70 74 20 74 6f 0a 2a 2a 20 63 6f 6d 70 61 63 74  pt to.** compact
9b60: 20 69 74 2e 20 20 55 70 6f 6e 20 73 75 63 63 65   it.  Upon succe
9b70: 73 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 77 69  ss, SQLITE_OK wi
9b80: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
9b90: 20 55 70 6f 6e 20 66 61 69 6c 75 72 65 2c 20 6f   Upon failure, o
9ba0: 6e 65 0a 2a 2a 20 6f 66 20 53 51 4c 49 54 45 5f  ne.** of SQLITE_
9bb0: 4e 4f 4d 45 4d 2c 20 53 51 4c 49 54 45 5f 45 52  NOMEM, SQLITE_ER
9bc0: 52 4f 52 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e  ROR, or SQLITE_N
9bd0: 4f 54 46 4f 55 4e 44 20 77 69 6c 6c 20 62 65 20  OTFOUND will be 
9be0: 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 0a 2a  returned.  The.*
9bf0: 2a 20 22 70 6e 4c 61 72 67 65 73 74 22 20 61 72  * "pnLargest" ar
9c00: 67 75 6d 65 6e 74 2c 20 69 66 20 6e 6f 6e 2d 7a  gument, if non-z
9c10: 65 72 6f 2c 20 77 69 6c 6c 20 62 65 20 75 73 65  ero, will be use
9c20: 64 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20  d to return the 
9c30: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  size of the.** l
9c40: 61 72 67 65 73 74 20 63 6f 6d 6d 69 74 74 65 64  argest committed
9c50: 20 66 72 65 65 20 62 6c 6f 63 6b 20 69 6e 20 74   free block in t
9c60: 68 65 20 68 65 61 70 2c 20 69 6e 20 62 79 74 65  he heap, in byte
9c70: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
9c80: 33 5f 77 69 6e 33 32 5f 63 6f 6d 70 61 63 74 5f  3_win32_compact_
9c90: 68 65 61 70 28 4c 50 55 49 4e 54 20 70 6e 4c 61  heap(LPUINT pnLa
9ca0: 72 67 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63  rgest){.  int rc
9cb0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9cc0: 55 49 4e 54 20 6e 4c 61 72 67 65 73 74 20 3d 20  UINT nLargest = 
9cd0: 30 3b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65 61  0;.  HANDLE hHea
9ce0: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
9cf0: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
9d00: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
9d10: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
9d20: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
9d30: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
9d40: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
9d50: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
9d60: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
9d70: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
9d80: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
9d90: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
9da0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
9db0: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
9dc0: 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e 55 4c 4c  HEAP_FLAGS, NULL
9dd0: 29 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) );.#endif.#if 
9de0: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
9df0: 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
9e00: 49 4e 52 54 0a 20 20 69 66 28 20 28 6e 4c 61 72  INRT.  if( (nLar
9e10: 67 65 73 74 3d 6f 73 48 65 61 70 43 6f 6d 70 61  gest=osHeapCompa
9e20: 63 74 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45  ct(hHeap, SQLITE
9e30: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
9e40: 53 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 44 57  S))==0 ){.    DW
9e50: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
9e60: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
9e70: 3b 0a 20 20 20 20 69 66 28 20 6c 61 73 74 45 72  ;.    if( lastEr
9e80: 72 6e 6f 3d 3d 4e 4f 5f 45 52 52 4f 52 20 29 7b  rno==NO_ERROR ){
9e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  .      sqlite3_l
9ea0: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
9eb0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
9ec0: 43 6f 6d 70 61 63 74 20 28 6e 6f 20 73 70 61 63  Compact (no spac
9ed0: 65 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20  e), heap=%p",.  
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ef0: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
9f00: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f10: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
9f20: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
9f30: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9f40: 5f 45 52 52 4f 52 2c 20 22 66 61 69 6c 65 64 20  _ERROR, "failed 
9f50: 74 6f 20 48 65 61 70 43 6f 6d 70 61 63 74 20 28  to HeapCompact (
9f60: 25 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a  %lu), heap=%p",.
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
9f90: 28 29 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70  (), (void*)hHeap
9fa0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
9fb0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
9fc0: 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 73 71  }.  }.#else.  sq
9fd0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
9fe0: 5f 4e 4f 54 46 4f 55 4e 44 2c 20 22 66 61 69 6c  _NOTFOUND, "fail
9ff0: 65 64 20 74 6f 20 48 65 61 70 43 6f 6d 70 61 63  ed to HeapCompac
a000: 74 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20  t, heap=%p",.   
a010: 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64             (void
a020: 2a 29 68 48 65 61 70 29 3b 0a 20 20 72 63 20 3d  *)hHeap);.  rc =
a030: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
a040: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
a050: 6e 4c 61 72 67 65 73 74 20 29 20 2a 70 6e 4c 61  nLargest ) *pnLa
a060: 72 67 65 73 74 20 3d 20 6e 4c 61 72 67 65 73 74  rgest = nLargest
a070: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
a080: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20 57 69 6e  ../*.** If a Win
a090: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 68  32 native heap h
a0a0: 61 73 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  as been configur
a0b0: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
a0c0: 6e 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 74  n will attempt t
a0d0: 6f 0a 2a 2a 20 64 65 73 74 72 6f 79 20 61 6e 64  o.** destroy and
a0e0: 20 72 65 63 72 65 61 74 65 20 69 74 2e 20 20 49   recreate it.  I
a0f0: 66 20 74 68 65 20 57 69 6e 33 32 20 6e 61 74 69  f the Win32 nati
a100: 76 65 20 68 65 61 70 20 69 73 20 6e 6f 74 20 69  ve heap is not i
a110: 73 6f 6c 61 74 65 64 20 61 6e 64 2f 6f 72 0a 2a  solated and/or.*
a120: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6d 65  * the sqlite3_me
a130: 6d 6f 72 79 5f 75 73 65 64 28 29 20 66 75 6e 63  mory_used() func
a140: 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65  tion does not re
a150: 74 75 72 6e 20 7a 65 72 6f 2c 20 53 51 4c 49 54  turn zero, SQLIT
a160: 45 5f 42 55 53 59 20 77 69 6c 6c 0a 2a 2a 20 62  E_BUSY will.** b
a170: 65 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e  e returned and n
a180: 6f 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  o changes will b
a190: 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 57 69  e made to the Wi
a1a0: 6e 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 2e  n32 native heap.
a1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a1c0: 77 69 6e 33 32 5f 72 65 73 65 74 5f 68 65 61 70  win32_reset_heap
a1d0: 28 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  (){.  int rc;.  
a1e0: 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
a1f0: 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
a200: 74 65 72 3b 20 29 20 2f 2a 20 54 68 65 20 6d 61  ter; ) /* The ma
a210: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
a220: 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  */.  MUTEX_LOGIC
a230: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
a240: 2a 70 4d 65 6d 3b 20 29 20 20 20 20 2f 2a 20 54  *pMem; )    /* T
a250: 68 65 20 6d 65 6d 73 79 73 20 73 74 61 74 69 63  he memsys static
a260: 20 6d 75 74 65 78 20 2a 2f 0a 20 20 4d 55 54 45   mutex */.  MUTE
a270: 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72  X_LOGIC( pMaster
a280: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
a290: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
a2a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a2b0: 52 29 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f  R); ).  MUTEX_LO
a2c0: 47 49 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69  GIC( pMem = sqli
a2d0: 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
a2e0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
a2f0: 54 49 43 5f 4d 45 4d 29 3b 20 29 0a 20 20 73 71  TIC_MEM); ).  sq
a300: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a310: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71  r(pMaster);.  sq
a320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
a330: 72 28 70 4d 65 6d 29 3b 0a 20 20 77 69 6e 4d 65  r(pMem);.  winMe
a340: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
a350: 20 20 69 66 28 20 77 69 6e 4d 65 6d 47 65 74 48    if( winMemGetH
a360: 65 61 70 28 29 21 3d 4e 55 4c 4c 20 26 26 20 77  eap()!=NULL && w
a370: 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20  inMemGetOwned() 
a380: 26 26 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  && sqlite3_memor
a390: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 7b 0a 20  y_used()==0 ){. 
a3a0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20     /*.    ** At 
a3b0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 72  this point, ther
a3c0: 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 20 6f  e should be no o
a3d0: 75 74 73 74 61 6e 64 69 6e 67 20 6d 65 6d 6f 72  utstanding memor
a3e0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e  y allocations on
a3f0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 68 65 61 70  .    ** the heap
a400: 2e 20 20 41 6c 73 6f 2c 20 73 69 6e 63 65 20 62  .  Also, since b
a410: 6f 74 68 20 74 68 65 20 6d 61 73 74 65 72 20 61  oth the master a
a420: 6e 64 20 6d 65 6d 73 79 73 20 6c 6f 63 6b 73 20  nd memsys locks 
a430: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  are currently.  
a440: 20 20 2a 2a 20 62 65 69 6e 67 20 68 65 6c 64 20    ** being held 
a450: 62 79 20 75 73 2c 20 6e 6f 20 6f 74 68 65 72 20  by us, no other 
a460: 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66  function (i.e. f
a470: 72 6f 6d 20 61 6e 6f 74 68 65 72 20 74 68 72 65  rom another thre
a480: 61 64 29 20 73 68 6f 75 6c 64 0a 20 20 20 20 2a  ad) should.    *
a490: 2a 20 62 65 20 61 62 6c 65 20 74 6f 20 65 76 65  * be able to eve
a4a0: 6e 20 61 63 63 65 73 73 20 74 68 65 20 68 65 61  n access the hea
a4b0: 70 2e 20 20 41 74 74 65 6d 70 74 20 74 6f 20 64  p.  Attempt to d
a4c0: 65 73 74 72 6f 79 20 61 6e 64 20 72 65 63 72 65  estroy and recre
a4d0: 61 74 65 20 6f 75 72 0a 20 20 20 20 2a 2a 20 69  ate our.    ** i
a4e0: 73 6f 6c 61 74 65 64 20 57 69 6e 33 32 20 6e 61  solated Win32 na
a4f0: 74 69 76 65 20 68 65 61 70 20 6e 6f 77 2e 0a 20  tive heap now.. 
a500: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
a510: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a520: 29 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61  )!=NULL );.    a
a530: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a540: 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61  Owned() );.    a
a550: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
a560: 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20  emory_used()==0 
a570: 29 3b 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68 75  );.    winMemShu
a580: 74 64 6f 77 6e 28 77 69 6e 4d 65 6d 47 65 74 44  tdown(winMemGetD
a590: 61 74 61 50 74 72 28 29 29 3b 0a 20 20 20 20 61  ataPtr());.    a
a5a0: 73 73 65 72 74 28 20 77 69 6e 4d 65 6d 47 65 74  ssert( winMemGet
a5b0: 48 65 61 70 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a  Heap()==NULL );.
a5c0: 20 20 20 20 61 73 73 65 72 74 28 20 21 77 69 6e      assert( !win
a5d0: 4d 65 6d 47 65 74 4f 77 6e 65 64 28 29 20 29 3b  MemGetOwned() );
a5e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
a5f0: 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73 65 64  ite3_memory_used
a600: 28 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20  ()==0 );.    rc 
a610: 3d 20 77 69 6e 4d 65 6d 49 6e 69 74 28 77 69 6e  = winMemInit(win
a620: 4d 65 6d 47 65 74 44 61 74 61 50 74 72 28 29 29  MemGetDataPtr())
a630: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
a640: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77  !=SQLITE_OK || w
a650: 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d  inMemGetHeap()!=
a660: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65  NULL );.    asse
a670: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
a680: 4b 20 7c 7c 20 77 69 6e 4d 65 6d 47 65 74 4f 77  K || winMemGetOw
a690: 6e 65 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73  ned() );.    ass
a6a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a6b0: 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 65  OK || sqlite3_me
a6c0: 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d 30 20 29  mory_used()==0 )
a6d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
a6e0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 57 69 6e  *.    ** The Win
a6f0: 33 32 20 6e 61 74 69 76 65 20 68 65 61 70 20 63  32 native heap c
a700: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
a710: 64 20 62 65 63 61 75 73 65 20 69 74 20 6d 61 79  d because it may
a720: 20 62 65 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   be in use..    
a730: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
a740: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73  TE_BUSY;.  }.  s
a750: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
a760: 76 65 28 70 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  ve(pMem);.  sqli
a770: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a780: 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
a790: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20  rn rc;.}.#endif 
a7a0: 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
a7b0: 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALLOC */../*.**
a7c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
a7d0: 75 74 70 75 74 73 20 74 68 65 20 73 70 65 63 69  utputs the speci
a7e0: 66 69 65 64 20 28 41 4e 53 49 29 20 73 74 72 69  fied (ANSI) stri
a7f0: 6e 67 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20  ng to the Win32 
a800: 64 65 62 75 67 67 65 72 0a 2a 2a 20 28 69 66 20  debugger.** (if 
a810: 61 76 61 69 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a  available)..*/..
a820: 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e  void sqlite3_win
a830: 33 32 5f 77 72 69 74 65 5f 64 65 62 75 67 28 63  32_write_debug(c
a840: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 75 66 2c  onst char *zBuf,
a850: 20 69 6e 74 20 6e 42 75 66 29 7b 0a 20 20 63 68   int nBuf){.  ch
a860: 61 72 20 7a 44 62 67 42 75 66 5b 53 51 4c 49 54  ar zDbgBuf[SQLIT
a870: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a880: 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69  SIZE];.  int nMi
a890: 6e 20 3d 20 4d 49 4e 28 6e 42 75 66 2c 20 28 53  n = MIN(nBuf, (S
a8a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f  QLITE_WIN32_DBG_
a8b0: 42 55 46 5f 53 49 5a 45 20 2d 20 31 29 29 3b 20  BUF_SIZE - 1)); 
a8c0: 2f 2a 20 6d 61 79 20 62 65 20 6e 65 67 61 74 69  /* may be negati
a8d0: 76 65 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 4d 69  ve. */.  if( nMi
a8e0: 6e 3c 2d 31 20 29 20 6e 4d 69 6e 20 3d 20 2d 31  n<-1 ) nMin = -1
a8f0: 3b 20 2f 2a 20 61 6c 6c 20 6e 65 67 61 74 69 76  ; /* all negativ
a900: 65 20 76 61 6c 75 65 73 20 62 65 63 6f 6d 65 20  e values become 
a910: 2d 31 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  -1. */.  assert(
a920: 20 6e 4d 69 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69   nMin==-1 || nMi
a930: 6e 3d 3d 30 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c  n==0 || nMin<SQL
a940: 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55  ITE_WIN32_DBG_BU
a950: 46 5f 53 49 5a 45 20 29 3b 0a 23 69 66 64 65 66  F_SIZE );.#ifdef
a960: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
a970: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
a980: 7a 42 75 66 20 29 7b 0a 20 20 20 20 28 76 6f 69  zBuf ){.    (voi
a990: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
a9a0: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
a9b0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
a9c0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
a9d0: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a  WIN32_HAS_ANSI).
a9e0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
a9f0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
aa00: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
aa10: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
aa20: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
aa30: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
aa40: 6e 29 3b 0a 20 20 20 20 6f 73 4f 75 74 70 75 74  n);.    osOutput
aa50: 44 65 62 75 67 53 74 72 69 6e 67 41 28 7a 44 62  DebugStringA(zDb
aa60: 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gBuf);.  }else{.
aa70: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
aa80: 67 53 74 72 69 6e 67 41 28 7a 42 75 66 29 3b 0a  gStringA(zBuf);.
aa90: 20 20 7d 0a 23 65 6c 69 66 20 64 65 66 69 6e 65    }.#elif define
aaa0: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
aab0: 41 53 5f 57 49 44 45 29 0a 20 20 6d 65 6d 73 65  AS_WIDE).  memse
aac0: 74 28 7a 44 62 67 42 75 66 2c 20 30 2c 20 53 51  t(zDbgBuf, 0, SQ
aad0: 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42  LITE_WIN32_DBG_B
aae0: 55 46 5f 53 49 5a 45 29 3b 0a 20 20 69 66 20 28  UF_SIZE);.  if (
aaf0: 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69   osMultiByteToWi
ab00: 64 65 43 68 61 72 28 0a 20 20 20 20 20 20 20 20  deChar(.        
ab10: 20 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41    osAreFileApisA
ab20: 4e 53 49 28 29 20 3f 20 43 50 5f 41 43 50 20 3a  NSI() ? CP_ACP :
ab30: 20 43 50 5f 4f 45 4d 43 50 2c 20 30 2c 20 7a 42   CP_OEMCP, 0, zB
ab40: 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4d  uf,.          nM
ab50: 69 6e 2c 20 28 4c 50 57 53 54 52 29 7a 44 62 67  in, (LPWSTR)zDbg
ab60: 42 75 66 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33  Buf, SQLITE_WIN3
ab70: 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45 2f 73  2_DBG_BUF_SIZE/s
ab80: 69 7a 65 6f 66 28 57 43 48 41 52 29 29 3c 3d 30  izeof(WCHAR))<=0
ab90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
aba0: 20 20 7d 0a 20 20 6f 73 4f 75 74 70 75 74 44 65    }.  osOutputDe
abb0: 62 75 67 53 74 72 69 6e 67 57 28 28 4c 50 43 57  bugStringW((LPCW
abc0: 53 54 52 29 7a 44 62 67 42 75 66 29 3b 0a 23 65  STR)zDbgBuf);.#e
abd0: 6c 73 65 0a 20 20 69 66 28 20 6e 4d 69 6e 3e 30  lse.  if( nMin>0
abe0: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a   ){.    memset(z
abf0: 44 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54  DbgBuf, 0, SQLIT
ac00: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
ac10: 53 49 5a 45 29 3b 0a 20 20 20 20 6d 65 6d 63 70  SIZE);.    memcp
ac20: 79 28 7a 44 62 67 42 75 66 2c 20 7a 42 75 66 2c  y(zDbgBuf, zBuf,
ac30: 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 66 70 72 69   nMin);.    fpri
ac40: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 22  ntf(stderr, "%s"
ac50: 2c 20 7a 44 62 67 42 75 66 29 3b 0a 20 20 7d 65  , zDbgBuf);.  }e
ac60: 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
ac70: 28 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a  (stderr, "%s", z
ac80: 42 75 66 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Buf);.  }.#endif
ac90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
aca0: 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20  llowing routine 
acb0: 73 75 73 70 65 6e 64 73 20 74 68 65 20 63 75 72  suspends the cur
acc0: 72 65 6e 74 20 74 68 72 65 61 64 20 66 6f 72 20  rent thread for 
acd0: 61 74 20 6c 65 61 73 74 20 6d 73 0a 2a 2a 20 6d  at least ms.** m
ace0: 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 20 20 54 68  illiseconds.  Th
acf0: 69 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  is is equivalent
ad00: 20 74 6f 20 74 68 65 20 57 69 6e 33 32 20 53 6c   to the Win32 Sl
ad10: 65 65 70 28 29 20 69 6e 74 65 72 66 61 63 65 2e  eep() interface.
ad20: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .*/.#if SQLITE_O
ad30: 53 5f 57 49 4e 52 54 0a 73 74 61 74 69 63 20 48  S_WINRT.static H
ad40: 41 4e 44 4c 45 20 73 6c 65 65 70 4f 62 6a 20 3d  ANDLE sleepObj =
ad50: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76   NULL;.#endif..v
ad60: 6f 69 64 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  oid sqlite3_win3
ad70: 32 5f 73 6c 65 65 70 28 44 57 4f 52 44 20 6d 69  2_sleep(DWORD mi
ad80: 6c 6c 69 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  lliseconds){.#if
ad90: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
ada0: 0a 20 20 69 66 20 28 20 73 6c 65 65 70 4f 62 6a  .  if ( sleepObj
adb0: 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 6c  ==NULL ){.    sl
adc0: 65 65 70 4f 62 6a 20 3d 20 6f 73 43 72 65 61 74  eepObj = osCreat
add0: 65 45 76 65 6e 74 45 78 57 28 4e 55 4c 4c 2c 20  eEventExW(NULL, 
ade0: 4e 55 4c 4c 2c 20 43 52 45 41 54 45 5f 45 56 45  NULL, CREATE_EVE
adf0: 4e 54 5f 4d 41 4e 55 41 4c 5f 52 45 53 45 54 2c  NT_MANUAL_RESET,
ae00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ae10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae20: 20 53 59 4e 43 48 52 4f 4e 49 5a 45 29 3b 0a 20   SYNCHRONIZE);. 
ae30: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 6c 65   }.  assert( sle
ae40: 65 70 4f 62 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20  epObj!=NULL );. 
ae50: 20 6f 73 57 61 69 74 46 6f 72 53 69 6e 67 6c 65   osWaitForSingle
ae60: 4f 62 6a 65 63 74 45 78 28 73 6c 65 65 70 4f 62  ObjectEx(sleepOb
ae70: 6a 2c 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  j, milliseconds,
ae80: 20 46 41 4c 53 45 29 3b 0a 23 65 6c 73 65 0a 20   FALSE);.#else. 
ae90: 20 6f 73 53 6c 65 65 70 28 6d 69 6c 6c 69 73 65   osSleep(millise
aea0: 63 6f 6e 64 73 29 3b 0a 23 65 6e 64 69 66 0a 7d  conds);.#endif.}
aeb0: 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
aec0: 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e  _WORKER_THREADS>
aed0: 30 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  0 && !SQLITE_OS_
aee0: 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45  WINCE && !SQLITE
aef0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 5c 0a 20  _OS_WINRT && \. 
af00: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 48         SQLITE_TH
af10: 52 45 41 44 53 41 46 45 3e 30 0a 44 57 4f 52 44  READSAFE>0.DWORD
af20: 20 73 71 6c 69 74 65 33 57 69 6e 33 32 57 61 69   sqlite3Win32Wai
af30: 74 28 48 41 4e 44 4c 45 20 68 4f 62 6a 65 63 74  t(HANDLE hObject
af40: 29 7b 0a 20 20 44 57 4f 52 44 20 72 63 3b 0a 20  ){.  DWORD rc;. 
af50: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 6f 73   while( (rc = os
af60: 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
af70: 65 63 74 45 78 28 68 4f 62 6a 65 63 74 2c 20 49  ectEx(hObject, I
af80: 4e 46 49 4e 49 54 45 2c 0a 20 20 20 20 20 20 20  NFINITE,.       
af90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 54 52 55 45 29 29 3d 3d 57 41 49 54 5f 49 4f 5f  TRUE))==WAIT_IO_
afc0: 43 4f 4d 50 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20  COMPLETION ){}. 
afd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
afe0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
aff0: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
b000: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
b010: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
b020: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
b030: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
b040: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
b050: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
b060: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
b070: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
b080: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
b090: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
b0a0: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
b0b0: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
b0c0: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
b0d0: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
b0e0: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
b0f0: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
b100: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
b110: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
b120: 20 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 57 69   when running Wi
b130: 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61  n95/98/ME.  A ca
b140: 6c 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ll to.** this ro
b150: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
b160: 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   determine if th
b170: 65 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f  e host is Win95/
b180: 39 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e  98/ME or.** WinN
b190: 54 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20  T/2K/XP so that 
b1a0: 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65  we will know whe
b1b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63  ther or not we c
b1c0: 61 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a  an safely call.*
b1d0: 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78  * the LockFileEx
b1e0: 28 29 20 41 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20  () API..*/..#if 
b1f0: 21 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 47 45  !SQLITE_WIN32_GE
b200: 54 56 45 52 53 49 4f 4e 45 58 0a 23 20 64 65 66  TVERSIONEX.# def
b210: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31  ine osIsNT()  (1
b220: 29 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 4f  ).#elif SQLITE_O
b230: 53 5f 57 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54  S_WINCE || SQLIT
b240: 45 5f 4f 53 5f 57 49 4e 52 54 20 7c 7c 20 21 64  E_OS_WINRT || !d
b250: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
b260: 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 0a 23 20  N32_HAS_ANSI).# 
b270: 64 65 66 69 6e 65 20 6f 73 49 73 4e 54 28 29 20  define osIsNT() 
b280: 20 28 31 29 0a 23 65 6c 69 66 20 21 64 65 66 69   (1).#elif !defi
b290: 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
b2a0: 5f 48 41 53 5f 57 49 44 45 29 0a 23 20 64 65 66  _HAS_WIDE).# def
b2b0: 69 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 30  ine osIsNT()  (0
b2c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
b2d0: 20 6f 73 49 73 4e 54 28 29 20 20 28 28 73 71 6c   osIsNT()  ((sql
b2e0: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 29  ite3_os_type==2)
b2f0: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 77 69 6e 33   || sqlite3_win3
b300: 32 5f 69 73 5f 6e 74 28 29 29 0a 23 65 6e 64 69  2_is_nt()).#endi
b310: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
b320: 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
b330: 73 20 69 66 20 74 68 65 20 6d 61 63 68 69 6e 65  s if the machine
b340: 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 20 76 65   is running a ve
b350: 72 73 69 6f 6e 20 6f 66 20 57 69 6e 64 6f 77 73  rsion of Windows
b360: 0a 2a 2a 20 62 61 73 65 64 20 6f 6e 20 74 68 65  .** based on the
b370: 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69   NT kernel..*/.i
b380: 6e 74 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  nt sqlite3_win32
b390: 5f 69 73 5f 6e 74 28 76 6f 69 64 29 7b 0a 23 69  _is_nt(void){.#i
b3a0: 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  f SQLITE_OS_WINR
b3b0: 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  T.  /*.  ** NOTE
b3c0: 3a 20 54 68 65 20 57 69 6e 52 54 20 73 75 62 2d  : The WinRT sub-
b3d0: 70 6c 61 74 66 6f 72 6d 20 69 73 20 61 6c 77 61  platform is alwa
b3e0: 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65  ys assumed to be
b3f0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54   based on the NT
b400: 0a 20 20 2a 2a 20 20 20 20 20 20 20 6b 65 72 6e  .  **       kern
b410: 65 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  el..  */.  retur
b420: 6e 20 31 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54  n 1;.#elif SQLIT
b430: 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52 53 49  E_WIN32_GETVERSI
b440: 4f 4e 45 58 0a 20 20 69 66 28 20 6f 73 49 6e 74  ONEX.  if( osInt
b450: 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45  erlockedCompareE
b460: 78 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33  xchange(&sqlite3
b470: 5f 6f 73 5f 74 79 70 65 2c 20 30 2c 20 30 29 3d  _os_type, 0, 0)=
b480: 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  =0 ){.#if define
b490: 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  d(SQLITE_WIN32_H
b4a0: 41 53 5f 41 4e 53 49 29 0a 20 20 20 20 4f 53 56  AS_ANSI).    OSV
b4b0: 45 52 53 49 4f 4e 49 4e 46 4f 41 20 73 49 6e 66  ERSIONINFOA sInf
b4c0: 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f  o;.    sInfo.dwO
b4d0: 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65  SVersionInfoSize
b4e0: 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29   = sizeof(sInfo)
b4f0: 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73 69  ;.    osGetVersi
b500: 6f 6e 45 78 41 28 26 73 49 6e 66 6f 29 3b 0a 20  onExA(&sInfo);. 
b510: 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64     osInterlocked
b520: 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65 28  CompareExchange(
b530: 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65  &sqlite3_os_type
b540: 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66 6f  ,.        (sInfo
b550: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d  .dwPlatformId ==
b560: 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49   VER_PLATFORM_WI
b570: 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c  N32_NT) ? 2 : 1,
b580: 20 30 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e   0);.#elif defin
b590: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b5a0: 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 4f 53  HAS_WIDE).    OS
b5b0: 56 45 52 53 49 4f 4e 49 4e 46 4f 57 20 73 49 6e  VERSIONINFOW sIn
b5c0: 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77  fo;.    sInfo.dw
b5d0: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
b5e0: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
b5f0: 29 3b 0a 20 20 20 20 6f 73 47 65 74 56 65 72 73  );.    osGetVers
b600: 69 6f 6e 45 78 57 28 26 73 49 6e 66 6f 29 3b 0a  ionExW(&sInfo);.
b610: 20 20 20 20 6f 73 49 6e 74 65 72 6c 6f 63 6b 65      osInterlocke
b620: 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e 67 65  dCompareExchange
b630: 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  (&sqlite3_os_typ
b640: 65 2c 0a 20 20 20 20 20 20 20 20 28 73 49 6e 66  e,.        (sInf
b650: 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 20 3d  o.dwPlatformId =
b660: 3d 20 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57  = VER_PLATFORM_W
b670: 49 4e 33 32 5f 4e 54 29 20 3f 20 32 20 3a 20 31  IN32_NT) ? 2 : 1
b680: 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
b690: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b6a0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b6b0: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b6c0: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b6d0: 32 3b 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f  2;.#elif SQLITE_
b6e0: 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20 6f 73  TEST.  return os
b6f0: 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70 61  InterlockedCompa
b700: 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c 69  reExchange(&sqli
b710: 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 32 2c 20  te3_os_type, 2, 
b720: 32 29 3d 3d 32 3b 0a 23 65 6c 73 65 0a 20 20 2f  2)==2;.#else.  /
b730: 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c  *.  ** NOTE: All
b740: 20 73 75 62 2d 70 6c 61 74 66 6f 72 6d 73 20 77   sub-platforms w
b750: 68 65 72 65 20 74 68 65 20 47 65 74 56 65 72 73  here the GetVers
b760: 69 6f 6e 45 78 5b 41 57 5d 20 66 75 6e 63 74 69  ionEx[AW] functi
b770: 6f 6e 73 20 61 72 65 0a 20 20 2a 2a 20 20 20 20  ons are.  **    
b780: 20 20 20 64 65 70 72 65 63 61 74 65 64 20 61 72     deprecated ar
b790: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 64  e always assumed
b7a0: 20 74 6f 20 62 65 20 62 61 73 65 64 20 6f 6e 20   to be based on 
b7b0: 74 68 65 20 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20  the NT kernel.. 
b7c0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
b7d0: 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 64 65 66  #endif.}..#ifdef
b7e0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
b7f0: 4c 4c 4f 43 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  LLOC./*.** Alloc
b800: 61 74 65 20 6e 42 79 74 65 73 20 6f 66 20 6d 65  ate nBytes of me
b810: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
b820: 76 6f 69 64 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c  void *winMemMall
b830: 6f 63 28 69 6e 74 20 6e 42 79 74 65 73 29 7b 0a  oc(int nBytes){.
b840: 20 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a    HANDLE hHeap;.
b850: 20 20 76 6f 69 64 20 2a 70 3b 0a 0a 20 20 77 69    void *p;..  wi
b860: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
b870: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
b880: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
b890: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
b8a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
b8b0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
b8c0: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
b8d0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
b8e0: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
b8f0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b900: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
b910: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
b920: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
b930: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
b940: 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e  GS, NULL) );.#en
b950: 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 6e 42  dif.  assert( nB
b960: 79 74 65 73 3e 3d 30 20 29 3b 0a 20 20 70 20 3d  ytes>=0 );.  p =
b970: 20 6f 73 48 65 61 70 41 6c 6c 6f 63 28 68 48 65   osHeapAlloc(hHe
b980: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
b990: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 28 53 49  _HEAP_FLAGS, (SI
b9a0: 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20 20  ZE_T)nBytes);.  
b9b0: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 73 71  if( !p ){.    sq
b9c0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b9d0: 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20  _NOMEM, "failed 
b9e0: 74 6f 20 48 65 61 70 41 6c 6c 6f 63 20 25 75 20  to HeapAlloc %u 
b9f0: 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61  bytes (%lu), hea
ba00: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
ba10: 20 20 20 20 20 20 20 6e 42 79 74 65 73 2c 20 6f         nBytes, o
ba20: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
ba30: 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a   (void*)hHeap);.
ba40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
ba50: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 6d 65  }../*.** Free me
ba60: 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
ba70: 76 6f 69 64 20 77 69 6e 4d 65 6d 46 72 65 65 28  void winMemFree(
ba80: 76 6f 69 64 20 2a 70 50 72 69 6f 72 29 7b 0a 20  void *pPrior){. 
ba90: 20 48 41 4e 44 4c 45 20 68 48 65 61 70 3b 0a 0a   HANDLE hHeap;..
baa0: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bab0: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bac0: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bad0: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bae0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
baf0: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bb00: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bb10: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bb20: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bb30: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bb40: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bb50: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bb60: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
bb70: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
bb80: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
bb90: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
bba0: 21 70 50 72 69 6f 72 20 29 20 72 65 74 75 72 6e  !pPrior ) return
bbb0: 3b 20 2f 2a 20 50 61 73 73 69 6e 67 20 4e 55 4c  ; /* Passing NUL
bbc0: 4c 20 74 6f 20 48 65 61 70 46 72 65 65 20 69 73  L to HeapFree is
bbd0: 20 75 6e 64 65 66 69 6e 65 64 2e 20 2a 2f 0a 20   undefined. */. 
bbe0: 20 69 66 28 20 21 6f 73 48 65 61 70 46 72 65 65   if( !osHeapFree
bbf0: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
bc00: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
bc10: 20 70 50 72 69 6f 72 29 20 29 7b 0a 20 20 20 20   pPrior) ){.    
bc20: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
bc30: 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65  TE_NOMEM, "faile
bc40: 64 20 74 6f 20 48 65 61 70 46 72 65 65 20 62 6c  d to HeapFree bl
bc50: 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65  ock %p (%lu), he
bc60: 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20  ap=%p",.        
bc70: 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 2c 20          pPrior, 
bc80: 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
bc90: 2c 20 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b  , (void*)hHeap);
bca0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  .  }.}../*.** Ch
bcb0: 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
bcc0: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6d 65 6d   an existing mem
bcd0: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ory allocation.*
bce0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 77  /.static void *w
bcf0: 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 28 76 6f 69  inMemRealloc(voi
bd00: 64 20 2a 70 50 72 69 6f 72 2c 20 69 6e 74 20 6e  d *pPrior, int n
bd10: 42 79 74 65 73 29 7b 0a 20 20 48 41 4e 44 4c 45  Bytes){.  HANDLE
bd20: 20 68 48 65 61 70 3b 0a 20 20 76 6f 69 64 20 2a   hHeap;.  void *
bd30: 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73 65  p;..  winMemAsse
bd40: 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48 65  rtMagic();.  hHe
bd50: 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48 65  ap = winMemGetHe
bd60: 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ap();.  assert( 
bd70: 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61 73  hHeap!=0 );.  as
bd80: 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e 56  sert( hHeap!=INV
bd90: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
bda0: 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54 45  E );.#if !SQLITE
bdb0: 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65 66  _OS_WINRT && def
bdc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
bdd0: 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41 54  2_MALLOC_VALIDAT
bde0: 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73 48  E).  assert( osH
bdf0: 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65 61  eapValidate(hHea
be00: 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  p, SQLITE_WIN32_
be10: 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69  HEAP_FLAGS, pPri
be20: 6f 72 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  or) );.#endif.  
be30: 61 73 73 65 72 74 28 20 6e 42 79 74 65 73 3e 3d  assert( nBytes>=
be40: 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 72 69  0 );.  if( !pPri
be50: 6f 72 20 29 7b 0a 20 20 20 20 70 20 3d 20 6f 73  or ){.    p = os
be60: 48 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c  HeapAlloc(hHeap,
be70: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
be80: 41 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f  AP_FLAGS, (SIZE_
be90: 54 29 6e 42 79 74 65 73 29 3b 0a 20 20 7d 65 6c  T)nBytes);.  }el
bea0: 73 65 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65  se{.    p = osHe
beb0: 61 70 52 65 41 6c 6c 6f 63 28 68 48 65 61 70 2c  apReAlloc(hHeap,
bec0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45   SQLITE_WIN32_HE
bed0: 41 50 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72  AP_FLAGS, pPrior
bee0: 2c 20 28 53 49 5a 45 5f 54 29 6e 42 79 74 65 73  , (SIZE_T)nBytes
bef0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 20  );.  }.  if( !p 
bf00: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
bf10: 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  og(SQLITE_NOMEM,
bf20: 20 22 66 61 69 6c 65 64 20 74 6f 20 25 73 20 25   "failed to %s %
bf30: 75 20 62 79 74 65 73 20 28 25 6c 75 29 2c 20 68  u bytes (%lu), h
bf40: 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20  eap=%p",.       
bf50: 20 20 20 20 20 20 20 20 20 70 50 72 69 6f 72 20           pPrior 
bf60: 3f 20 22 48 65 61 70 52 65 41 6c 6c 6f 63 22 20  ? "HeapReAlloc" 
bf70: 3a 20 22 48 65 61 70 41 6c 6c 6f 63 22 2c 20 6e  : "HeapAlloc", n
bf80: 42 79 74 65 73 2c 20 6f 73 47 65 74 4c 61 73 74  Bytes, osGetLast
bf90: 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
bfa0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
bfb0: 68 48 65 61 70 29 3b 0a 20 20 7d 0a 20 20 72 65  hHeap);.  }.  re
bfc0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
bfd0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
bfe0: 20 6f 66 20 61 6e 20 6f 75 74 73 74 61 6e 64 69   of an outstandi
bff0: 6e 67 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69  ng allocation, i
c000: 6e 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  n bytes..*/.stat
c010: 69 63 20 69 6e 74 20 77 69 6e 4d 65 6d 53 69 7a  ic int winMemSiz
c020: 65 28 76 6f 69 64 20 2a 70 29 7b 0a 20 20 48 41  e(void *p){.  HA
c030: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 53 49  NDLE hHeap;.  SI
c040: 5a 45 5f 54 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65  ZE_T n;..  winMe
c050: 6d 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a  mAssertMagic();.
c060: 20 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d    hHeap = winMem
c070: 47 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73  GetHeap();.  ass
c080: 65 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b  ert( hHeap!=0 );
c090: 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70  .  assert( hHeap
c0a0: 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  !=INVALID_HANDLE
c0b0: 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53  _VALUE );.#if !S
c0c0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
c0d0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
c0e0: 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41  _WIN32_MALLOC_VA
c0f0: 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74  LIDATE).  assert
c100: 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65  ( osHeapValidate
c110: 28 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57  (hHeap, SQLITE_W
c120: 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c  IN32_HEAP_FLAGS,
c130: 20 70 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20   p) );.#endif.  
c140: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
c150: 30 3b 0a 20 20 6e 20 3d 20 6f 73 48 65 61 70 53  0;.  n = osHeapS
c160: 69 7a 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ize(hHeap, SQLIT
c170: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
c180: 47 53 2c 20 70 29 3b 0a 20 20 69 66 28 20 6e 3d  GS, p);.  if( n=
c190: 3d 28 53 49 5a 45 5f 54 29 2d 31 20 29 7b 0a 20  =(SIZE_T)-1 ){. 
c1a0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
c1b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
c1c0: 69 6c 65 64 20 74 6f 20 48 65 61 70 53 69 7a 65  iled to HeapSize
c1d0: 20 62 6c 6f 63 6b 20 25 70 20 28 25 6c 75 29 2c   block %p (%lu),
c1e0: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
c1f0: 20 20 20 20 20 20 20 20 20 20 20 70 2c 20 6f 73             p, os
c200: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c210: 28 76 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20  (void*)hHeap);. 
c220: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
c230: 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 6e  .  return (int)n
c240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64  ;.}../*.** Round
c250: 20 75 70 20 61 20 72 65 71 75 65 73 74 20 73 69   up a request si
c260: 7a 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 76  ze to the next v
c270: 61 6c 69 64 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  alid allocation 
c280: 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
c290: 69 6e 74 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75  int winMemRoundu
c2a0: 70 28 69 6e 74 20 6e 29 7b 0a 20 20 72 65 74 75  p(int n){.  retu
c2b0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn n;.}../*.** I
c2c0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
c2d0: 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  odule..*/.static
c2e0: 20 69 6e 74 20 77 69 6e 4d 65 6d 49 6e 69 74 28   int winMemInit(
c2f0: 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
c300: 0a 20 20 77 69 6e 4d 65 6d 44 61 74 61 20 2a 70  .  winMemData *p
c310: 57 69 6e 4d 65 6d 44 61 74 61 20 3d 20 28 77 69  WinMemData = (wi
c320: 6e 4d 65 6d 44 61 74 61 20 2a 29 70 41 70 70 44  nMemData *)pAppD
c330: 61 74 61 3b 0a 0a 20 20 69 66 28 20 21 70 57 69  ata;..  if( !pWi
c340: 6e 4d 65 6d 44 61 74 61 20 29 20 72 65 74 75 72  nMemData ) retur
c350: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c360: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c370: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 31 3d 3d 57  mData->magic1==W
c380: 49 4e 4d 45 4d 5f 4d 41 47 49 43 31 20 29 3b 0a  INMEM_MAGIC1 );.
c390: 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65    assert( pWinMe
c3a0: 6d 44 61 74 61 2d 3e 6d 61 67 69 63 32 3d 3d 57  mData->magic2==W
c3b0: 49 4e 4d 45 4d 5f 4d 41 47 49 43 32 20 29 3b 0a  INMEM_MAGIC2 );.
c3c0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
c3d0: 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54 45 5f  WINRT && SQLITE_
c3e0: 57 49 4e 33 32 5f 48 45 41 50 5f 43 52 45 41 54  WIN32_HEAP_CREAT
c3f0: 45 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  E.  if( !pWinMem
c400: 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20  Data->hHeap ){. 
c410: 20 20 20 44 57 4f 52 44 20 64 77 49 6e 69 74 69     DWORD dwIniti
c420: 61 6c 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  alSize = SQLITE_
c430: 57 49 4e 33 32 5f 48 45 41 50 5f 49 4e 49 54 5f  WIN32_HEAP_INIT_
c440: 53 49 5a 45 3b 0a 20 20 20 20 44 57 4f 52 44 20  SIZE;.    DWORD 
c450: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c460: 28 44 57 4f 52 44 29 73 71 6c 69 74 65 33 47 6c  (DWORD)sqlite3Gl
c470: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
c480: 3b 0a 20 20 20 20 69 66 28 20 64 77 4d 61 78 69  ;.    if( dwMaxi
c490: 6d 75 6d 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  mumSize==0 ){.  
c4a0: 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a      dwMaximumSiz
c4b0: 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  e = SQLITE_WIN32
c4c0: 5f 48 45 41 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a  _HEAP_MAX_SIZE;.
c4d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 64 77      }else if( dw
c4e0: 49 6e 69 74 69 61 6c 53 69 7a 65 3e 64 77 4d 61  InitialSize>dwMa
c4f0: 78 69 6d 75 6d 53 69 7a 65 20 29 7b 0a 20 20 20  ximumSize ){.   
c500: 20 20 20 64 77 49 6e 69 74 69 61 6c 53 69 7a 65     dwInitialSize
c510: 20 3d 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65   = dwMaximumSize
c520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
c530: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d  MemData->hHeap =
c540: 20 6f 73 48 65 61 70 43 72 65 61 74 65 28 53 51   osHeapCreate(SQ
c550: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f  LITE_WIN32_HEAP_
c560: 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20  FLAGS,.         
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77 49               dwI
c590: 6e 69 74 69 61 6c 53 69 7a 65 2c 20 64 77 4d 61  nitialSize, dwMa
c5a0: 78 69 6d 75 6d 53 69 7a 65 29 3b 0a 20 20 20 20  ximumSize);.    
c5b0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c5c0: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 20  ->hHeap ){.     
c5d0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c5e0: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
c5f0: 20 20 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20       "failed to 
c600: 48 65 61 70 43 72 65 61 74 65 20 28 25 6c 75 29  HeapCreate (%lu)
c610: 2c 20 66 6c 61 67 73 3d 25 75 2c 20 69 6e 69 74  , flags=%u, init
c620: 53 69 7a 65 3d 25 6c 75 2c 20 6d 61 78 53 69 7a  Size=%lu, maxSiz
c630: 65 3d 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20  e=%lu",.        
c640: 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72    osGetLastError
c650: 28 29 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  (), SQLITE_WIN32
c660: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 64 77 49  _HEAP_FLAGS, dwI
c670: 6e 69 74 69 61 6c 53 69 7a 65 2c 0a 20 20 20 20  nitialSize,.    
c680: 20 20 20 20 20 20 64 77 4d 61 78 69 6d 75 6d 53        dwMaximumS
c690: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
c6a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c6b0: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
c6c0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c6d0: 6e 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ned = TRUE;.    
c6e0: 61 73 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44  assert( pWinMemD
c6f0: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 20  ata->bOwned );. 
c700: 20 7d 0a 23 65 6c 73 65 0a 20 20 70 57 69 6e 4d   }.#else.  pWinM
c710: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 3d 20  emData->hHeap = 
c720: 6f 73 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  osGetProcessHeap
c730: 28 29 3b 0a 20 20 69 66 28 20 21 70 57 69 6e 4d  ();.  if( !pWinM
c740: 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 20 29 7b  emData->hHeap ){
c750: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
c760: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20  (SQLITE_NOMEM,. 
c770: 20 20 20 20 20 20 20 22 66 61 69 6c 65 64 20 74         "failed t
c780: 6f 20 47 65 74 50 72 6f 63 65 73 73 48 65 61 70  o GetProcessHeap
c790: 20 28 25 6c 75 29 22 2c 20 6f 73 47 65 74 4c 61   (%lu)", osGetLa
c7a0: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
c7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
c7c0: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
c7d0: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77  pWinMemData->bOw
c7e0: 6e 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 61  ned = FALSE;.  a
c7f0: 73 73 65 72 74 28 20 21 70 57 69 6e 4d 65 6d 44  ssert( !pWinMemD
c800: 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 3b 0a 23  ata->bOwned );.#
c810: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
c820: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
c830: 61 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ap!=0 );.  asser
c840: 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e  t( pWinMemData->
c850: 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48  hHeap!=INVALID_H
c860: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23  ANDLE_VALUE );.#
c870: 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
c880: 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28 53  NRT && defined(S
c890: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
c8a0: 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61  OC_VALIDATE).  a
c8b0: 73 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c  ssert( osHeapVal
c8c0: 69 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74  idate(pWinMemDat
c8d0: 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45  a->hHeap, SQLITE
c8e0: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c8f0: 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64  S, NULL) );.#end
c900: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
c910: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
c920: 44 65 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  Deinitialize thi
c930: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61  s module..*/.sta
c940: 74 69 63 20 76 6f 69 64 20 77 69 6e 4d 65 6d 53  tic void winMemS
c950: 68 75 74 64 6f 77 6e 28 76 6f 69 64 20 2a 70 41  hutdown(void *pA
c960: 70 70 44 61 74 61 29 7b 0a 20 20 77 69 6e 4d 65  ppData){.  winMe
c970: 6d 44 61 74 61 20 2a 70 57 69 6e 4d 65 6d 44 61  mData *pWinMemDa
c980: 74 61 20 3d 20 28 77 69 6e 4d 65 6d 44 61 74 61  ta = (winMemData
c990: 20 2a 29 70 41 70 70 44 61 74 61 3b 0a 0a 20 20   *)pAppData;..  
c9a0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c9b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
c9c0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
c9d0: 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45 4d  ->magic1==WINMEM
c9e0: 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73 73  _MAGIC1 );.  ass
c9f0: 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61  ert( pWinMemData
ca00: 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45 4d  ->magic2==WINMEM
ca10: 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 20 20 69 66  _MAGIC2 );..  if
ca20: 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  ( pWinMemData->h
ca30: 48 65 61 70 20 29 7b 0a 20 20 20 20 61 73 73 65  Heap ){.    asse
ca40: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
ca50: 3e 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f  >hHeap!=INVALID_
ca60: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a  HANDLE_VALUE );.
ca70: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
ca80: 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64 28  INRT && defined(
ca90: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c  SQLITE_WIN32_MAL
caa0: 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20 20  LOC_VALIDATE).  
cab0: 20 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70    assert( osHeap
cac0: 56 61 6c 69 64 61 74 65 28 70 57 69 6e 4d 65 6d  Validate(pWinMem
cad0: 44 61 74 61 2d 3e 68 48 65 61 70 2c 20 53 51 4c  Data->hHeap, SQL
cae0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
caf0: 4c 41 47 53 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23  LAGS, NULL) );.#
cb00: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 57  endif.    if( pW
cb10: 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65  inMemData->bOwne
cb20: 64 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  d ){.      if( !
cb30: 6f 73 48 65 61 70 44 65 73 74 72 6f 79 28 70 57  osHeapDestroy(pW
cb40: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
cb50: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ) ){.        sql
cb60: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
cb70: 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74  NOMEM, "failed t
cb80: 6f 20 48 65 61 70 44 65 73 74 72 6f 79 20 28 25  o HeapDestroy (%
cb90: 6c 75 29 2c 20 68 65 61 70 3d 25 70 22 2c 0a 20  lu), heap=%p",. 
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbb0: 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f     osGetLastErro
cbc0: 72 28 29 2c 20 28 76 6f 69 64 2a 29 70 57 69 6e  r(), (void*)pWin
cbd0: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 3b  MemData->hHeap);
cbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cbf0: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e  WinMemData->bOwn
cc00: 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
cc10: 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44 61 74  }.    pWinMemDat
cc20: 61 2d 3e 68 48 65 61 70 20 3d 20 4e 55 4c 4c 3b  a->hHeap = NULL;
cc30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  .  }.}../*.** Po
cc40: 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 77 2d 6c  pulate the low-l
cc50: 65 76 65 6c 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  evel memory allo
cc60: 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  cation function 
cc70: 70 6f 69 6e 74 65 72 73 20 69 6e 0a 2a 2a 20 73  pointers in.** s
cc80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
cc90: 69 67 2e 6d 20 77 69 74 68 20 70 6f 69 6e 74 65  ig.m with pointe
cca0: 72 73 20 74 6f 20 74 68 65 20 72 6f 75 74 69 6e  rs to the routin
ccb0: 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  es in this file.
ccc0: 20 54 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   The.** argument
ccd0: 73 20 73 70 65 63 69 66 79 20 74 68 65 20 62 6c  s specify the bl
cce0: 6f 63 6b 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  ock of memory to
ccf0: 20 6d 61 6e 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54   manage..**.** T
cd00: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  his routine is o
cd10: 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71  nly called by sq
cd20: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 2c 20  lite3_config(), 
cd30: 61 6e 64 20 74 68 65 72 65 66 6f 72 65 0a 2a 2a  and therefore.**
cd40: 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64   is not required
cd50: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66   to be threadsaf
cd60: 65 20 28 69 74 20 69 73 20 6e 6f 74 29 2e 0a 2a  e (it is not)..*
cd70: 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
cd80: 6d 65 6d 5f 6d 65 74 68 6f 64 73 20 2a 73 71 6c  mem_methods *sql
cd90: 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33 32 28  ite3MemGetWin32(
cda0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
cdb0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65  const sqlite3_me
cdc0: 6d 5f 6d 65 74 68 6f 64 73 20 77 69 6e 4d 65 6d  m_methods winMem
cdd0: 4d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 20 20  Methods = {.    
cde0: 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20  winMemMalloc,.  
cdf0: 20 20 77 69 6e 4d 65 6d 46 72 65 65 2c 0a 20 20    winMemFree,.  
ce00: 20 20 77 69 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c    winMemRealloc,
ce10: 0a 20 20 20 20 77 69 6e 4d 65 6d 53 69 7a 65 2c  .    winMemSize,
ce20: 0a 20 20 20 20 77 69 6e 4d 65 6d 52 6f 75 6e 64  .    winMemRound
ce30: 75 70 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 49 6e  up,.    winMemIn
ce40: 69 74 2c 0a 20 20 20 20 77 69 6e 4d 65 6d 53 68  it,.    winMemSh
ce50: 75 74 64 6f 77 6e 2c 0a 20 20 20 20 26 77 69 6e  utdown,.    &win
ce60: 5f 6d 65 6d 5f 64 61 74 61 0a 20 20 7d 3b 0a 20  _mem_data.  };. 
ce70: 20 72 65 74 75 72 6e 20 26 77 69 6e 4d 65 6d 4d   return &winMemM
ce80: 65 74 68 6f 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20  ethods;.}..void 
ce90: 73 71 6c 69 74 65 33 4d 65 6d 53 65 74 44 65 66  sqlite3MemSetDef
cea0: 61 75 6c 74 28 76 6f 69 64 29 7b 0a 20 20 73 71  ault(void){.  sq
ceb0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
cec0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f  ITE_CONFIG_MALLO
ced0: 43 2c 20 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  C, sqlite3MemGet
cee0: 57 69 6e 33 32 28 29 29 3b 0a 7d 0a 23 65 6e 64  Win32());.}.#end
cef0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e  if /* SQLITE_WIN
cf00: 33 32 5f 4d 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a  32_MALLOC */../*
cf10: 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
cf20: 46 2d 38 20 73 74 72 69 6e 67 20 74 6f 20 4d 69  F-8 string to Mi
cf30: 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 2e  crosoft Unicode.
cf40: 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
cf50: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
cf60: 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61  d string is obta
cf70: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
cf80: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73  3_malloc()..*/.s
cf90: 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69 6e  tatic LPWSTR win
cfa0: 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 63 6f  Utf8ToUnicode(co
cfb0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29  nst char *zText)
cfc0: 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 3b 0a 20  {.  int nChar;. 
cfd0: 20 4c 50 57 53 54 52 20 7a 57 69 64 65 54 65 78   LPWSTR zWideTex
cfe0: 74 3b 0a 0a 20 20 6e 43 68 61 72 20 3d 20 6f 73  t;..  nChar = os
cff0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d000: 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  har(CP_UTF8, 0, 
d010: 7a 54 65 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c  zText, -1, NULL,
d020: 20 30 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72   0);.  if( nChar
d030: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d040: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 57 69 64 65  n 0;.  }.  zWide
d050: 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d 61  Text = sqlite3Ma
d060: 6c 6c 6f 63 5a 65 72 6f 28 20 6e 43 68 61 72 2a  llocZero( nChar*
d070: 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b  sizeof(WCHAR) );
d080: 0a 20 20 69 66 28 20 7a 57 69 64 65 54 65 78 74  .  if( zWideText
d090: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d0a0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 43 68 61 72  n 0;.  }.  nChar
d0b0: 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74 65 54 6f   = osMultiByteTo
d0c0: 57 69 64 65 43 68 61 72 28 43 50 5f 55 54 46 38  WideChar(CP_UTF8
d0d0: 2c 20 30 2c 20 7a 54 65 78 74 2c 20 2d 31 2c 20  , 0, zText, -1, 
d0e0: 7a 57 69 64 65 54 65 78 74 2c 0a 20 20 20 20 20  zWideText,.     
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 6e 43 68 61 72             nChar
d110: 29 3b 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d  );.  if( nChar==
d120: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
d130: 5f 66 72 65 65 28 7a 57 69 64 65 54 65 78 74 29  _free(zWideText)
d140: 3b 0a 20 20 20 20 7a 57 69 64 65 54 65 78 74 20  ;.    zWideText 
d150: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d160: 6e 20 7a 57 69 64 65 54 65 78 74 3b 0a 7d 0a 0a  n zWideText;.}..
d170: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
d180: 4d 69 63 72 6f 73 6f 66 74 20 55 6e 69 63 6f 64  Microsoft Unicod
d190: 65 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d  e string to UTF-
d1a0: 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  8..**.** Space t
d1b0: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
d1c0: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
d1d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
d1e0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
d1f0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
d200: 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 4c  nUnicodeToUtf8(L
d210: 50 43 57 53 54 52 20 7a 57 69 64 65 54 65 78 74  PCWSTR zWideText
d220: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  ){.  int nByte;.
d230: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a 0a    char *zText;..
d240: 20 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65    nByte = osWide
d250: 43 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28  CharToMultiByte(
d260: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64  CP_UTF8, 0, zWid
d270: 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  eText, -1, 0, 0,
d280: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d290: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d2a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d2b0: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d  zText = sqlite3M
d2c0: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
d2d0: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d   );.  if( zText=
d2e0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d2f0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
d300: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d310: 6c 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c  ltiByte(CP_UTF8,
d320: 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20 2d   0, zWideText, -
d330: 31 2c 20 7a 54 65 78 74 2c 20 6e 42 79 74 65 2c  1, zText, nByte,
d340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d370: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d380: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65  sqlite3_free(zTe
d390: 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20 3d  xt);.    zText =
d3a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
d3b0: 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zText;.}../*.**
d3c0: 20 43 6f 6e 76 65 72 74 20 61 6e 20 41 4e 53 49   Convert an ANSI
d3d0: 20 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f   string to Micro
d3e0: 73 6f 66 74 20 55 6e 69 63 6f 64 65 2c 20 75 73  soft Unicode, us
d3f0: 69 6e 67 20 74 68 65 20 41 4e 53 49 20 6f 72 20  ing the ANSI or 
d400: 4f 45 4d 0a 2a 2a 20 63 6f 64 65 20 70 61 67 65  OEM.** code page
d410: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d420: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d430: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d440: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
d450: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
d460: 73 74 61 74 69 63 20 4c 50 57 53 54 52 20 77 69  static LPWSTR wi
d470: 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65 28 63  nMbcsToUnicode(c
d480: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
d490: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
d4a0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 4c    int nByte;.  L
d4b0: 50 57 53 54 52 20 7a 4d 62 63 73 54 65 78 74 3b  PWSTR zMbcsText;
d4c0: 0a 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20  .  int codepage 
d4d0: 3d 20 75 73 65 41 6e 73 69 20 3f 20 43 50 5f 41  = useAnsi ? CP_A
d4e0: 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a  CP : CP_OEMCP;..
d4f0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
d500: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d510: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65  codepage, 0, zTe
d520: 78 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20  xt, -1, NULL,.  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
d550: 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 3b 0a  *sizeof(WCHAR);.
d560: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
d570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d580: 20 20 7d 0a 20 20 7a 4d 62 63 73 54 65 78 74 20    }.  zMbcsText 
d590: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
d5a0: 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
d5b0: 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69 66  f(WCHAR) );.  if
d5c0: 28 20 7a 4d 62 63 73 54 65 78 74 3d 3d 30 20 29  ( zMbcsText==0 )
d5d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d5e0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d5f0: 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43  MultiByteToWideC
d600: 68 61 72 28 63 6f 64 65 70 61 67 65 2c 20 30 2c  har(codepage, 0,
d610: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 4d 62 63   zText, -1, zMbc
d620: 73 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  sText,.         
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 20 20 20 20 6e 42 79 74 65 29 3b 0a 20         nByte);. 
d650: 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b   if( nByte==0 ){
d660: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d670: 65 28 7a 4d 62 63 73 54 65 78 74 29 3b 0a 20 20  e(zMbcsText);.  
d680: 20 20 7a 4d 62 63 73 54 65 78 74 20 3d 20 30 3b    zMbcsText = 0;
d690: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 4d  .  }.  return zM
d6a0: 62 63 73 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  bcsText;.}../*.*
d6b0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72  * Convert a Micr
d6c0: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74  osoft Unicode st
d6d0: 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74 69 2d  ring to a multi-
d6e0: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
d6f0: 74 72 69 6e 67 2c 0a 2a 2a 20 75 73 69 6e 67 20  tring,.** using 
d700: 74 68 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 20  the ANSI or OEM 
d710: 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  code page..**.**
d720: 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
d730: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
d740: 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ng is obtained f
d750: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
d760: 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oc()..*/.static 
d770: 63 68 61 72 20 2a 77 69 6e 55 6e 69 63 6f 64 65  char *winUnicode
d780: 54 6f 4d 62 63 73 28 4c 50 43 57 53 54 52 20 7a  ToMbcs(LPCWSTR z
d790: 57 69 64 65 54 65 78 74 2c 20 69 6e 74 20 75 73  WideText, int us
d7a0: 65 41 6e 73 69 29 7b 0a 20 20 69 6e 74 20 6e 42  eAnsi){.  int nB
d7b0: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65  yte;.  char *zTe
d7c0: 78 74 3b 0a 20 20 69 6e 74 20 63 6f 64 65 70 61  xt;.  int codepa
d7d0: 67 65 20 3d 20 75 73 65 41 6e 73 69 20 3f 20 43  ge = useAnsi ? C
d7e0: 50 5f 41 43 50 20 3a 20 43 50 5f 4f 45 4d 43 50  P_ACP : CP_OEMCP
d7f0: 3b 0a 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73 57  ;..  nByte = osW
d800: 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42 79  ideCharToMultiBy
d810: 74 65 28 63 6f 64 65 70 61 67 65 2c 20 30 2c 20  te(codepage, 0, 
d820: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 30  zWideText, -1, 0
d830: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66  , 0, 0, 0);.  if
d840: 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a  ( nByte == 0 ){.
d850: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
d860: 7d 0a 20 20 7a 54 65 78 74 20 3d 20 73 71 6c 69  }.  zText = sqli
d870: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e  te3MallocZero( n
d880: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 54  Byte );.  if( zT
d890: 65 78 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ext==0 ){.    re
d8a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 42  turn 0;.  }.  nB
d8b0: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d8c0: 54 6f 4d 75 6c 74 69 42 79 74 65 28 63 6f 64 65  ToMultiByte(code
d8d0: 70 61 67 65 2c 20 30 2c 20 7a 57 69 64 65 54 65  page, 0, zWideTe
d8e0: 78 74 2c 20 2d 31 2c 20 7a 54 65 78 74 2c 0a 20  xt, -1, zText,. 
d8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
d910: 42 79 74 65 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Byte, 0, 0);.  i
d920: 66 28 20 6e 42 79 74 65 20 3d 3d 20 30 20 29 7b  f( nByte == 0 ){
d930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d940: 65 28 7a 54 65 78 74 29 3b 0a 20 20 20 20 7a 54  e(zText);.    zT
d950: 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ext = 0;.  }.  r
d960: 65 74 75 72 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a  eturn zText;.}..
d970: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
d980: 6d 75 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61  multi-byte chara
d990: 63 74 65 72 20 73 74 72 69 6e 67 20 74 6f 20 55  cter string to U
d9a0: 54 46 2d 38 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  TF-8..**.** Spac
d9b0: 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65  e to hold the re
d9c0: 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69 73  turned string is
d9d0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
d9e0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
d9f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
da00: 2a 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 63  *winMbcsToUtf8(c
da10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74  onst char *zText
da20: 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a  , int useAnsi){.
da30: 20 20 63 68 61 72 20 2a 7a 54 65 78 74 55 74 66    char *zTextUtf
da40: 38 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d 70  8;.  LPWSTR zTmp
da50: 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64  Wide;..  zTmpWid
da60: 65 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55 6e 69  e = winMbcsToUni
da70: 63 6f 64 65 28 7a 54 65 78 74 2c 20 75 73 65 41  code(zText, useA
da80: 6e 73 69 29 3b 0a 20 20 69 66 28 20 7a 54 6d 70  nsi);.  if( zTmp
da90: 57 69 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Wide==0 ){.    r
daa0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a  eturn 0;.  }.  z
dab0: 54 65 78 74 55 74 66 38 20 3d 20 77 69 6e 55 6e  TextUtf8 = winUn
dac0: 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54 6d 70  icodeToUtf8(zTmp
dad0: 57 69 64 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Wide);.  sqlite3
dae0: 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29 3b  _free(zTmpWide);
daf0: 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74 55  .  return zTextU
db00: 74 66 38 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  tf8;.}../*.** Co
db10: 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20 73 74  nvert a UTF-8 st
db20: 72 69 6e 67 20 74 6f 20 61 20 6d 75 6c 74 69 2d  ring to a multi-
db30: 62 79 74 65 20 63 68 61 72 61 63 74 65 72 20 73  byte character s
db40: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 53 70 61  tring..**.** Spa
db50: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
db60: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
db70: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
db80: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
db90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
dba0: 20 2a 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28   *winUtf8ToMbcs(
dbb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
dbc0: 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29 7b  t, int useAnsi){
dbd0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 4d 62  .  char *zTextMb
dbe0: 63 73 3b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6d  cs;.  LPWSTR zTm
dbf0: 70 57 69 64 65 3b 0a 0a 20 20 7a 54 6d 70 57 69  pWide;..  zTmpWi
dc00: 64 65 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  de = winUtf8ToUn
dc10: 69 63 6f 64 65 28 7a 54 65 78 74 29 3b 0a 20 20  icode(zText);.  
dc20: 69 66 28 20 7a 54 6d 70 57 69 64 65 3d 3d 30 20  if( zTmpWide==0 
dc30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
dc40: 0a 20 20 7d 0a 20 20 7a 54 65 78 74 4d 62 63 73  .  }.  zTextMbcs
dc50: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d   = winUnicodeToM
dc60: 62 63 73 28 7a 54 6d 70 57 69 64 65 2c 20 75 73  bcs(zTmpWide, us
dc70: 65 41 6e 73 69 29 3b 0a 20 20 73 71 6c 69 74 65  eAnsi);.  sqlite
dc80: 33 5f 66 72 65 65 28 7a 54 6d 70 57 69 64 65 29  3_free(zTmpWide)
dc90: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 54 65 78 74  ;.  return zText
dca0: 4d 62 63 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Mbcs;.}../*.** T
dcb0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
dcc0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
dcd0: 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65  winUtf8ToUnicode
dce0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
dcf0: 4c 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f 77  LPWSTR sqlite3_w
dd00: 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69  in32_utf8_to_uni
dd10: 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72 20  code(const char 
dd20: 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20  *zText){.#ifdef 
dd30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
dd40: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a  I_ARMOR.  if( !z
dd50: 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69  Text ){.    (voi
dd60: 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  d)SQLITE_MISUSE_
dd70: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
dd80: 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
dd90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
dda0: 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66  IT_AUTOINIT.  if
ddb0: 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61  ( sqlite3_initia
ddc0: 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20  lize() ) return 
ddd0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  0;.#endif.  retu
dde0: 72 6e 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63  rn winUtf8ToUnic
ddf0: 6f 64 65 28 7a 54 65 78 74 29 3b 0a 7d 0a 0a 2f  ode(zText);.}../
de00: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
de10: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
de20: 72 20 74 68 65 20 77 69 6e 55 6e 69 63 6f 64 65  r the winUnicode
de30: 54 6f 55 74 66 38 28 29 20 66 75 6e 63 74 69 6f  ToUtf8() functio
de40: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
de50: 74 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64  te3_win32_unicod
de60: 65 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54  e_to_utf8(LPCWST
de70: 52 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 23 69  R zWideText){.#i
de80: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
de90: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
dea0: 66 28 20 21 7a 57 69 64 65 54 65 78 74 20 29 7b  f( !zWideText ){
deb0: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
dec0: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
ded0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dee0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
def0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
df00: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
df10: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
df20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
df30: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 55  if.  return winU
df40: 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 57 69  nicodeToUtf8(zWi
df50: 64 65 54 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  deText);.}../*.*
df60: 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c  * This is a publ
df70: 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74  ic wrapper for t
df80: 68 65 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38  he winMbcsToUtf8
df90: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
dfa0: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
dfb0: 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38  n32_mbcs_to_utf8
dfc0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
dfd0: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
dfe0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dff0: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
e000: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
e010: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
e020: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
e030: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
e040: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
e050: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
e060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
e070: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
e080: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
e090: 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65  inMbcsToUtf8(zTe
e0a0: 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  xt, osAreFileApi
e0b0: 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a  sANSI());.}../*.
e0c0: 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75 62  ** This is a pub
e0d0: 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72 20  lic wrapper for 
e0e0: 74 68 65 20 77 69 6e 4d 62 63 73 54 6f 55 74 66  the winMbcsToUtf
e0f0: 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  8() function..*/
e100: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77  .char *sqlite3_w
e110: 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75 74 66  in32_mbcs_to_utf
e120: 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72 20  8_v2(const char 
e130: 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41  *zText, int useA
e140: 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  nsi){.#ifdef SQL
e150: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
e160: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78  RMOR.  if( !zTex
e170: 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  t ){.    (void)S
e180: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e190: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e1a0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e  .  }.#endif.#ifn
e1b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e1c0: 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73  AUTOINIT.  if( s
e1d0: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
e1e0: 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  e() ) return 0;.
e1f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
e200: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54  winMbcsToUtf8(zT
e210: 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b 0a 7d  ext, useAnsi);.}
e220: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e230: 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65 72  a public wrapper
e240: 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66 38   for the winUtf8
e250: 54 6f 4d 62 63 73 28 29 20 66 75 6e 63 74 69 6f  ToMbcs() functio
e260: 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69  n..*/.char *sqli
e270: 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
e280: 6f 5f 6d 62 63 73 28 63 6f 6e 73 74 20 63 68 61  o_mbcs(const cha
e290: 72 20 2a 7a 54 65 78 74 29 7b 0a 23 69 66 64 65  r *zText){.#ifde
e2a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e2b0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
e2c0: 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28 76  !zText ){.    (v
e2d0: 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
e2e0: 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
e2f0: 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  rn 0;.  }.#endif
e300: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e310: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e320: 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  if( sqlite3_init
e330: 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75 72  ialize() ) retur
e340: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  n 0;.#endif.  re
e350: 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 4d 62  turn winUtf8ToMb
e360: 63 73 28 7a 54 65 78 74 2c 20 6f 73 41 72 65 46  cs(zText, osAreF
e370: 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a  ileApisANSI());.
e380: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e390: 20 61 20 70 75 62 6c 69 63 20 77 72 61 70 70 65   a public wrappe
e3a0: 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55 74 66  r for the winUtf
e3b0: 38 54 6f 4d 62 63 73 28 29 20 66 75 6e 63 74 69  8ToMbcs() functi
e3c0: 6f 6e 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c  on..*/.char *sql
e3d0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
e3e0: 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74  to_mbcs_v2(const
e3f0: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
e400: 74 20 75 73 65 41 6e 73 69 29 7b 0a 23 69 66 64  t useAnsi){.#ifd
e410: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e420: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e430: 20 21 7a 54 65 78 74 20 29 7b 0a 20 20 20 20 28   !zText ){.    (
e440: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
e450: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
e460: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
e470: 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
e480: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
e490: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 6e 69   if( sqlite3_ini
e4a0: 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65 74 75  tialize() ) retu
e4b0: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rn 0;.#endif.  r
e4c0: 65 74 75 72 6e 20 77 69 6e 55 74 66 38 54 6f 4d  eturn winUtf8ToM
e4d0: 62 63 73 28 7a 54 65 78 74 2c 20 75 73 65 41 6e  bcs(zText, useAn
e4e0: 73 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  si);.}../*.** Th
e4f0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
e500: 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
e510: 6f 72 79 20 6f 72 20 74 68 65 20 74 65 6d 70 6f  ory or the tempo
e520: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20 62  rary directory b
e530: 61 73 65 64 20 6f 6e 0a 2a 2a 20 74 68 65 20 70  ased on.** the p
e540: 72 6f 76 69 64 65 64 20 61 72 67 75 6d 65 6e 74  rovided argument
e550: 73 2e 20 20 54 68 65 20 74 79 70 65 20 61 72 67  s.  The type arg
e560: 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 31 20  ument must be 1 
e570: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 74 20  in order to set 
e580: 74 68 65 0a 2a 2a 20 64 61 74 61 20 64 69 72 65  the.** data dire
e590: 63 74 6f 72 79 20 6f 72 20 32 20 69 6e 20 6f 72  ctory or 2 in or
e5a0: 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 20 74  der to set the t
e5b0: 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63 74 6f  emporary directo
e5c0: 72 79 2e 20 20 54 68 65 20 7a 56 61 6c 75 65 0a  ry.  The zValue.
e5d0: 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ** argument is t
e5e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
e5f0: 69 72 65 63 74 6f 72 79 20 74 6f 20 75 73 65 2e  irectory to use.
e600: 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
e610: 75 65 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 53 51  ue will be.** SQ
e620: 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
e630: 73 73 66 75 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssful..*/.int sq
e640: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 65 74 5f  lite3_win32_set_
e650: 64 69 72 65 63 74 6f 72 79 28 44 57 4f 52 44 20  directory(DWORD 
e660: 74 79 70 65 2c 20 4c 50 43 57 53 54 52 20 7a 56  type, LPCWSTR zV
e670: 61 6c 75 65 29 7b 0a 20 20 63 68 61 72 20 2a 2a  alue){.  char **
e680: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  ppDirectory = 0;
e690: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e6a0: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20  OMIT_AUTOINIT.  
e6b0: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
e6c0: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
e6d0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
e6e0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66   rc;.#endif.  if
e6f0: 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  ( type==SQLITE_W
e700: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
e710: 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20 20  ORY_TYPE ){.    
e720: 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26 73  ppDirectory = &s
e730: 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65  qlite3_data_dire
e740: 63 74 6f 72 79 3b 0a 20 20 7d 65 6c 73 65 20 69  ctory;.  }else i
e750: 66 28 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f  f( type==SQLITE_
e760: 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49 52 45 43  WIN32_TEMP_DIREC
e770: 54 4f 52 59 5f 54 59 50 45 20 29 7b 0a 20 20 20  TORY_TYPE ){.   
e780: 20 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20 26   ppDirectory = &
e790: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
e7a0: 65 63 74 6f 72 79 3b 0a 20 20 7d 0a 20 20 61 73  ectory;.  }.  as
e7b0: 73 65 72 74 28 20 21 70 70 44 69 72 65 63 74 6f  sert( !ppDirecto
e7c0: 72 79 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49  ry || type==SQLI
e7d0: 54 45 5f 57 49 4e 33 32 5f 44 41 54 41 5f 44 49  TE_WIN32_DATA_DI
e7e0: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 20  RECTORY_TYPE.   
e7f0: 20 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d         || type==
e800: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 54 45 4d  SQLITE_WIN32_TEM
e810: 50 5f 44 49 52 45 43 54 4f 52 59 5f 54 59 50 45  P_DIRECTORY_TYPE
e820: 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  .  );.  assert( 
e830: 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c 7c 20  !ppDirectory || 
e840: 73 71 6c 69 74 65 33 4d 65 6d 64 65 62 75 67 48  sqlite3MemdebugH
e850: 61 73 54 79 70 65 28 2a 70 70 44 69 72 65 63 74  asType(*ppDirect
e860: 6f 72 79 2c 20 4d 45 4d 54 59 50 45 5f 48 45 41  ory, MEMTYPE_HEA
e870: 50 29 20 29 3b 0a 20 20 69 66 28 20 70 70 44 69  P) );.  if( ppDi
e880: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 63  rectory ){.    c
e890: 68 61 72 20 2a 7a 56 61 6c 75 65 55 74 66 38 20  har *zValueUtf8 
e8a0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 56 61  = 0;.    if( zVa
e8b0: 6c 75 65 20 26 26 20 7a 56 61 6c 75 65 5b 30 5d  lue && zValue[0]
e8c0: 20 29 7b 0a 20 20 20 20 20 20 7a 56 61 6c 75 65   ){.      zValue
e8d0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
e8e0: 65 54 6f 55 74 66 38 28 7a 56 61 6c 75 65 29 3b  eToUtf8(zValue);
e8f0: 0a 20 20 20 20 20 20 69 66 20 28 20 7a 56 61 6c  .      if ( zVal
e900: 75 65 55 74 66 38 3d 3d 30 20 29 7b 0a 20 20 20  ueUtf8==0 ){.   
e910: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
e920: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
e930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
e940: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 70   sqlite3_free(*p
e950: 70 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  pDirectory);.   
e960: 20 2a 70 70 44 69 72 65 63 74 6f 72 79 20 3d 20   *ppDirectory = 
e970: 7a 56 61 6c 75 65 55 74 66 38 3b 0a 20 20 20 20  zValueUtf8;.    
e980: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e990: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
e9a0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  QLITE_ERROR;.}..
e9b0: 2f 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  /*.** The return
e9c0: 20 76 61 6c 75 65 20 6f 66 20 77 69 6e 47 65 74   value of winGet
e9d0: 4c 61 73 74 45 72 72 6f 72 4d 73 67 0a 2a 2a 20  LastErrorMsg.** 
e9e0: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
e9f0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
ea00: 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
ea10: 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
ea20: 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
ea30: 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
ea40: 75 6e 63 61 74 65 64 29 2e 0a 2a 2f 0a 73 74 61  uncated)..*/.sta
ea50: 74 69 63 20 69 6e 74 20 77 69 6e 47 65 74 4c 61  tic int winGetLa
ea60: 73 74 45 72 72 6f 72 4d 73 67 28 44 57 4f 52 44  stErrorMsg(DWORD
ea70: 20 6c 61 73 74 45 72 72 6e 6f 2c 20 69 6e 74 20   lastErrno, int 
ea80: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
ea90: 29 7b 0a 20 20 2f 2a 20 46 6f 72 6d 61 74 4d 65  ){.  /* FormatMe
eaa0: 73 73 61 67 65 20 72 65 74 75 72 6e 73 20 30 20  ssage returns 0 
eab0: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 4f 74 68  on failure.  Oth
eac0: 65 72 77 69 73 65 20 69 74 0a 20 20 2a 2a 20 72  erwise it.  ** r
ead0: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
eae0: 72 20 6f 66 20 54 43 48 41 52 73 20 77 72 69 74  r of TCHARs writ
eaf0: 74 65 6e 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ten to the outpu
eb00: 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 65  t.  ** buffer, e
eb10: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 72  xcluding the ter
eb20: 6d 69 6e 61 74 69 6e 67 20 6e 75 6c 6c 20 63 68  minating null ch
eb30: 61 72 2e 0a 20 20 2a 2f 0a 20 20 44 57 4f 52 44  ar..  */.  DWORD
eb40: 20 64 77 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68   dwLen = 0;.  ch
eb50: 61 72 20 2a 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20  ar *zOut = 0;.. 
eb60: 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
eb70: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
eb80: 49 4e 52 54 0a 20 20 20 20 57 43 48 41 52 20 7a  INRT.    WCHAR z
eb90: 54 65 6d 70 57 69 64 65 5b 53 51 4c 49 54 45 5f  TempWide[SQLITE_
eba0: 57 49 4e 33 32 5f 4d 41 58 5f 45 52 52 4d 53 47  WIN32_MAX_ERRMSG
ebb0: 5f 43 48 41 52 53 2b 31 5d 3b 0a 20 20 20 20 64  _CHARS+1];.    d
ebc0: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
ebd0: 65 73 73 61 67 65 57 28 46 4f 52 4d 41 54 5f 4d  essageW(FORMAT_M
ebe0: 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54  ESSAGE_FROM_SYST
ebf0: 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EM |.           
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec10: 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45    FORMAT_MESSAGE
ec20: 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c  _IGNORE_INSERTS,
ec30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55                NU
ec50: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20   lastErrno,.    
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20           0,.    
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecb0: 20 20 20 20 20 20 20 20 20 7a 54 65 6d 70 57 69           zTempWi
ecc0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ece0: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41   SQLITE_WIN32_MA
ecf0: 58 5f 45 52 52 4d 53 47 5f 43 48 41 52 53 2c 0a  X_ERRMSG_CHARS,.
ed00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29 3b               0);
ed20: 0a 23 65 6c 73 65 0a 20 20 20 20 4c 50 57 53 54  .#else.    LPWST
ed30: 52 20 7a 54 65 6d 70 57 69 64 65 20 3d 20 4e 55  R zTempWide = NU
ed40: 4c 4c 3b 0a 20 20 20 20 64 77 4c 65 6e 20 3d 20  LL;.    dwLen = 
ed50: 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 57  osFormatMessageW
ed60: 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f  (FORMAT_MESSAGE_
ed70: 41 4c 4c 4f 43 41 54 45 5f 42 55 46 46 45 52 20  ALLOCATE_BUFFER 
ed80: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46                 F
eda0: 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 46 52  ORMAT_MESSAGE_FR
edb0: 4f 4d 5f 53 59 53 54 45 4d 20 7c 0a 20 20 20 20  OM_SYSTEM |.    
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54 5f           FORMAT_
ede0: 4d 45 53 53 41 47 45 5f 49 47 4e 4f 52 45 5f 49  MESSAGE_IGNORE_I
edf0: 4e 53 45 52 54 53 2c 0a 20 20 20 20 20 20 20 20  NSERTS,.        
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee30: 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
ee40: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee80: 28 4c 50 57 53 54 52 29 20 26 7a 54 65 6d 70 57  (LPWSTR) &zTempW
ee90: 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20    0,.           
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20    0);.#endif.   
eee0: 20 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29   if( dwLen > 0 )
eef0: 7b 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  {.      /* alloc
ef00: 61 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64  ate a buffer and
ef10: 20 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38   convert to UTF8
ef20: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
ef30: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
ef40: 6f 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74  oc();.      zOut
ef50: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
ef60: 74 66 38 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a  tf8(zTempWide);.
ef70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64        sqlite3End
ef80: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
ef90: 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57  #if !SQLITE_OS_W
efa0: 49 4e 52 54 0a 20 20 20 20 20 20 2f 2a 20 66 72  INRT.      /* fr
efb0: 65 65 20 74 68 65 20 73 79 73 74 65 6d 20 62 75  ee the system bu
efc0: 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 62  ffer allocated b
efd0: 79 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65 20  y FormatMessage 
efe0: 2a 2f 0a 20 20 20 20 20 20 6f 73 4c 6f 63 61 6c  */.      osLocal
eff0: 46 72 65 65 28 7a 54 65 6d 70 57 69 64 65 29 3b  Free(zTempWide);
f000: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
f010: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
f020: 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
f030: 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
f040: 2a 7a 54 65 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20  *zTemp = NULL;. 
f050: 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f 72     dwLen = osFor
f060: 6d 61 74 4d 65 73 73 61 67 65 41 28 46 4f 52 4d  matMessageA(FORM
f070: 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f 43  AT_MESSAGE_ALLOC
f080: 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20 20  ATE_BUFFER |.   
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 20 20 20 20 20 20 20 20 20 20 46 4f 52 4d 41 54            FORMAT
f0b0: 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53 59  _MESSAGE_FROM_SY
f0c0: 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  STEM |.         
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53 41      FORMAT_MESSA
f0f0: 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52 54  GE_IGNORE_INSERT
f100: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f120: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f140: 20 20 20 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20     lastErrno,.  
f150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f160: 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20 20             0,.  
f170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f180: 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 53 54             (LPST
f190: 52 29 20 26 7a 54 65 6d 70 2c 0a 20 20 20 20 20  R) &zTemp,.     
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20          0,.     
f1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1d0: 20 20 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20          0);.    
f1e0: 69 66 28 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b  if( dwLen > 0 ){
f1f0: 0a 20 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  .      /* alloca
f200: 74 65 20 61 20 62 75 66 66 65 72 20 61 6e 64 20  te a buffer and 
f210: 63 6f 6e 76 65 72 74 20 74 6f 20 55 54 46 38 20  convert to UTF8 
f220: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
f230: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
f240: 63 28 29 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20  c();.      zOut 
f250: 3d 20 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28  = winMbcsToUtf8(
f260: 7a 54 65 6d 70 2c 20 6f 73 41 72 65 46 69 6c 65  zTemp, osAreFile
f270: 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20  ApisANSI());.   
f280: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
f290: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
f2a0: 20 20 20 2f 2a 20 66 72 65 65 20 74 68 65 20 73     /* free the s
f2b0: 79 73 74 65 6d 20 62 75 66 66 65 72 20 61 6c 6c  ystem buffer all
f2c0: 6f 63 61 74 65 64 20 62 79 20 46 6f 72 6d 61 74  ocated by Format
f2d0: 4d 65 73 73 61 67 65 20 2a 2f 0a 20 20 20 20 20  Message */.     
f2e0: 20 6f 73 4c 6f 63 61 6c 46 72 65 65 28 7a 54 65   osLocalFree(zTe
f2f0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  mp);.    }.  }.#
f300: 65 6e 64 69 66 0a 20 20 69 66 28 20 30 20 3d 3d  endif.  if( 0 ==
f310: 20 64 77 4c 65 6e 20 29 7b 0a 20 20 20 20 73 71   dwLen ){.    sq
f320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
f330: 42 75 66 2c 20 7a 42 75 66 2c 20 22 4f 73 45 72  Buf, zBuf, "OsEr
f340: 72 6f 72 20 30 78 25 6c 78 20 28 25 6c 75 29 22  ror 0x%lx (%lu)"
f350: 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20 6c 61 73  , lastErrno, las
f360: 74 45 72 72 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  tErrno);.  }else
f370: 7b 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 61 20  {.    /* copy a 
f380: 6d 61 78 69 6d 75 6d 20 6f 66 20 6e 42 75 66 20  maximum of nBuf 
f390: 63 68 61 72 73 20 74 6f 20 6f 75 74 70 75 74 20  chars to output 
f3a0: 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 73 71  buffer */.    sq
f3b0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
f3c0: 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Buf, zBuf, "%s",
f3d0: 20 7a 4f 75 74 29 3b 0a 20 20 20 20 2f 2a 20 66   zOut);.    /* f
f3e0: 72 65 65 20 74 68 65 20 55 54 46 38 20 62 75 66  ree the UTF8 buf
f3f0: 66 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  fer */.    sqlit
f400: 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
f410: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
f420: 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ../*.**.** This 
f430: 66 75 6e 63 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f  function - winLo
f440: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 20 2d  gErrorAtLine() -
f450: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61   is only ever ca
f460: 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63  lled via the mac
f470: 72 6f 0a 2a 2a 20 77 69 6e 4c 6f 67 45 72 72 6f  ro.** winLogErro
f480: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  r()..**.** This 
f490: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
f4a0: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
f4b0: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
f4c0: 53 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  S function..** I
f4d0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
f4e0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
f4f0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
f500: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
f510: 65 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  e of.** error co
f520: 64 65 20 61 6e 64 2c 20 69 66 20 70 6f 73 73 69  de and, if possi
f530: 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d 72  ble, the human-r
f540: 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c 65  eadable equivale
f550: 6e 74 20 66 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61  nt from.** Forma
f560: 74 4d 65 73 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  tMessage..**.** 
f570: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
f580: 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  nt passed to the
f590: 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65   macro should be
f5a0: 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
f5b0: 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  that.** will be 
f5c0: 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
f5d0: 74 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f  te (e.g. SQLITE_
f5e0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51  IOERR_DELETE, SQ
f5f0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a  LITE_CANTOPEN)..
f600: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
f610: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
f620: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
f630: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
f640: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
f650: 69 6c 65 64 20 61 6e 64 20 74 68 65 20 61 73 73  iled and the ass
f660: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
f670: 74 65 6d 20 70 61 74 68 2c 20 69 66 20 61 6e 79  tem path, if any
f680: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e  ..*/.#define win
f690: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 2c 64  LogError(a,b,c,d
f6a0: 29 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41  )   winLogErrorA
f6b0: 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f  tLine(a,b,c,d,__
f6c0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
f6d0: 6e 74 20 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74  nt winLogErrorAt
f6e0: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
f6f0: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
f700: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
f710: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
f720: 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
f730: 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
f740: 20 20 2f 2a 20 57 69 6e 33 32 20 6c 61 73 74 20    /* Win32 last 
f750: 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  error */.  const
f760: 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20 20 20   char *zFunc,   
f770: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
f780: 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74 69 6f  me of OS functio
f790: 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20 2a 2f  n that failed */
f7a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f7b0: 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
f7c0: 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74 68 20     /* File path 
f7d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f7e0: 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  error */.  int i
f7f0: 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20 20 20  Line            
f800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
f810: 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  urce line number
f820: 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f 63 63   where error occ
f830: 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 68  urred */.){.  ch
f840: 61 72 20 7a 4d 73 67 5b 35 30 30 5d 3b 20 20 20  ar zMsg[500];   
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f860: 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
f870: 65 72 72 6f 72 20 74 65 78 74 20 2a 2f 0a 20 20  error text */.  
f880: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
f8b0: 2a 2f 0a 0a 20 20 7a 4d 73 67 5b 30 5d 20 3d 20  */..  zMsg[0] = 
f8c0: 30 3b 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45  0;.  winGetLastE
f8d0: 72 72 6f 72 4d 73 67 28 6c 61 73 74 45 72 72 6e  rrorMsg(lastErrn
f8e0: 6f 2c 20 73 69 7a 65 6f 66 28 7a 4d 73 67 29 2c  o, sizeof(zMsg),
f8f0: 20 7a 4d 73 67 29 3b 0a 20 20 61 73 73 65 72 74   zMsg);.  assert
f900: 28 20 65 72 72 63 6f 64 65 21 3d 53 51 4c 49 54  ( errcode!=SQLIT
f910: 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28 20 7a 50  E_OK );.  if( zP
f920: 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d  ath==0 ) zPath =
f930: 20 22 22 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   "";.  for(i=0; 
f940: 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b  zMsg[i] && zMsg[
f950: 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4d 73 67  i]!='\r' && zMsg
f960: 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b  [i]!='\n'; i++){
f970: 7d 0a 20 20 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b  }.  zMsg[i] = 0;
f980: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
f990: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
f9a0: 73 5f 77 69 6e 2e 63 3a 25 64 3a 20 28 25 6c 75  s_win.c:%d: (%lu
f9b0: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
f9c0: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 6c 61 73        iLine, las
f9d0: 74 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a  tErrno, zFunc, z
f9e0: 50 61 74 68 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a  Path, zMsg.  );.
f9f0: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64  .  return errcod
fa00: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  e;.}../*.** The 
fa10: 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
fa20: 74 68 61 74 20 61 20 52 65 61 64 46 69 6c 65 28  that a ReadFile(
fa30: 29 2c 20 57 72 69 74 65 46 69 6c 65 28 29 2c 20  ), WriteFile(), 
fa40: 61 6e 64 20 44 65 6c 65 74 65 46 69 6c 65 28 29  and DeleteFile()
fa50: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 72  .** will be retr
fa60: 69 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20  ied following a 
fa70: 6c 6f 63 6b 69 6e 67 20 65 72 72 6f 72 20 2d 20  locking error - 
fa80: 70 72 6f 62 61 62 6c 79 20 63 61 75 73 65 64 20  probably caused 
fa90: 62 79 0a 2a 2a 20 61 6e 74 69 76 69 72 75 73 20  by.** antivirus 
faa0: 73 6f 66 74 77 61 72 65 2e 20 20 41 6c 73 6f 20  software.  Also 
fab0: 74 68 65 20 69 6e 69 74 69 61 6c 20 64 65 6c 61  the initial dela
fac0: 79 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  y before the fir
fad0: 73 74 20 72 65 74 72 79 2e 0a 2a 2a 20 54 68 65  st retry..** The
fae0: 20 64 65 6c 61 79 20 69 6e 63 72 65 61 73 65 73   delay increases
faf0: 20 6c 69 6e 65 61 72 6c 79 20 77 69 74 68 20 65   linearly with e
fb00: 61 63 68 20 72 65 74 72 79 2e 0a 2a 2f 0a 23 69  ach retry..*/.#i
fb10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  fndef SQLITE_WIN
fb20: 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 0a 23  32_IOERR_RETRY.#
fb30: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57   define SQLITE_W
fb40: 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59  IN32_IOERR_RETRY
fb50: 20 31 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64   10.#endif.#ifnd
fb60: 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
fb70: 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45 4c 41  IOERR_RETRY_DELA
fb80: 59 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  Y.# define SQLIT
fb90: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
fba0: 54 52 59 5f 44 45 4c 41 59 20 32 35 0a 23 65 6e  TRY_DELAY 25.#en
fbb0: 64 69 66 0a 73 74 61 74 69 63 20 69 6e 74 20 77  dif.static int w
fbc0: 69 6e 49 6f 65 72 72 52 65 74 72 79 20 3d 20 53  inIoerrRetry = S
fbd0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fbe0: 52 5f 52 45 54 52 59 3b 0a 73 74 61 74 69 63 20  R_RETRY;.static 
fbf0: 69 6e 74 20 77 69 6e 49 6f 65 72 72 52 65 74 72  int winIoerrRetr
fc00: 79 44 65 6c 61 79 20 3d 20 53 51 4c 49 54 45 5f  yDelay = SQLITE_
fc10: 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52  WIN32_IOERR_RETR
fc20: 59 5f 44 45 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20  Y_DELAY;../*.** 
fc30: 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61 6e  The "winIoerrCan
fc40: 52 65 74 72 79 31 22 20 6d 61 63 72 6f 20 69 73  Retry1" macro is
fc50: 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69   used to determi
fc60: 6e 65 20 69 66 20 61 20 70 61 72 74 69 63 75 6c  ne if a particul
fc70: 61 72 20 49 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20  ar I/O.** error 
fc80: 63 6f 64 65 20 6f 62 74 61 69 6e 65 64 20 76 69  code obtained vi
fc90: 61 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  a GetLastError()
fca0: 20 69 73 20 65 6c 69 67 69 62 6c 65 20 74 6f 20   is eligible to 
fcb0: 62 65 20 72 65 74 72 69 65 64 2e 20 20 49 74 0a  be retried.  It.
fcc0: 2a 2a 20 6d 75 73 74 20 61 63 63 65 70 74 20 74  ** must accept t
fcd0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 44 57  he error code DW
fce0: 4f 52 44 20 61 73 20 69 74 73 20 6f 6e 6c 79 20  ORD as its only 
fcf0: 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 68 6f  argument and sho
fd00: 75 6c 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  uld return.** no
fd10: 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 65 72  n-zero if the er
fd20: 72 6f 72 20 63 6f 64 65 20 69 73 20 74 72 61 6e  ror code is tran
fd30: 73 69 65 6e 74 20 69 6e 20 6e 61 74 75 72 65 20  sient in nature 
fd40: 61 6e 64 20 74 68 65 20 6f 70 65 72 61 74 69 6f  and the operatio
fd50: 6e 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65  n.** responsible
fd60: 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20   for generating 
fd70: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 72 72  the original err
fd80: 6f 72 20 6d 69 67 68 74 20 73 75 63 63 65 65 64  or might succeed
fd90: 20 75 70 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72   upon being.** r
fda0: 65 74 72 69 65 64 2e 20 20 54 68 65 20 61 72 67  etried.  The arg
fdb0: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6d 61  ument to this ma
fdc0: 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 61 20  cro should be a 
fdd0: 76 61 72 69 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  variable..**.** 
fde0: 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 20  Additionally, a 
fdf0: 6d 61 63 72 6f 20 6e 61 6d 65 64 20 22 77 69 6e  macro named "win
fe00: 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 22 20  IoerrCanRetry2" 
fe10: 6d 61 79 20 62 65 20 64 65 66 69 6e 65 64 2e 20  may be defined. 
fe20: 20 49 66 20 69 74 0a 2a 2a 20 69 73 20 64 65 66   If it.** is def
fe30: 69 6e 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65  ined, it will be
fe40: 20 63 6f 6e 73 75 6c 74 65 64 20 6f 6e 6c 79 20   consulted only 
fe50: 77 68 65 6e 20 74 68 65 20 6d 61 63 72 6f 20 22  when the macro "
fe60: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
fe70: 31 22 0a 2a 2a 20 72 65 74 75 72 6e 73 20 7a 65  1".** returns ze
fe80: 72 6f 2e 20 20 54 68 65 20 22 77 69 6e 49 6f 65  ro.  The "winIoe
fe90: 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 63  rrCanRetry2" mac
fea0: 72 6f 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79  ro is completely
feb0: 20 6f 70 74 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a   optional and.**
fec0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
fed0: 69 6e 63 6c 75 64 65 20 61 64 64 69 74 69 6f 6e  include addition
fee0: 61 6c 20 65 72 72 6f 72 20 63 6f 64 65 73 20 69  al error codes i
fef0: 6e 20 74 68 65 20 73 65 74 20 74 68 61 74 20 73  n the set that s
ff00: 68 6f 75 6c 64 0a 2a 2a 20 72 65 73 75 6c 74 20  hould.** result 
ff10: 69 6e 20 74 68 65 20 66 61 69 6c 69 6e 67 20 49  in the failing I
ff20: 2f 4f 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 69  /O operation bei
ff30: 6e 67 20 72 65 74 72 69 65 64 20 62 79 20 74 68  ng retried by th
ff40: 65 20 63 61 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a  e caller.  If.**
ff50: 20 64 65 66 69 6e 65 64 2c 20 74 68 65 20 22 77   defined, the "w
ff60: 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
ff70: 22 20 6d 61 63 72 6f 20 6d 75 73 74 20 65 78 68  " macro must exh
ff80: 69 62 69 74 20 65 78 74 65 72 6e 61 6c 20 73 65  ibit external se
ff90: 6d 61 6e 74 69 63 73 0a 2a 2a 20 69 64 65 6e 74  mantics.** ident
ffa0: 69 63 61 6c 20 74 6f 20 74 68 6f 73 65 20 6f 66  ical to those of
ffb0: 20 74 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   the "winIoerrCa
ffc0: 6e 52 65 74 72 79 31 22 20 6d 61 63 72 6f 2e 0a  nRetry1" macro..
ffd0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
ffe0: 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79  winIoerrCanRetry
fff0: 31 29 0a 23 64 65 66 69 6e 65 20 77 69 6e 49 6f  1).#define winIo
10000 65 72 72 43 61 6e 52 65 74 72 79 31 28 61 29 20  errCanRetry1(a) 
10010 28 28 28 61 29 3d 3d 45 52 52 4f 52 5f 41 43 43  (((a)==ERROR_ACC
10020 45 53 53 5f 44 45 4e 49 45 44 29 20 20 20 20 20  ESS_DENIED)     
10030 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20     || \.        
10040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10050 20 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10060 52 5f 53 48 41 52 49 4e 47 5f 56 49 4f 4c 41 54  R_SHARING_VIOLAT
10070 49 4f 4e 29 20 20 20 20 7c 7c 20 5c 0a 20 20 20  ION)    || \.   
10080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10090 20 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d             ((a)=
100a0 3d 45 52 52 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c  =ERROR_LOCK_VIOL
100b0 41 54 49 4f 4e 29 20 20 20 20 20 20 20 7c 7c 20  ATION)       || 
100c0 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
100d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100e0 28 28 61 29 3d 3d 45 52 52 4f 52 5f 44 45 56 5f  ((a)==ERROR_DEV_
100f0 4e 4f 54 5f 45 58 49 53 54 29 20 20 20 20 20 20  NOT_EXIST)      
10100 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20 20    || \.         
10110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10120 20 20 20 20 20 28 28 61 29 3d 3d 45 52 52 4f 52       ((a)==ERROR
10130 5f 4e 45 54 4e 41 4d 45 5f 44 45 4c 45 54 45 44  _NETNAME_DELETED
10140 29 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20  )      || \.    
10150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10160 20 20 20 20 20 20 20 20 20 20 28 28 61 29 3d 3d            ((a)==
10170 45 52 52 4f 52 5f 53 45 4d 5f 54 49 4d 45 4f 55  ERROR_SEM_TIMEOU
10180 54 29 20 20 20 20 20 20 20 20 20 20 7c 7c 20 5c  T)          || \
10190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
101a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
101b0 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54 57 4f  (a)==ERROR_NETWO
101c0 52 4b 5f 55 4e 52 45 41 43 48 41 42 4c 45 29 29  RK_UNREACHABLE))
101d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
101e0 66 20 61 20 52 65 61 64 46 69 6c 65 28 29 20 6f  f a ReadFile() o
101f0 72 20 57 72 69 74 65 46 69 6c 65 28 29 20 65 72  r WriteFile() er
10200 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 76 6f  ror occurs, invo
10210 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
10220 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ** to see if it 
10230 73 68 6f 75 6c 64 20 62 65 20 72 65 74 72 69 65  should be retrie
10240 64 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  d.  Return TRUE 
10250 74 6f 20 72 65 74 72 79 2e 20 20 52 65 74 75 72  to retry.  Retur
10260 6e 20 46 41 4c 53 45 0a 2a 2a 20 74 6f 20 67 69  n FALSE.** to gi
10270 76 65 20 75 70 20 77 69 74 68 20 61 6e 20 65 72  ve up with an er
10280 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ror..*/.static i
10290 6e 74 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72  nt winRetryIoerr
102a0 28 69 6e 74 20 2a 70 6e 52 65 74 72 79 2c 20 44  (int *pnRetry, D
102b0 57 4f 52 44 20 2a 70 45 72 72 6f 72 29 7b 0a 20  WORD *pError){. 
102c0 20 44 57 4f 52 44 20 65 20 3d 20 6f 73 47 65 74   DWORD e = osGet
102d0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
102e0 66 28 20 2a 70 6e 52 65 74 72 79 3e 3d 77 69 6e  f( *pnRetry>=win
102f0 49 6f 65 72 72 52 65 74 72 79 20 29 7b 0a 20 20  IoerrRetry ){.  
10300 20 20 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a    if( pError ){.
10310 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
10320 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  e;.    }.    ret
10330 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
10340 20 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72   winIoerrCanRetr
10350 79 31 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  y1(e) ){.    sql
10360 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70  ite3_win32_sleep
10370 28 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65  (winIoerrRetryDe
10380 6c 61 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29  lay*(1+*pnRetry)
10390 29 3b 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72  );.    ++*pnRetr
103a0 79 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  y;.    return 1;
103b0 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
103c0 28 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  (winIoerrCanRetr
103d0 79 32 29 0a 20 20 65 6c 73 65 20 69 66 28 20 77  y2).  else if( w
103e0 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32  inIoerrCanRetry2
103f0 28 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (e) ){.    sqlit
10400 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77  e3_win32_sleep(w
10410 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
10420 79 2a 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b  y*(1+*pnRetry));
10430 0a 20 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b  .    ++*pnRetry;
10440 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
10450 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
10460 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 2a 70  pError ){.    *p
10470 45 72 72 6f 72 20 3d 20 65 3b 0a 20 20 7d 0a 20  Error = e;.  }. 
10480 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
10490 0a 2a 2a 20 4c 6f 67 20 61 20 49 2f 4f 20 65 72  .** Log a I/O er
104a0 72 6f 72 20 72 65 74 72 79 20 65 70 69 73 6f 64  ror retry episod
104b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
104c0 64 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 69 6e  d winLogIoerr(in
104d0 74 20 6e 52 65 74 72 79 2c 20 69 6e 74 20 6c 69  t nRetry, int li
104e0 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6e 52 65  neno){.  if( nRe
104f0 74 72 79 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  try ){.    sqlit
10500 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f  e3_log(SQLITE_NO
10510 54 49 43 45 2c 0a 20 20 20 20 20 20 22 64 65 6c  TICE,.      "del
10520 61 79 65 64 20 25 64 6d 73 20 66 6f 72 20 6c 6f  ayed %dms for lo
10530 63 6b 2f 73 68 61 72 69 6e 67 20 63 6f 6e 66 6c  ck/sharing confl
10540 69 63 74 20 61 74 20 6c 69 6e 65 20 25 64 22 2c  ict at line %d",
10550 0a 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52  .      winIoerrR
10560 65 74 72 79 44 65 6c 61 79 2a 6e 52 65 74 72 79  etryDelay*nRetry
10570 2a 28 6e 52 65 74 72 79 2b 31 29 2f 32 2c 20 6c  *(nRetry+1)/2, l
10580 69 6e 65 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  ineno.    );.  }
10590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 4d 53  .}../*.** The MS
105a0 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64 6f 77  VC CRT on Window
105b0 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68 61 76  s CE may not hav
105c0 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20  e a localtime() 
105d0 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  function.  So.**
105e0 20 64 65 66 69 6e 65 20 61 20 73 75 62 73 74 69   define a substi
105f0 74 75 74 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  tute..*/.#if !de
10600 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
10610 54 5f 4c 4f 43 41 4c 54 49 4d 45 29 20 26 26 20  T_LOCALTIME) && 
10620 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
10630 43 45 29 20 26 26 20 5c 0a 20 20 20 20 28 21 64  CE) && \.    (!d
10640 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 53  efined(SQLITE_MS
10650 56 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49  VC_LOCALTIME_API
10660 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 4d 53 56  ) || !SQLITE_MSV
10670 43 5f 4c 4f 43 41 4c 54 49 4d 45 5f 41 50 49 29  C_LOCALTIME_API)
10680 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 74 69 6d  .#  include <tim
10690 65 2e 68 3e 0a 73 74 72 75 63 74 20 74 6d 20 2a  e.h>.struct tm *
106a0 5f 5f 63 64 65 63 6c 20 6c 6f 63 61 6c 74 69 6d  __cdecl localtim
106b0 65 28 63 6f 6e 73 74 20 74 69 6d 65 5f 74 20 2a  e(const time_t *
106c0 74 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 73 74  t).{.  static st
106d0 72 75 63 74 20 74 6d 20 79 3b 0a 20 20 46 49 4c  ruct tm y;.  FIL
106e0 45 54 49 4d 45 20 75 54 6d 2c 20 6c 54 6d 3b 0a  ETIME uTm, lTm;.
106f0 20 20 53 59 53 54 45 4d 54 49 4d 45 20 70 54 6d    SYSTEMTIME pTm
10700 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
10710 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20 2a  4 t64;.  t64 = *
10720 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34 20  t;.  t64 = (t64 
10730 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a 31  + 11644473600)*1
10740 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e 64  0000000;.  uTm.d
10750 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20 28  wLowDateTime = (
10760 44 57 4f 52 44 29 28 74 36 34 20 26 20 30 78 46  DWORD)(t64 & 0xF
10770 46 46 46 46 46 46 46 29 3b 0a 20 20 75 54 6d 2e  FFFFFFF);.  uTm.
10780 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 3d 20  dwHighDateTime= 
10790 28 44 57 4f 52 44 29 28 74 36 34 20 3e 3e 20 33  (DWORD)(t64 >> 3
107a0 32 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d 65  2);.  osFileTime
107b0 54 6f 4c 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28  ToLocalFileTime(
107c0 26 75 54 6d 2c 26 6c 54 6d 29 3b 0a 20 20 6f 73  &uTm,&lTm);.  os
107d0 46 69 6c 65 54 69 6d 65 54 6f 53 79 73 74 65 6d  FileTimeToSystem
107e0 54 69 6d 65 28 26 6c 54 6d 2c 26 70 54 6d 29 3b  Time(&lTm,&pTm);
107f0 0a 20 20 79 2e 74 6d 5f 79 65 61 72 20 3d 20 70  .  y.tm_year = p
10800 54 6d 2e 77 59 65 61 72 20 2d 20 31 39 30 30 3b  Tm.wYear - 1900;
10810 0a 20 20 79 2e 74 6d 5f 6d 6f 6e 20 3d 20 70 54  .  y.tm_mon = pT
10820 6d 2e 77 4d 6f 6e 74 68 20 2d 20 31 3b 0a 20 20  m.wMonth - 1;.  
10830 79 2e 74 6d 5f 77 64 61 79 20 3d 20 70 54 6d 2e  y.tm_wday = pTm.
10840 77 44 61 79 4f 66 57 65 65 6b 3b 0a 20 20 79 2e  wDayOfWeek;.  y.
10850 74 6d 5f 6d 64 61 79 20 3d 20 70 54 6d 2e 77 44  tm_mday = pTm.wD
10860 61 79 3b 0a 20 20 79 2e 74 6d 5f 68 6f 75 72 20  ay;.  y.tm_hour 
10870 3d 20 70 54 6d 2e 77 48 6f 75 72 3b 0a 20 20 79  = pTm.wHour;.  y
10880 2e 74 6d 5f 6d 69 6e 20 3d 20 70 54 6d 2e 77 4d  .tm_min = pTm.wM
10890 69 6e 75 74 65 3b 0a 20 20 79 2e 74 6d 5f 73 65  inute;.  y.tm_se
108a0 63 20 3d 20 70 54 6d 2e 77 53 65 63 6f 6e 64 3b  c = pTm.wSecond;
108b0 0a 20 20 72 65 74 75 72 6e 20 26 79 3b 0a 7d 0a  .  return &y;.}.
108c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
108d0 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 2f 2a 2a 2a  TE_OS_WINCE./***
108e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  ******.** This s
10930 65 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ection contains 
10940 63 6f 64 65 20 66 6f 72 20 57 69 6e 43 45 20 6f  code for WinCE o
10950 6e 6c 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  nly..*/.#define 
10960 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c  HANDLE_TO_WINFIL
10970 45 28 61 29 20 28 77 69 6e 46 69 6c 65 2a 29 26  E(a) (winFile*)&
10980 28 28 63 68 61 72 2a 29 61 29 5b 2d 28 69 6e 74  ((char*)a)[-(int
10990 29 6f 66 66 73 65 74 6f 66 28 77 69 6e 46 69 6c  )offsetof(winFil
109a0 65 2c 68 29 5d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  e,h)]../*.** Acq
109b0 75 69 72 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  uire a lock on t
109c0 68 65 20 68 61 6e 64 6c 65 20 68 0a 2a 2f 0a 73  he handle h.*/.s
109d0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63 65  tatic void wince
109e0 4d 75 74 65 78 41 63 71 75 69 72 65 28 48 41 4e  MutexAcquire(HAN
109f0 44 4c 45 20 68 29 7b 0a 20 20 20 44 57 4f 52 44  DLE h){.   DWORD
10a00 20 64 77 45 72 72 3b 0a 20 20 20 64 6f 20 7b 0a   dwErr;.   do {.
10a10 20 20 20 20 20 64 77 45 72 72 20 3d 20 6f 73 57       dwErr = osW
10a20 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
10a30 63 74 28 68 2c 20 49 4e 46 49 4e 49 54 45 29 3b  ct(h, INFINITE);
10a40 0a 20 20 20 7d 20 77 68 69 6c 65 20 28 64 77 45  .   } while (dwE
10a50 72 72 20 21 3d 20 57 41 49 54 5f 4f 42 4a 45 43  rr != WAIT_OBJEC
10a60 54 5f 30 20 26 26 20 64 77 45 72 72 20 21 3d 20  T_0 && dwErr != 
10a70 57 41 49 54 5f 41 42 41 4e 44 4f 4e 45 44 29 3b  WAIT_ABANDONED);
10a80 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  .}./*.** Release
10a90 20 61 20 6c 6f 63 6b 20 61 63 71 75 69 72 65 64   a lock acquired
10aa0 20 62 79 20 77 69 6e 63 65 4d 75 74 65 78 41 63   by winceMutexAc
10ab0 71 75 69 72 65 28 29 0a 2a 2f 0a 23 64 65 66 69  quire().*/.#defi
10ac0 6e 65 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  ne winceMutexRel
10ad0 65 61 73 65 28 68 29 20 52 65 6c 65 61 73 65 4d  ease(h) ReleaseM
10ae0 75 74 65 78 28 68 29 0a 0a 2f 2a 0a 2a 2a 20 43  utex(h)../*.** C
10af0 72 65 61 74 65 20 74 68 65 20 6d 75 74 65 78 20  reate the mutex 
10b00 61 6e 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  and shared memor
10b10 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  y used for locki
10b20 6e 67 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ng in the file.*
10b30 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  * descriptor pFi
10b40 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  le.*/.static int
10b50 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b   winceCreateLock
10b60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
10b70 6c 65 6e 61 6d 65 2c 20 77 69 6e 46 69 6c 65 20  lename, winFile 
10b80 2a 70 46 69 6c 65 29 7b 0a 20 20 4c 50 57 53 54  *pFile){.  LPWST
10b90 52 20 7a 54 6f 6b 3b 0a 20 20 4c 50 57 53 54 52  R zTok;.  LPWSTR
10ba0 20 7a 4e 61 6d 65 3b 0a 20 20 44 57 4f 52 44 20   zName;.  DWORD 
10bb0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 42 4f 4f  lastErrno;.  BOO
10bc0 4c 20 62 4c 6f 67 67 65 64 20 3d 20 46 41 4c 53  L bLogged = FALS
10bd0 45 3b 0a 20 20 42 4f 4f 4c 20 62 49 6e 69 74 20  E;.  BOOL bInit 
10be0 3d 20 54 52 55 45 3b 0a 0a 20 20 7a 4e 61 6d 65  = TRUE;..  zName
10bf0 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63   = winUtf8ToUnic
10c00 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ode(zFilename);.
10c10 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29    if( zName==0 )
10c20 7b 0a 20 20 20 20 2f 2a 20 6f 75 74 20 6f 66 20  {.    /* out of 
10c30 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 72 65  memory */.    re
10c40 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
10c50 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
10c60 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
10c70 7a 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  ze the local loc
10c80 6b 64 61 74 61 20 2a 2f 0a 20 20 6d 65 6d 73 65  kdata */.  memse
10c90 74 28 26 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2c  t(&pFile->local,
10ca0 20 30 2c 20 73 69 7a 65 6f 66 28 70 46 69 6c 65   0, sizeof(pFile
10cb0 2d 3e 6c 6f 63 61 6c 29 29 3b 0a 0a 20 20 2f 2a  ->local));..  /*
10cc0 20 52 65 70 6c 61 63 65 20 74 68 65 20 62 61 63   Replace the bac
10cd0 6b 73 6c 61 73 68 65 73 20 66 72 6f 6d 20 74 68  kslashes from th
10ce0 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 6c  e filename and l
10cf0 6f 77 65 72 63 61 73 65 20 69 74 0a 20 20 2a 2a  owercase it.  **
10d00 20 74 6f 20 64 65 72 69 76 65 20 61 20 6d 75 74   to derive a mut
10d10 65 78 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 7a 54  ex name. */.  zT
10d20 6f 6b 20 3d 20 6f 73 43 68 61 72 4c 6f 77 65 72  ok = osCharLower
10d30 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 20  W(zName);.  for 
10d40 28 3b 2a 7a 54 6f 6b 3b 7a 54 6f 6b 2b 2b 29 7b  (;*zTok;zTok++){
10d50 0a 20 20 20 20 69 66 20 28 2a 7a 54 6f 6b 20 3d  .    if (*zTok =
10d60 3d 20 27 5c 5c 27 29 20 2a 7a 54 6f 6b 20 3d 20  = '\\') *zTok = 
10d70 27 5f 27 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  '_';.  }..  /* C
10d80 72 65 61 74 65 2f 6f 70 65 6e 20 74 68 65 20 6e  reate/open the n
10d90 61 6d 65 64 20 6d 75 74 65 78 20 2a 2f 0a 20 20  amed mutex */.  
10da0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d 20  pFile->hMutex = 
10db0 6f 73 43 72 65 61 74 65 4d 75 74 65 78 57 28 4e  osCreateMutexW(N
10dc0 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 7a 4e 61 6d  ULL, FALSE, zNam
10dd0 65 29 3b 0a 20 20 69 66 20 28 21 70 46 69 6c 65  e);.  if (!pFile
10de0 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20 20 70  ->hMutex){.    p
10df0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
10e00 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
10e10 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
10e20 66 72 65 65 28 7a 4e 61 6d 65 29 3b 0a 20 20 20  free(zName);.   
10e30 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
10e40 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
10e50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  , pFile->lastErr
10e60 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
10e70 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 63             "winc
10e80 65 43 72 65 61 74 65 4c 6f 63 6b 31 22 2c 20 7a  eCreateLock1", z
10e90 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 0a  Filename);.  }..
10ea0 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
10eb0 20 6d 75 74 65 78 20 62 65 66 6f 72 65 20 63 6f   mutex before co
10ec0 6e 74 69 6e 75 69 6e 67 20 2a 2f 0a 20 20 77 69  ntinuing */.  wi
10ed0 6e 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28  nceMutexAcquire(
10ee0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
10ef0 0a 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20  .  /* Since the 
10f00 6e 61 6d 65 73 20 6f 66 20 6e 61 6d 65 64 20 6d  names of named m
10f10 75 74 65 78 65 73 2c 20 73 65 6d 61 70 68 6f 72  utexes, semaphor
10f20 65 73 2c 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  es, file mapping
10f30 73 20 65 74 63 20 61 72 65 0a 20 20 2a 2a 20 63  s etc are.  ** c
10f40 61 73 65 2d 73 65 6e 73 69 74 69 76 65 2c 20 74  ase-sensitive, t
10f50 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66  ake advantage of
10f60 20 74 68 61 74 20 62 79 20 75 70 70 65 72 63 61   that by upperca
10f70 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 20 6e  sing the mutex n
10f80 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 75 73 69  ame.  ** and usi
10f90 6e 67 20 74 68 61 74 20 61 73 20 74 68 65 20 73  ng that as the s
10fa0 68 61 72 65 64 20 66 69 6c 65 6d 61 70 70 69 6e  hared filemappin
10fb0 67 20 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 6f  g name..  */.  o
10fc0 73 43 68 61 72 55 70 70 65 72 57 28 7a 4e 61 6d  sCharUpperW(zNam
10fd0 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 53 68  e);.  pFile->hSh
10fe0 61 72 65 64 20 3d 20 6f 73 43 72 65 61 74 65 46  ared = osCreateF
10ff0 69 6c 65 4d 61 70 70 69 6e 67 57 28 49 4e 56 41  ileMappingW(INVA
11000 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
11010 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20  , NULL,.        
11020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11040 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
11050 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c  0, sizeof(winceL
11060 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ock),.          
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
11090 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  ame);..  /* Set 
110a0 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69  a flag that indi
110b0 63 61 74 65 73 20 77 65 27 72 65 20 74 68 65 20  cates we're the 
110c0 66 69 72 73 74 20 74 6f 20 63 72 65 61 74 65 20  first to create 
110d0 74 68 65 20 6d 65 6d 6f 72 79 20 73 6f 20 69 74  the memory so it
110e0 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 7a 65  .  ** must be ze
110f0 72 6f 2d 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a  ro-initialized *
11100 2f 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  /.  lastErrno = 
11110 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
11120 3b 0a 20 20 69 66 20 28 6c 61 73 74 45 72 72 6e  ;.  if (lastErrn
11130 6f 20 3d 3d 20 45 52 52 4f 52 5f 41 4c 52 45 41  o == ERROR_ALREA
11140 44 59 5f 45 58 49 53 54 53 29 7b 0a 20 20 20 20  DY_EXISTS){.    
11150 62 49 6e 69 74 20 3d 20 46 41 4c 53 45 3b 0a 20  bInit = FALSE;. 
11160 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
11170 65 65 28 7a 4e 61 6d 65 29 3b 0a 0a 20 20 2f 2a  ee(zName);..  /*
11180 20 49 66 20 77 65 20 73 75 63 63 65 65 64 65 64   If we succeeded
11190 20 69 6e 20 6d 61 6b 69 6e 67 20 74 68 65 20 73   in making the s
111a0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
111b0 64 6c 65 2c 20 6d 61 70 20 69 74 2e 20 2a 2f 0a  dle, map it. */.
111c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68    if( pFile->hSh
111d0 61 72 65 64 20 29 7b 0a 20 20 20 20 70 46 69 6c  ared ){.    pFil
111e0 65 2d 3e 73 68 61 72 65 64 20 3d 20 28 77 69 6e  e->shared = (win
111f0 63 65 4c 6f 63 6b 2a 29 6f 73 4d 61 70 56 69 65  ceLock*)osMapVie
11200 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  wOfFile(pFile->h
11210 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20 20  Shared,.        
11220 20 20 20 20 20 46 49 4c 45 5f 4d 41 50 5f 52 45       FILE_MAP_RE
11230 41 44 7c 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  AD|FILE_MAP_WRIT
11240 45 2c 20 30 2c 20 30 2c 20 73 69 7a 65 6f 66 28  E, 0, 0, sizeof(
11250 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20 20 20  winceLock));.   
11260 20 2f 2a 20 49 66 20 6d 61 70 70 69 6e 67 20 66   /* If mapping f
11270 61 69 6c 65 64 2c 20 63 6c 6f 73 65 20 74 68 65  ailed, close the
11280 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68   shared memory h
11290 61 6e 64 6c 65 20 61 6e 64 20 65 72 61 73 65 20  andle and erase 
112a0 69 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  it */.    if( !p
112b0 46 69 6c 65 2d 3e 73 68 61 72 65 64 20 29 7b 0a  File->shared ){.
112c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
112d0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
112e0 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20  stError();.     
112f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
11300 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
11310 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
11330 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63 6b 32  winceCreateLock2
11340 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
11350 20 20 20 20 20 62 4c 6f 67 67 65 64 20 3d 20 54       bLogged = T
11360 52 55 45 3b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  RUE;.      osClo
11370 73 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e  seHandle(pFile->
11380 68 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  hShared);.      
11390 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d  pFile->hShared =
113a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d   NULL;.    }.  }
113b0 0a 0a 20 20 2f 2a 20 49 66 20 73 68 61 72 65 64  ..  /* If shared
113c0 20 6d 65 6d 6f 72 79 20 63 6f 75 6c 64 20 6e 6f   memory could no
113d0 74 20 62 65 20 63 72 65 61 74 65 64 2c 20 74 68  t be created, th
113e0 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 6d 75 74  en close the mut
113f0 65 78 20 61 6e 64 20 66 61 69 6c 20 2a 2f 0a 20  ex and fail */. 
11400 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 53 68 61   if( pFile->hSha
11410 72 65 64 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  red==NULL ){.   
11420 20 69 66 28 20 21 62 4c 6f 67 67 65 64 20 29 7b   if( !bLogged ){
11430 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
11440 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
11450 72 6e 6f 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f  rno;.      winLo
11460 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
11470 45 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74  ERR, pFile->last
11480 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  Errno,.         
11490 20 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43           "winceC
114a0 72 65 61 74 65 4c 6f 63 6b 33 22 2c 20 7a 46 69  reateLock3", zFi
114b0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  lename);.      b
114c0 4c 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20  Logged = TRUE;. 
114d0 20 20 20 7d 0a 20 20 20 20 77 69 6e 63 65 4d 75     }.    winceMu
114e0 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65  texRelease(pFile
114f0 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20 20 6f  ->hMutex);.    o
11500 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46 69  sCloseHandle(pFi
11510 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 20  le->hMutex);.   
11520 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 20 3d   pFile->hMutex =
11530 20 4e 55 4c 4c 3b 0a 20 20 20 20 72 65 74 75 72   NULL;.    retur
11540 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
11550 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
11560 6c 69 7a 65 20 74 68 65 20 73 68 61 72 65 64 20  lize the shared 
11570 6d 65 6d 6f 72 79 20 69 66 20 77 65 27 72 65 20  memory if we're 
11580 73 75 70 70 6f 73 65 64 20 74 6f 20 2a 2f 0a 20  supposed to */. 
11590 20 69 66 28 20 62 49 6e 69 74 20 29 7b 0a 20 20   if( bInit ){.  
115a0 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2d 3e    memset(pFile->
115b0 73 68 61 72 65 64 2c 20 30 2c 20 73 69 7a 65 6f  shared, 0, sizeo
115c0 66 28 77 69 6e 63 65 4c 6f 63 6b 29 29 3b 0a 20  f(winceLock));. 
115d0 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65 78   }..  winceMutex
115e0 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e 68  Release(pFile->h
115f0 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  Mutex);.  return
11600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11610 2a 0a 2a 2a 20 44 65 73 74 72 6f 79 20 74 68 65  *.** Destroy the
11620 20 70 61 72 74 20 6f 66 20 77 69 6e 46 69 6c 65   part of winFile
11630 20 74 68 61 74 20 64 65 61 6c 73 20 77 69 74 68   that deals with
11640 20 77 69 6e 63 65 20 6c 6f 63 6b 73 0a 2a 2f 0a   wince locks.*/.
11650 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 63  static void winc
11660 65 44 65 73 74 72 6f 79 4c 6f 63 6b 28 77 69 6e  eDestroyLock(win
11670 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
11680 69 66 20 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  if (pFile->hMute
11690 78 29 7b 0a 20 20 20 20 2f 2a 20 41 63 71 75 69  x){.    /* Acqui
116a0 72 65 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a  re the mutex */.
116b0 20 20 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63      winceMutexAc
116c0 71 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75  quire(pFile->hMu
116d0 74 65 78 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  tex);..    /* Th
116e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
116f0 6b 73 20 73 68 6f 75 6c 64 20 70 72 6f 62 61 62  ks should probab
11700 6c 79 20 61 73 73 65 72 74 20 69 6e 20 64 65 62  ly assert in deb
11710 75 67 20 6d 6f 64 65 2c 20 62 75 74 20 74 68 65  ug mode, but the
11720 79 0a 20 20 20 20 20 20 20 61 72 65 20 74 6f 20  y.       are to 
11730 63 6c 65 61 6e 75 70 20 69 6e 20 63 61 73 65 20  cleanup in case 
11740 61 6e 79 20 6c 6f 63 6b 73 20 72 65 6d 61 69 6e  any locks remain
11750 65 64 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69  ed open */.    i
11760 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11770 6e 52 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20  nReaders){.     
11780 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
11790 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20 20  nReaders --;.   
117a0 20 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65   }.    if (pFile
117b0 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76 65  ->local.bReserve
117c0 64 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  d){.      pFile-
117d0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
117e0 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
117f0 7d 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  }.    if (pFile-
11800 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 29  >local.bPending)
11810 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11820 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
11830 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20  = FALSE;.    }. 
11840 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f     if (pFile->lo
11850 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 29 7b  cal.bExclusive){
11860 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68  .      pFile->sh
11870 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
11880 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a   = FALSE;.    }.
11890 0a 20 20 20 20 2f 2a 20 44 65 2d 72 65 66 65 72  .    /* De-refer
118a0 65 6e 63 65 20 61 6e 64 20 63 6c 6f 73 65 20 6f  ence and close o
118b0 75 72 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  ur copy of the s
118c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 68 61 6e  hared memory han
118d0 64 6c 65 20 2a 2f 0a 20 20 20 20 6f 73 55 6e 6d  dle */.    osUnm
118e0 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69  apViewOfFile(pFi
118f0 6c 65 2d 3e 73 68 61 72 65 64 29 3b 0a 20 20 20  le->shared);.   
11900 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70   osCloseHandle(p
11910 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 29 3b 0a  File->hShared);.
11920 0a 20 20 20 20 2f 2a 20 44 6f 6e 65 20 77 69 74  .    /* Done wit
11930 68 20 74 68 65 20 6d 75 74 65 78 20 2a 2f 0a 20  h the mutex */. 
11940 20 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c     winceMutexRel
11950 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
11960 65 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65  ex);.    osClose
11970 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d  Handle(pFile->hM
11980 75 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65  utex);.    pFile
11990 2d 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b  ->hMutex = NULL;
119a0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  .  }.}../*.** An
119b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
119c0 6f 66 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 28  of the LockFile(
119d0 29 20 41 50 49 20 6f 66 20 57 69 6e 64 6f 77 73  ) API of Windows
119e0 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61 74 69   for CE.*/.stati
119f0 63 20 42 4f 4f 4c 20 77 69 6e 63 65 4c 6f 63 6b  c BOOL winceLock
11a00 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44 4c 45  File(.  LPHANDLE
11a10 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f 52 44   phFile,.  DWORD
11a20 20 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77   dwFileOffsetLow
11a30 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
11a40 4f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 44 57  OffsetHigh,.  DW
11a50 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74  ORD nNumberOfByt
11a60 65 73 54 6f 4c 6f 63 6b 4c 6f 77 2c 0a 20 20 44  esToLockLow,.  D
11a70 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79  WORD nNumberOfBy
11a80 74 65 73 54 6f 4c 6f 63 6b 48 69 67 68 0a 29 7b  tesToLockHigh.){
11a90 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
11aa0 65 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49  e = HANDLE_TO_WI
11ab0 4e 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20  NFILE(phFile);. 
11ac0 20 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20   BOOL bReturn = 
11ad0 46 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44  FALSE;..  UNUSED
11ae0 5f 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c  _PARAMETER(dwFil
11af0 65 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20  eOffsetHigh);.  
11b00 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
11b10 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54  (nNumberOfBytesT
11b20 6f 4c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20 69  oLockHigh);..  i
11b30 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
11b40 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a  x) return TRUE;.
11b50 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71 75    winceMutexAcqu
11b60 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ire(pFile->hMute
11b70 78 29 3b 0a 0a 20 20 2f 2a 20 57 61 6e 74 69 6e  x);..  /* Wantin
11b80 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  g an exclusive l
11b90 6f 63 6b 3f 20 2a 2f 0a 20 20 69 66 20 28 64 77  ock? */.  if (dw
11ba0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
11bb0 20 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46   (DWORD)SHARED_F
11bc0 49 52 53 54 0a 20 20 20 20 20 20 20 26 26 20 6e  IRST.       && n
11bd0 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c  NumberOfBytesToL
11be0 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
11bf0 29 53 48 41 52 45 44 5f 53 49 5a 45 29 7b 0a 20  )SHARED_SIZE){. 
11c00 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 73 68     if (pFile->sh
11c10 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73 20 3d  ared->nReaders =
11c20 3d 20 30 20 26 26 20 70 46 69 6c 65 2d 3e 73 68  = 0 && pFile->sh
11c30 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76 65  ared->bExclusive
11c40 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 70   == 0){.       p
11c50 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 45  File->shared->bE
11c60 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
11c70 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  .       pFile->l
11c80 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76 65 20  ocal.bExclusive 
11c90 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 20 62  = TRUE;.       b
11ca0 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20  Return = TRUE;. 
11cb0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57     }.  }..  /* W
11cc0 61 6e 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20  ant a read-only 
11cd0 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73 65 20  lock? */.  else 
11ce0 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
11cf0 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53 48  Low == (DWORD)SH
11d00 41 52 45 44 5f 46 49 52 53 54 20 26 26 0a 20 20  ARED_FIRST &&.  
11d10 20 20 20 20 20 20 20 20 20 6e 4e 75 6d 62 65 72           nNumber
11d20 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77  OfBytesToLockLow
11d30 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69 66 20 28   == 1){.    if (
11d40 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11d50 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
11d60 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  .      pFile->lo
11d70 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 2b 2b 3b  cal.nReaders ++;
11d80 0a 20 20 20 20 20 20 69 66 20 28 70 46 69 6c 65  .      if (pFile
11d90 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73  ->local.nReaders
11da0 20 3d 3d 20 31 29 7b 0a 20 20 20 20 20 20 20 20   == 1){.        
11db0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
11dc0 52 65 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20  Readers ++;.    
11dd0 20 20 7d 0a 20 20 20 20 20 20 62 52 65 74 75 72    }.      bRetur
11de0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
11df0 20 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61    }..  /* Want a
11e00 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 3f 20 2a   pending lock? *
11e10 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11e20 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11e30 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f 42  (DWORD)PENDING_B
11e40 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 26  YTE.           &
11e50 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  & nNumberOfBytes
11e60 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
11e70 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 70 65  .    /* If no pe
11e80 6e 64 69 6e 67 20 6c 6f 63 6b 20 68 61 73 20 62  nding lock has b
11e90 65 65 6e 20 61 63 71 75 69 72 65 64 2c 20 74 68  een acquired, th
11ea0 65 6e 20 61 63 71 75 69 72 65 20 69 74 20 2a 2f  en acquire it */
11eb0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11ec0 73 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67  shared->bPending
11ed0 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 70   == 0) {.      p
11ee0 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
11ef0 65 6e 64 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20  ending = TRUE;. 
11f00 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61       pFile->loca
11f10 6c 2e 62 50 65 6e 64 69 6e 67 20 3d 20 54 52 55  l.bPending = TRU
11f20 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e  E;.      bReturn
11f30 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20   = TRUE;.    }. 
11f40 20 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20   }..  /* Want a 
11f50 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 3f 20 2a  reserved lock? *
11f60 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11f70 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11f80 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
11f90 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
11fa0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
11fb0 73 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29  sToLockLow == 1)
11fc0 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d  {.    if (pFile-
11fd0 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
11fe0 65 64 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20  ed == 0) {.     
11ff0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12000 62 52 65 73 65 72 76 65 64 20 3d 20 54 52 55 45  bReserved = TRUE
12010 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  ;.      pFile->l
12020 6f 63 61 6c 2e 62 52 65 73 65 72 76 65 64 20 3d  ocal.bReserved =
12030 20 54 52 55 45 3b 0a 20 20 20 20 20 20 62 52 65   TRUE;.      bRe
12040 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12050 20 7d 0a 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d   }.  }..  winceM
12060 75 74 65 78 52 65 6c 65 61 73 65 28 70 46 69 6c  utexRelease(pFil
12070 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20 72 65  e->hMutex);.  re
12080 74 75 72 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a  turn bReturn;.}.
12090 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
120a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
120b0 55 6e 6c 6f 63 6b 46 69 6c 65 20 41 50 49 20 6f  UnlockFile API o
120c0 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
120d0 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
120e0 77 69 6e 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28  winceUnlockFile(
120f0 0a 20 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69  .  LPHANDLE phFi
12100 6c 65 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69  le,.  DWORD dwFi
12110 6c 65 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  leOffsetLow,.  D
12120 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12130 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e  tHigh,.  DWORD n
12140 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55  NumberOfBytesToU
12150 6e 6c 6f 63 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52  nlockLow,.  DWOR
12160 44 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  D nNumberOfBytes
12170 54 6f 55 6e 6c 6f 63 6b 48 69 67 68 0a 29 7b 0a  ToUnlockHigh.){.
12180 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
12190 20 3d 20 48 41 4e 44 4c 45 5f 54 4f 5f 57 49 4e   = HANDLE_TO_WIN
121a0 46 49 4c 45 28 70 68 46 69 6c 65 29 3b 0a 20 20  FILE(phFile);.  
121b0 42 4f 4f 4c 20 62 52 65 74 75 72 6e 20 3d 20 46  BOOL bReturn = F
121c0 41 4c 53 45 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  ALSE;..  UNUSED_
121d0 50 41 52 41 4d 45 54 45 52 28 64 77 46 69 6c 65  PARAMETER(dwFile
121e0 4f 66 66 73 65 74 48 69 67 68 29 3b 0a 20 20 55  OffsetHigh);.  U
121f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
12200 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f  nNumberOfBytesTo
12210 55 6e 6c 6f 63 6b 48 69 67 68 29 3b 0a 0a 20 20  UnlockHigh);..  
12220 69 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74  if (!pFile->hMut
12230 65 78 29 20 72 65 74 75 72 6e 20 54 52 55 45 3b  ex) return TRUE;
12240 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 41 63 71  .  winceMutexAcq
12250 75 69 72 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  uire(pFile->hMut
12260 65 78 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61  ex);..  /* Relea
12270 73 69 6e 67 20 61 20 72 65 61 64 65 72 20 6c 6f  sing a reader lo
12280 63 6b 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  ck or an exclusi
12290 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 20  ve lock */.  if 
122a0 28 64 77 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77  (dwFileOffsetLow
122b0 20 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45   == (DWORD)SHARE
122c0 44 5f 46 49 52 53 54 29 7b 0a 20 20 20 20 2f 2a  D_FIRST){.    /*
122d0 20 44 69 64 20 77 65 20 68 61 76 65 20 61 6e 20   Did we have an 
122e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20  exclusive lock? 
122f0 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65  */.    if (pFile
12300 2d 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69  ->local.bExclusi
12310 76 65 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ve){.      asser
12320 74 28 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73  t(nNumberOfBytes
12330 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20 28  ToUnlockLow == (
12340 44 57 4f 52 44 29 53 48 41 52 45 44 5f 53 49 5a  DWORD)SHARED_SIZ
12350 45 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  E);.      pFile-
12360 3e 6c 6f 63 61 6c 2e 62 45 78 63 6c 75 73 69 76  >local.bExclusiv
12370 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  e = FALSE;.     
12380 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
12390 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
123a0 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
123b0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
123c0 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65 20 6a  .    /* Did we j
123d0 75 73 74 20 68 61 76 65 20 61 20 72 65 61 64 65  ust have a reade
123e0 72 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20 65  r lock? */.    e
123f0 6c 73 65 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c  lse if (pFile->l
12400 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 29 7b 0a  ocal.nReaders){.
12410 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75        assert(nNu
12420 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12430 6f 63 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  ockLow == (DWORD
12440 29 53 48 41 52 45 44 5f 53 49 5a 45 0a 20 20 20  )SHARED_SIZE.   
12450 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6e 4e 75            || nNu
12460 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c  mberOfBytesToUnl
12470 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 3b 0a 20 20  ockLow == 1);.  
12480 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c      pFile->local
12490 2e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a 20 20  .nReaders --;.  
124a0 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 6c      if (pFile->l
124b0 6f 63 61 6c 2e 6e 52 65 61 64 65 72 73 20 3d 3d  ocal.nReaders ==
124c0 20 30 29 0a 20 20 20 20 20 20 7b 0a 20 20 20 20   0).      {.    
124d0 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65      pFile->share
124e0 64 2d 3e 6e 52 65 61 64 65 72 73 20 2d 2d 3b 0a  d->nReaders --;.
124f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 52        }.      bR
12500 65 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20  eturn = TRUE;.  
12510 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
12520 6c 65 61 73 69 6e 67 20 61 20 70 65 6e 64 69 6e  leasing a pendin
12530 67 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65  g lock */.  else
12540 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65   if (dwFileOffse
12550 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 50  tLow == (DWORD)P
12560 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20 20  ENDING_BYTE.    
12570 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
12580 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
12590 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
125a0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
125b0 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
125c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50   pFile->local.bP
125d0 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
125e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61        pFile->sha
125f0 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20 3d 20  red->bPending = 
12600 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 62 52 65  FALSE;.      bRe
12610 74 75 72 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20  turn = TRUE;.   
12620 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 52 65 6c 65   }.  }.  /* Rele
12630 61 73 69 6e 67 20 61 20 72 65 73 65 72 76 65 64  asing a reserved
12640 20 6c 6f 63 6b 20 2a 2f 0a 20 20 65 6c 73 65 20   lock */.  else 
12650 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73 65 74  if (dwFileOffset
12660 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 52 45  Low == (DWORD)RE
12670 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20 20 20  SERVED_BYTE.    
12680 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65         && nNumbe
12690 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b  rOfBytesToUnlock
126a0 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
126b0 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
126c0 62 52 65 73 65 72 76 65 64 29 20 7b 0a 20 20 20  bReserved) {.   
126d0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
126e0 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c 53  bReserved = FALS
126f0 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  E;.      pFile->
12700 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76 65  shared->bReserve
12710 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20  d = FALSE;.     
12720 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45 3b   bReturn = TRUE;
12730 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 77 69  .    }.  }..  wi
12740 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28  nceMutexRelease(
12750 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
12760 20 20 72 65 74 75 72 6e 20 62 52 65 74 75 72 6e    return bReturn
12770 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 45 6e 64 20 6f 66  ;.}./*.** End of
12780 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 6f 64   the special cod
12790 65 20 66 6f 72 20 77 69 6e 63 65 0a 2a 2a 2a 2a  e for wince.****
127a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
127e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69  *********/.#endi
127f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57  f /* SQLITE_OS_W
12800 49 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c  INCE */../*.** L
12810 6f 63 6b 20 61 20 66 69 6c 65 20 72 65 67 69 6f  ock a file regio
12820 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  n..*/.static BOO
12830 4c 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 0a 20  L winLockFile(. 
12840 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
12850 2c 0a 20 20 44 57 4f 52 44 20 66 6c 61 67 73 2c  ,.  DWORD flags,
12860 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74 4c  .  DWORD offsetL
12870 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73  ow,.  DWORD offs
12880 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44 20  etHigh,.  DWORD 
12890 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20 44  numBytesLow,.  D
128a0 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69 67  WORD numBytesHig
128b0 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  h.){.#if SQLITE_
128c0 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20 20  OS_WINCE.  /*.  
128d0 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
128e0 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
128f0 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
12900 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
12910 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20 20  the Win32.  **  
12920 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46 69 6c       API LockFil
12930 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  e..  */.  return
12940 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 70   winceLockFile(p
12950 68 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77  hFile, offsetLow
12960 2c 20 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20  , offsetHigh,.  
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
12990 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
129a0 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
129b0 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
129c0 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
129d0 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
129e0 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
129f0 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
12a00 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
12a10 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
12a20 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
12a30 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
12a40 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 45 78 28 2a  n osLockFileEx(*
12a50 70 68 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 30  phFile, flags, 0
12a60 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 20 6e  , numBytesLow, n
12a70 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26 6f 76  umBytesHigh, &ov
12a80 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  lp);.  }else{.  
12a90 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63 6b 46    return osLockF
12aa0 69 6c 65 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66  ile(*phFile, off
12ab0 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69  setLow, offsetHi
12ac0 67 68 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c  gh, numBytesLow,
12ad0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12ae0 20 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48         numBytesH
12af0 69 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  igh);.  }.#endif
12b00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
12b10 20 61 20 66 69 6c 65 20 72 65 67 69 6f 6e 2e 0a   a file region..
12b20 20 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20   */.static BOOL 
12b30 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 0a 20  winUnlockFile(. 
12b40 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
12b50 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66 73 65 74  ,.  DWORD offset
12b60 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6f 66 66  Low,.  DWORD off
12b70 73 65 74 48 69 67 68 2c 0a 20 20 44 57 4f 52 44  setHigh,.  DWORD
12b80 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12b90 44 57 4f 52 44 20 6e 75 6d 42 79 74 65 73 48 69  DWORD numBytesHi
12ba0 67 68 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  gh.){.#if SQLITE
12bb0 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 2f 2a 0a 20  _OS_WINCE.  /*. 
12bc0 20 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77   ** NOTE: Window
12bd0 73 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20  s CE is handled 
12be0 64 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65  differently here
12bf0 20 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66   due its lack of
12c00 20 74 68 65 20 57 69 6e 33 32 0a 20 20 2a 2a 20   the Win32.  ** 
12c10 20 20 20 20 20 20 41 50 49 20 55 6e 6c 6f 63 6b        API Unlock
12c20 46 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  File..  */.  ret
12c30 75 72 6e 20 77 69 6e 63 65 55 6e 6c 6f 63 6b 46  urn winceUnlockF
12c40 69 6c 65 28 70 68 46 69 6c 65 2c 20 6f 66 66 73  ile(phFile, offs
12c50 65 74 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67  etLow, offsetHig
12c60 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  h,.             
12c70 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 42              numB
12c80 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65  ytesLow, numByte
12c90 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a 20 20  sHigh);.#else.  
12ca0 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a  if( osIsNT() ){.
12cb0 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
12cc0 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  vlp;.    memset(
12cd0 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65 6f 66  &ovlp, 0, sizeof
12ce0 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b 0a 20  (OVERLAPPED));. 
12cf0 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d     ovlp.Offset =
12d00 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20 20 20   offsetLow;.    
12d10 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68 20  ovlp.OffsetHigh 
12d20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a 20 20  = offsetHigh;.  
12d30 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c 6f 63    return osUnloc
12d40 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12d50 20 30 2c 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c   0, numBytesLow,
12d60 20 6e 75 6d 42 79 74 65 73 48 69 67 68 2c 20 26   numBytesHigh, &
12d70 6f 76 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ovlp);.  }else{.
12d80 20 20 20 20 72 65 74 75 72 6e 20 6f 73 55 6e 6c      return osUnl
12d90 6f 63 6b 46 69 6c 65 28 2a 70 68 46 69 6c 65 2c  ockFile(*phFile,
12da0 20 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73   offsetLow, offs
12db0 65 74 48 69 67 68 2c 20 6e 75 6d 42 79 74 65 73  etHigh, numBytes
12dc0 4c 6f 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Low,.           
12dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
12de0 42 79 74 65 73 48 69 67 68 29 3b 0a 20 20 7d 0a  BytesHigh);.  }.
12df0 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  #endif.}../*****
12e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20  ********.** The 
12e50 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 72 6f  next group of ro
12e60 75 74 69 6e 65 73 20 69 6d 70 6c 65 6d 65 6e 74  utines implement
12e70 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
12e80 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79   specified.** by
12e90 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
12ea0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 2e 0a  methods object..
12eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
12f00 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 20 4d 69 63 72  ./*.** Some Micr
12f10 6f 73 6f 66 74 20 63 6f 6d 70 69 6c 65 72 73 20  osoft compilers 
12f20 6c 61 63 6b 20 74 68 69 73 20 64 65 66 69 6e 69  lack this defini
12f30 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
12f40 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c   INVALID_SET_FIL
12f50 45 5f 50 4f 49 4e 54 45 52 0a 23 20 64 65 66 69  E_POINTER.# defi
12f60 6e 65 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46  ne INVALID_SET_F
12f70 49 4c 45 5f 50 4f 49 4e 54 45 52 20 28 28 44 57  ILE_POINTER ((DW
12f80 4f 52 44 29 2d 31 29 0a 23 65 6e 64 69 66 0a 0a  ORD)-1).#endif..
12f90 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
12fa0 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  urrent position 
12fb0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
12fc0 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
12fd0 20 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65   first.** argume
12fe0 6e 74 20 74 6f 20 6f 66 66 73 65 74 20 69 4f 66  nt to offset iOf
12ff0 66 73 65 74 20 77 69 74 68 69 6e 20 74 68 65 20  fset within the 
13000 66 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73  file. If success
13010 66 75 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ful, return 0..*
13020 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
13030 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13040 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  o and return non
13050 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  -zero..*/.static
13060 20 69 6e 74 20 77 69 6e 53 65 65 6b 46 69 6c 65   int winSeekFile
13070 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 2c  (winFile *pFile,
13080 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
13090 4f 66 66 73 65 74 29 7b 0a 23 69 66 20 21 53 51  Offset){.#if !SQ
130a0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
130b0 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 3b 20  LONG upperBits; 
130c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130d0 2f 2a 20 4d 6f 73 74 20 73 69 67 2e 20 33 32 20  /* Most sig. 32 
130e0 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66 66 73  bits of new offs
130f0 65 74 20 2a 2f 0a 20 20 4c 4f 4e 47 20 6c 6f 77  et */.  LONG low
13100 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20 20  erBits;         
13110 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 73 74          /* Least
13120 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
13130 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
13140 20 44 57 4f 52 44 20 64 77 52 65 74 3b 20 20 20   DWORD dwRet;   
13150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13160 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e   /* Value return
13170 65 64 20 62 79 20 53 65 74 46 69 6c 65 50 6f 69  ed by SetFilePoi
13180 6e 74 65 72 28 29 20 2a 2f 0a 20 20 44 57 4f 52  nter() */.  DWOR
13190 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20 20  D lastErrno;    
131a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
131b0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
131c0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20   GetLastError() 
131d0 2a 2f 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  */..  OSTRACE(("
131e0 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 66  SEEK file=%p, of
131f0 66 73 65 74 3d 25 6c 6c 64 5c 6e 22 2c 20 70 46  fset=%lld\n", pF
13200 69 6c 65 2d 3e 68 2c 20 69 4f 66 66 73 65 74 29  ile->h, iOffset)
13210 29 3b 0a 0a 20 20 75 70 70 65 72 42 69 74 73 20  );..  upperBits 
13220 3d 20 28 4c 4f 4e 47 29 28 28 69 4f 66 66 73 65  = (LONG)((iOffse
13230 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
13240 66 66 66 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74  fff);.  lowerBit
13250 73 20 3d 20 28 4c 4f 4e 47 29 28 69 4f 66 66 73  s = (LONG)(iOffs
13260 65 74 20 26 20 30 78 66 66 66 66 66 66 66 66 29  et & 0xffffffff)
13270 3b 0a 0a 20 20 2f 2a 20 41 50 49 20 6f 64 64 69  ;..  /* API oddi
13280 74 79 3a 20 49 66 20 73 75 63 63 65 73 73 66 75  ty: If successfu
13290 6c 2c 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65  l, SetFilePointe
132a0 72 28 29 20 72 65 74 75 72 6e 73 20 61 20 64 77  r() returns a dw
132b0 6f 72 64 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ord.  ** contain
132c0 69 6e 67 20 74 68 65 20 6c 6f 77 65 72 20 33 32  ing the lower 32
132d0 2d 62 69 74 73 20 6f 66 20 74 68 65 20 6e 65 77  -bits of the new
132e0 20 66 69 6c 65 2d 6f 66 66 73 65 74 2e 20 4f 72   file-offset. Or
132f0 2c 20 69 66 20 69 74 20 66 61 69 6c 73 2c 0a 20  , if it fails,. 
13300 20 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 49   ** it returns I
13310 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f  NVALID_SET_FILE_
13320 50 4f 49 4e 54 45 52 2e 20 48 6f 77 65 76 65 72  POINTER. However
13330 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 4d 53   according to MS
13340 44 4e 2c 0a 20 20 2a 2a 20 49 4e 56 41 4c 49 44  DN,.  ** INVALID
13350 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  _SET_FILE_POINTE
13360 52 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 61 20  R may also be a 
13370 76 61 6c 69 64 20 6e 65 77 20 6f 66 66 73 65 74  valid new offset
13380 2e 20 53 6f 20 74 6f 20 64 65 74 65 72 6d 69 6e  . So to determin
13390 65 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20 61  e.  ** whether a
133a0 6e 20 65 72 72 6f 72 20 68 61 73 20 61 63 74 75  n error has actu
133b0 61 6c 6c 79 20 6f 63 63 75 72 72 65 64 2c 20 69  ally occurred, i
133c0 74 20 69 73 20 61 6c 73 6f 20 6e 65 63 65 73 73  t is also necess
133d0 61 72 79 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a  ary to call.  **
133e0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2e   GetLastError().
133f0 0a 20 20 2a 2f 0a 20 20 64 77 52 65 74 20 3d 20  .  */.  dwRet = 
13400 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13410 28 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 77 65 72  (pFile->h, lower
13420 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
13430 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 0a  , FILE_BEGIN);..
13440 20 20 69 66 28 20 28 64 77 52 65 74 3d 3d 49 4e    if( (dwRet==IN
13450 56 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50  VALID_SET_FILE_P
13460 4f 49 4e 54 45 52 0a 20 20 20 20 20 20 26 26 20  OINTER.      && 
13470 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
13480 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
13490 3d 4e 4f 5f 45 52 52 4f 52 29 29 20 29 7b 0a 20  =NO_ERROR)) ){. 
134a0 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
134b0 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
134c0 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72  .    winLogError
134d0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45  (SQLITE_IOERR_SE
134e0 45 4b 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  EK, pFile->lastE
134f0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
13500 20 20 20 20 20 20 22 77 69 6e 53 65 65 6b 46 69        "winSeekFi
13510 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  le", pFile->zPat
13520 68 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  h);.    OSTRACE(
13530 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20  ("SEEK file=%p, 
13540 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
13550 53 45 45 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  SEEK\n", pFile->
13560 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  h));.    return 
13570 31 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43  1;.  }..  OSTRAC
13580 45 28 28 22 53 45 45 4b 20 66 69 6c 65 3d 25 70  E(("SEEK file=%p
13590 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
135a0 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
135b0 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65   return 0;.#else
135c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 53 61 6d 65 20  .  /*.  ** Same 
135d0 61 73 20 61 62 6f 76 65 2c 20 65 78 63 65 70 74  as above, except
135e0 20 74 68 61 74 20 74 68 69 73 20 69 6d 70 6c 65   that this imple
135f0 6d 65 6e 74 61 74 69 6f 6e 20 77 6f 72 6b 73 20  mentation works 
13600 66 6f 72 20 57 69 6e 52 54 2e 0a 20 20 2a 2f 0a  for WinRT..  */.
13610 0a 20 20 4c 41 52 47 45 5f 49 4e 54 45 47 45 52  .  LARGE_INTEGER
13620 20 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   x;             
13630 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 66     /* The new of
13640 66 73 65 74 20 2a 2f 0a 20 20 42 4f 4f 4c 20 62  fset */.  BOOL b
13650 52 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ret;            
13660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
13670 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
13680 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 45 78 28  etFilePointerEx(
13690 29 20 2a 2f 0a 0a 20 20 78 2e 51 75 61 64 50 61  ) */..  x.QuadPa
136a0 72 74 20 3d 20 69 4f 66 66 73 65 74 3b 0a 20 20  rt = iOffset;.  
136b0 62 52 65 74 20 3d 20 6f 73 53 65 74 46 69 6c 65  bRet = osSetFile
136c0 50 6f 69 6e 74 65 72 45 78 28 70 46 69 6c 65 2d  PointerEx(pFile-
136d0 3e 68 2c 20 78 2c 20 30 2c 20 46 49 4c 45 5f 42  >h, x, 0, FILE_B
136e0 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 21 62 52  EGIN);..  if(!bR
136f0 65 74 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  et){.    pFile->
13700 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
13710 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
13720 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
13730 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 2c  LITE_IOERR_SEEK,
13740 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
13750 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
13760 20 20 20 22 77 69 6e 53 65 65 6b 46 69 6c 65 22     "winSeekFile"
13770 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
13780 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
13790 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  EEK file=%p, rc=
137a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
137b0 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29  K\n", pFile->h))
137c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
137d0 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
137e0 22 53 45 45 4b 20 66 69 6c 65 3d 25 70 2c 20 72  "SEEK file=%p, r
137f0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20  c=SQLITE_OK\n", 
13800 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65  pFile->h));.  re
13810 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
13820 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
13830 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 20  _MMAP_SIZE>0./* 
13840 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
13850 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
13860 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
13870 72 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 20  r memory mapped 
13880 66 69 6c 65 73 20 2a 2f 0a 73 74 61 74 69 63 20  files */.static 
13890 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77  int winMapfile(w
138a0 69 6e 46 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33  inFile*, sqlite3
138b0 5f 69 6e 74 36 34 29 3b 0a 73 74 61 74 69 63 20  _int64);.static 
138c0 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
138d0 28 77 69 6e 46 69 6c 65 2a 29 3b 0a 23 65 6e 64  (winFile*);.#end
138e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
138f0 61 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 74  a file..**.** It
13900 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 68 61   is reported tha
13910 74 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  t an attempt to 
13920 63 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6d  close a handle m
13930 69 67 68 74 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ight sometimes.*
13940 2a 20 66 61 69 6c 2e 20 20 54 68 69 73 20 69 73  * fail.  This is
13950 20 61 20 76 65 72 79 20 75 6e 72 65 61 73 6f 6e   a very unreason
13960 61 62 6c 65 20 72 65 73 75 6c 74 2c 20 62 75 74  able result, but
13970 20 57 69 6e 64 6f 77 73 20 69 73 20 6e 6f 74 6f   Windows is noto
13980 72 69 6f 75 73 0a 2a 2a 20 66 6f 72 20 62 65 69  rious.** for bei
13990 6e 67 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20  ng unreasonable 
139a0 73 6f 20 49 20 64 6f 20 6e 6f 74 20 64 6f 75 62  so I do not doub
139b0 74 20 74 68 61 74 20 69 74 20 6d 69 67 68 74 20  t that it might 
139c0 68 61 70 70 65 6e 2e 20 20 49 66 0a 2a 2a 20 74  happen.  If.** t
139d0 68 65 20 63 6c 6f 73 65 20 66 61 69 6c 73 2c 20  he close fails, 
139e0 77 65 20 70 61 75 73 65 20 66 6f 72 20 31 30 30  we pause for 100
139f0 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61 6e   milliseconds an
13a00 64 20 74 72 79 20 61 67 61 69 6e 2e 20 20 41 73  d try again.  As
13a10 0a 2a 2a 20 6d 61 6e 79 20 61 73 20 4d 58 5f 43  .** many as MX_C
13a20 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 61 74 74  LOSE_ATTEMPT att
13a30 65 6d 70 74 73 20 74 6f 20 63 6c 6f 73 65 20 74  empts to close t
13a40 68 65 20 68 61 6e 64 6c 65 20 61 72 65 20 6d 61  he handle are ma
13a50 64 65 20 62 65 66 6f 72 65 0a 2a 2a 20 67 69 76  de before.** giv
13a60 69 6e 67 20 75 70 20 61 6e 64 20 72 65 74 75 72  ing up and retur
13a70 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  ning an error..*
13a80 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 43 4c 4f  /.#define MX_CLO
13a90 53 45 5f 41 54 54 45 4d 50 54 20 33 0a 73 74 61  SE_ATTEMPT 3.sta
13aa0 74 69 63 20 69 6e 74 20 77 69 6e 43 6c 6f 73 65  tic int winClose
13ab0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
13ac0 64 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 63 6e  d){.  int rc, cn
13ad0 74 20 3d 20 30 3b 0a 20 20 77 69 6e 46 69 6c 65  t = 0;.  winFile
13ae0 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
13af0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
13b00 74 28 20 69 64 21 3d 30 20 29 3b 0a 23 69 66 6e  t( id!=0 );.#ifn
13b10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13b20 57 41 4c 0a 20 20 61 73 73 65 72 74 28 20 70 46  WAL.  assert( pF
13b30 69 6c 65 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  ile->pShm==0 );.
13b40 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
13b50 20 70 46 69 6c 65 2d 3e 68 21 3d 4e 55 4c 4c 20   pFile->h!=NULL 
13b60 26 26 20 70 46 69 6c 65 2d 3e 68 21 3d 49 4e 56  && pFile->h!=INV
13b70 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
13b80 45 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  E );.  OSTRACE((
13b90 22 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  "CLOSE pid=%lu, 
13ba0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
13bb0 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  p\n",.          
13bc0 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
13bd0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
13be0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 0a 23 69   pFile->h));..#i
13bf0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
13c00 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69 6e 55 6e  P_SIZE>0.  winUn
13c10 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
13c20 23 65 6e 64 69 66 0a 0a 20 20 64 6f 7b 0a 20 20  #endif..  do{.  
13c30 20 20 72 63 20 3d 20 6f 73 43 6c 6f 73 65 48 61    rc = osCloseHa
13c40 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b 0a  ndle(pFile->h);.
13c50 20 20 20 20 2f 2a 20 53 69 6d 75 6c 61 74 65 49      /* SimulateI
13c60 4f 45 72 72 6f 72 28 20 72 63 3d 30 3b 20 63 6e  OError( rc=0; cn
13c70 74 3d 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45 4d  t=MX_CLOSE_ATTEM
13c80 50 54 3b 20 29 3b 20 2a 2f 0a 20 20 7d 77 68 69  PT; ); */.  }whi
13c90 6c 65 28 20 72 63 3d 3d 30 20 26 26 20 2b 2b 63  le( rc==0 && ++c
13ca0 6e 74 20 3c 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  nt < MX_CLOSE_AT
13cb0 54 45 4d 50 54 20 26 26 20 28 73 71 6c 69 74 65  TEMPT && (sqlite
13cc0 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31 30  3_win32_sleep(10
13cd0 30 29 2c 20 31 29 20 29 3b 0a 23 69 66 20 53 51  0), 1) );.#if SQ
13ce0 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 23 64  LITE_OS_WINCE.#d
13cf0 65 66 69 6e 65 20 57 49 4e 43 45 5f 44 45 4c 45  efine WINCE_DELE
13d00 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 20 33 0a  TION_ATTEMPTS 3.
13d10 20 20 77 69 6e 63 65 44 65 73 74 72 6f 79 4c 6f    winceDestroyLo
13d20 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  ck(pFile);.  if(
13d30 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f   pFile->zDeleteO
13d40 6e 43 6c 6f 73 65 20 29 7b 0a 20 20 20 20 69 6e  nClose ){.    in
13d50 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77  t cnt = 0;.    w
13d60 68 69 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  hile(.          
13d70 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 57 28 70   osDeleteFileW(p
13d80 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
13d90 6c 6f 73 65 29 3d 3d 30 0a 20 20 20 20 20 20 20  lose)==0.       
13da0 20 26 26 20 6f 73 47 65 74 46 69 6c 65 41 74 74   && osGetFileAtt
13db0 72 69 62 75 74 65 73 57 28 70 46 69 6c 65 2d 3e  ributesW(pFile->
13dc0 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 21  zDeleteOnClose)!
13dd0 3d 30 78 66 66 66 66 66 66 66 66 0a 20 20 20 20  =0xffffffff.    
13de0 20 20 20 20 26 26 20 63 6e 74 2b 2b 20 3c 20 57      && cnt++ < W
13df0 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
13e00 54 45 4d 50 54 53 0a 20 20 20 20 29 7b 0a 20 20  TEMPTS.    ){.  
13e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77 69 6e       sqlite3_win
13e20 33 32 5f 73 6c 65 65 70 28 31 30 30 29 3b 20 20  32_sleep(100);  
13e30 2f 2a 20 57 61 69 74 20 61 20 6c 69 74 74 6c 65  /* Wait a little
13e40 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 61   before trying a
13e50 67 61 69 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  gain */.    }.  
13e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
13e70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43  File->zDeleteOnC
13e80 6c 6f 73 65 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  lose);.  }.#endi
13e90 66 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  f.  if( rc ){.  
13ea0 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 4e 55 4c    pFile->h = NUL
13eb0 4c 3b 0a 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75  L;.  }.  OpenCou
13ec0 6e 74 65 72 28 2d 31 29 3b 0a 20 20 4f 53 54 52  nter(-1);.  OSTR
13ed0 41 43 45 28 28 22 43 4c 4f 53 45 20 70 69 64 3d  ACE(("CLOSE pid=
13ee0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
13ef0 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
13f00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
13f10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
13f20 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
13f30 6c 65 2d 3e 68 2c 20 72 63 20 3f 20 22 6f 6b 22  le->h, rc ? "ok"
13f40 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
13f50 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
13f60 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20  ITE_OK.         
13f70 20 20 20 3a 20 77 69 6e 4c 6f 67 45 72 72 6f 72     : winLogError
13f80 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c  (SQLITE_IOERR_CL
13f90 4f 53 45 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OSE, osGetLastEr
13fa0 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
13fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fc0 20 22 77 69 6e 43 6c 6f 73 65 22 2c 20 70 46 69   "winClose", pFi
13fd0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  le->zPath);.}../
13fe0 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
13ff0 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
14000 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
14010 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
14020 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
14030 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
14040 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
14050 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
14060 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
14070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
14080 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
14090 66 69 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20  file *id,       
140a0 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 72 65     /* File to re
140b0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 76 6f 69  ad from */.  voi
140c0 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
140d0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
140e0 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68   content into th
140f0 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  is buffer */.  i
14100 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20  nt amt,         
14110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
14120 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
14130 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  read */.  sqlite
14140 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20  3_int64 offset  
14150 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
14160 61 64 69 6e 67 20 61 74 20 74 68 69 73 20 6f 66  ading at this of
14170 66 73 65 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21  fset */.){.#if !
14180 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
14190 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
141a0 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
141b0 4c 41 50 50 45 44 29 0a 20 20 4f 56 45 52 4c 41  LAPPED).  OVERLA
141c0 50 50 45 44 20 6f 76 65 72 6c 61 70 70 65 64 3b  PPED overlapped;
141d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
141e0 20 6f 66 66 73 65 74 20 66 6f 72 20 52 65 61 64   offset for Read
141f0 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  File. */.#endif.
14200 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
14210 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
14220 20 20 2f 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65    /* file handle
14230 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6e 52 65 61   */.  DWORD nRea
14240 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
14250 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14260 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
14270 79 20 72 65 61 64 20 66 72 6f 6d 20 66 69 6c 65  y read from file
14280 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 74 72 79   */.  int nRetry
14290 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
142a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
142b0 6f 66 20 72 65 74 72 79 73 20 2a 2f 0a 0a 20 20  of retrys */..  
142c0 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
142d0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
142e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
142f0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 53 69 6d  fset>=0 );.  Sim
14300 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
14310 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14320 5f 52 45 41 44 29 3b 0a 20 20 4f 53 54 52 41 43  _READ);.  OSTRAC
14330 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14340 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14350 3d 25 70 2c 20 62 75 66 66 65 72 3d 25 70 2c 20  =%p, buffer=%p, 
14360 61 6d 6f 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20  amount=%d, ".   
14370 20 20 20 20 20 20 20 20 22 6f 66 66 73 65 74 3d          "offset=
14380 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  %lld, lock=%d\n"
14390 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
143a0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
143b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
143c0 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  le->h, pBuf, amt
143d0 2c 20 6f 66 66 73 65 74 2c 20 70 46 69 6c 65 2d  , offset, pFile-
143e0 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
143f0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
14400 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65  P_SIZE>0.  /* De
14410 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20  al with as much 
14420 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71  of this read req
14430 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
14440 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
14450 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
14460 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
14470 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
14480 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
14490 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
144a0 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
144b0 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
144c0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
144d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
144e0 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
144f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
14500 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20  ffset], amt);.  
14510 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45      OSTRACE(("RE
14520 41 44 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c  AD-MMAP pid=%lu,
14530 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
14540 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
14550 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
14560 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
14570 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
14580 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
14590 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
145a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
145b0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
145c0 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c 65  py = (int)(pFile
145d0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
145e0 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  set);.      memc
145f0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
14600 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
14610 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
14620 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
14630 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
14640 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
14650 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
14660 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
14670 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
14680 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
14690 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64 65  E_OS_WINCE || de
146a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
146b0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
146c0 29 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  ).  if( winSeekF
146d0 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ile(pFile, offse
146e0 74 29 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  t) ){.    OSTRAC
146f0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14700 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14710 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 46  =%p, rc=SQLITE_F
14720 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ULL\n",.        
14730 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
14740 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
14750 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
14760 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14770 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 77  TE_FULL;.  }.  w
14780 68 69 6c 65 28 20 21 6f 73 52 65 61 64 46 69 6c  hile( !osReadFil
14790 65 28 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66  e(pFile->h, pBuf
147a0 2c 20 61 6d 74 2c 20 26 6e 52 65 61 64 2c 20 30  , amt, &nRead, 0
147b0 29 20 29 7b 0a 23 65 6c 73 65 0a 20 20 6d 65 6d  ) ){.#else.  mem
147c0 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65 64 2c  set(&overlapped,
147d0 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c   0, sizeof(OVERL
147e0 41 50 50 45 44 29 29 3b 0a 20 20 6f 76 65 72 6c  APPED));.  overl
147f0 61 70 70 65 64 2e 4f 66 66 73 65 74 20 3d 20 28  apped.Offset = (
14800 4c 4f 4e 47 29 28 6f 66 66 73 65 74 20 26 20 30  LONG)(offset & 0
14810 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 6f 76  xffffffff);.  ov
14820 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48  erlapped.OffsetH
14830 69 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66  igh = (LONG)((of
14840 66 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66  fset>>32) & 0x7f
14850 66 66 66 66 66 66 29 3b 0a 20 20 77 68 69 6c 65  ffffff);.  while
14860 28 20 21 6f 73 52 65 61 64 46 69 6c 65 28 70 46  ( !osReadFile(pF
14870 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  ile->h, pBuf, am
14880 74 2c 20 26 6e 52 65 61 64 2c 20 26 6f 76 65 72  t, &nRead, &over
14890 6c 61 70 70 65 64 29 20 26 26 0a 20 20 20 20 20  lapped) &&.     
148a0 20 20 20 20 6f 73 47 65 74 4c 61 73 74 45 72 72      osGetLastErr
148b0 6f 72 28 29 21 3d 45 52 52 4f 52 5f 48 41 4e 44  or()!=ERROR_HAND
148c0 4c 45 5f 45 4f 46 20 29 7b 0a 23 65 6e 64 69 66  LE_EOF ){.#endif
148d0 0a 20 20 20 20 44 57 4f 52 44 20 6c 61 73 74 45  .    DWORD lastE
148e0 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 77 69  rrno;.    if( wi
148f0 6e 52 65 74 72 79 49 6f 65 72 72 28 26 6e 52 65  nRetryIoerr(&nRe
14900 74 72 79 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  try, &lastErrno)
14910 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14920 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
14930 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  o = lastErrno;. 
14940 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14950 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14960 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14970 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  =SQLITE_IOERR_RE
14980 41 44 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  AD\n",.         
14990 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
149a0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
149b0 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
149c0 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
149d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
149e0 45 52 52 5f 52 45 41 44 2c 20 70 46 69 6c 65 2d  ERR_READ, pFile-
149f0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14a10 20 20 20 22 77 69 6e 52 65 61 64 22 2c 20 70 46     "winRead", pF
14a20 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d  ile->zPath);.  }
14a30 0a 20 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e  .  winLogIoerr(n
14a40 52 65 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  Retry, __LINE__)
14a50 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 3c 28 44  ;.  if( nRead<(D
14a60 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
14a70 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
14a80 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
14a90 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
14aa0 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
14ab0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 6e  &((char*)pBuf)[n
14ac0 52 65 61 64 5d 2c 20 30 2c 20 61 6d 74 2d 6e 52  Read], 0, amt-nR
14ad0 65 61 64 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  ead);.    OSTRAC
14ae0 45 28 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75  E(("READ pid=%lu
14af0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
14b00 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49  =%p, rc=SQLITE_I
14b10 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 5c  OERR_SHORT_READ\
14b20 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
14b30 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
14b40 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
14b50 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
14b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14b70 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
14b80 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
14b90 28 22 52 45 41 44 20 70 69 64 3d 25 6c 75 2c 20  ("READ pid=%lu, 
14ba0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
14bb0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c  p, rc=SQLITE_OK\
14bc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
14bd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14be0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
14bf0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74  File->h));.  ret
14c00 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14c10 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
14c20 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
14c30 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
14c40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14c50 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
14c60 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
14c70 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
14c80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14c90 20 77 69 6e 57 72 69 74 65 28 0a 20 20 73 71 6c   winWrite(.  sql
14ca0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20  ite3_file *id,  
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14cc0 46 69 6c 65 20 74 6f 20 77 72 69 74 65 20 69 6e  File to write in
14cd0 74 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  to */.  const vo
14ce0 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
14cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
14d00 79 74 65 73 20 74 6f 20 62 65 20 77 72 69 74 74  ytes to be writt
14d10 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  en */.  int amt,
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14d40 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 77 72  r of bytes to wr
14d50 69 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ite */.  sqlite3
14d60 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 20 20  _int64 offset   
14d70 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
14d80 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
14d90 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
14da0 67 20 61 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  g at */.){.  int
14db0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14dd0 54 72 75 65 20 69 66 20 65 72 72 6f 72 20 68 61  True if error ha
14de0 73 20 6f 63 63 75 72 72 65 64 2c 20 65 6c 73 65  s occurred, else
14df0 20 66 61 6c 73 65 20 2a 2f 0a 20 20 77 69 6e 46   false */.  winF
14e00 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
14e10 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
14e20 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ile handle */.  
14e30 69 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20  int nRetry = 0; 
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74  /* Number of ret
14e60 72 69 65 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ries */..  asser
14e70 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61 73  t( amt>0 );.  as
14e80 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
14e90 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
14ea0 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49  (return SQLITE_I
14eb0 4f 45 52 52 5f 57 52 49 54 45 29 3b 0a 20 20 53  OERR_WRITE);.  S
14ec0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
14ed0 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49  rror(return SQLI
14ee0 54 45 5f 46 55 4c 4c 29 3b 0a 0a 20 20 4f 53 54  TE_FULL);..  OST
14ef0 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
14f00 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
14f10 66 69 6c 65 3d 25 70 2c 20 62 75 66 66 65 72 3d  file=%p, buffer=
14f20 25 70 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c 20 22  %p, amount=%d, "
14f30 0a 20 20 20 20 20 20 20 20 20 20 20 22 6f 66 66  .           "off
14f40 73 65 74 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25  set=%lld, lock=%
14f50 64 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65  d\n", osGetCurre
14f60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
14f70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20  File,.          
14f80 20 70 46 69 6c 65 2d 3e 68 2c 20 70 42 75 66 2c   pFile->h, pBuf,
14f90 20 61 6d 74 2c 20 6f 66 66 73 65 74 2c 20 70 46   amt, offset, pF
14fa0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b  ile->locktype));
14fb0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
14fc0 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
14fd0 49 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  ITE) && SQLITE_M
14fe0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
14ff0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
15000 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
15010 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
15020 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
15030 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
15040 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
15050 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
15060 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
15070 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
15080 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
15090 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
150a0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
150b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
150c0 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
150d0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
150e0 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
150f0 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  mt);.      OSTRA
15100 43 45 28 28 22 57 52 49 54 45 2d 4d 4d 41 50 20  CE(("WRITE-MMAP 
15110 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
15120 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
15130 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
15140 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65              osGe
15150 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
15160 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
15170 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
15180 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15190 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
151a0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69 6e   int nCopy = (in
151b0 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t)(pFile->mmapSi
151c0 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20 20  ze - offset);.  
151d0 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38      memcpy(&((u8
151e0 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
151f0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
15200 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a 20   pBuf, nCopy);. 
15210 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
15220 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
15230 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
15240 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
15250 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
15260 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
15270 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
15280 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  CE || defined(SQ
15290 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
152a0 45 52 4c 41 50 50 45 44 29 0a 20 20 72 63 20 3d  ERLAPPED).  rc =
152b0 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
152c0 6c 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69  le, offset);.  i
152d0 66 28 20 72 63 3d 3d 30 20 29 7b 0a 23 65 6c 73  f( rc==0 ){.#els
152e0 65 0a 20 20 7b 0a 23 65 6e 64 69 66 0a 23 69 66  e.  {.#endif.#if
152f0 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
15300 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  E && !defined(SQ
15310 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56  LITE_WIN32_NO_OV
15320 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 4f 56  ERLAPPED).    OV
15330 45 52 4c 41 50 50 45 44 20 6f 76 65 72 6c 61 70  ERLAPPED overlap
15340 70 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ped;        /* T
15350 68 65 20 6f 66 66 73 65 74 20 66 6f 72 20 57 72  he offset for Wr
15360 69 74 65 46 69 6c 65 2e 20 2a 2f 0a 23 65 6e 64  iteFile. */.#end
15370 69 66 0a 20 20 20 20 75 38 20 2a 61 52 65 6d 20  if.    u8 *aRem 
15380 3d 20 28 75 38 20 2a 29 70 42 75 66 3b 20 20 20  = (u8 *)pBuf;   
15390 20 20 20 20 20 2f 2a 20 44 61 74 61 20 79 65 74       /* Data yet
153a0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 2a   to be written *
153b0 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d  /.    int nRem =
153c0 20 61 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20   amt;           
153d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
153e0 20 62 79 74 65 73 20 79 65 74 20 74 6f 20 62 65   bytes yet to be
153f0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
15400 44 57 4f 52 44 20 6e 57 72 69 74 65 3b 20 20 20  DWORD nWrite;   
15410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15420 20 42 79 74 65 73 20 77 72 69 74 74 65 6e 20 62   Bytes written b
15430 79 20 65 61 63 68 20 57 72 69 74 65 46 69 6c 65  y each WriteFile
15440 28 29 20 63 61 6c 6c 20 2a 2f 0a 20 20 20 20 44  () call */.    D
15450 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d  WORD lastErrno =
15460 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 2f 2a 20   NO_ERROR;   /* 
15470 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
15480 79 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  y GetLastError()
15490 20 2a 2f 0a 0a 23 69 66 20 21 53 51 4c 49 54 45   */..#if !SQLITE
154a0 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65  _OS_WINCE && !de
154b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
154c0 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44  32_NO_OVERLAPPED
154d0 29 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 76  ).    memset(&ov
154e0 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
154f0 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
15500 3b 0a 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64  ;.    overlapped
15510 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
15520 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
15530 66 66 66 66 29 3b 0a 20 20 20 20 6f 76 65 72 6c  ffff);.    overl
15540 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69 67 68  apped.OffsetHigh
15550 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66 73 65   = (LONG)((offse
15560 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66 66 66  t>>32) & 0x7ffff
15570 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  fff);.#endif..  
15580 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
15590 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  ){.#if SQLITE_OS
155a0 5f 57 49 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65  _WINCE || define
155b0 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e  d(SQLITE_WIN32_N
155c0 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29 0a 20 20  O_OVERLAPPED).  
155d0 20 20 20 20 69 66 28 20 21 6f 73 57 72 69 74 65      if( !osWrite
155e0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 61  File(pFile->h, a
155f0 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57 72 69  Rem, nRem, &nWri
15600 74 65 2c 20 30 29 20 29 7b 0a 23 65 6c 73 65 0a  te, 0) ){.#else.
15610 20 20 20 20 20 20 69 66 28 20 21 6f 73 57 72 69        if( !osWri
15620 74 65 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  teFile(pFile->h,
15630 20 61 52 65 6d 2c 20 6e 52 65 6d 2c 20 26 6e 57   aRem, nRem, &nW
15640 72 69 74 65 2c 20 26 6f 76 65 72 6c 61 70 70 65  rite, &overlappe
15650 64 29 20 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20  d) ){.#endif.   
15660 20 20 20 20 20 69 66 28 20 77 69 6e 52 65 74 72       if( winRetr
15670 79 49 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20  yIoerr(&nRetry, 
15680 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f  &lastErrno) ) co
15690 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
156a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
156b0 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 57 72       assert( nWr
156c0 69 74 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65  ite==0 || nWrite
156d0 3c 3d 28 44 57 4f 52 44 29 6e 52 65 6d 20 29 3b  <=(DWORD)nRem );
156e0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
156f0 65 3d 3d 30 20 7c 7c 20 6e 57 72 69 74 65 3e 28  e==0 || nWrite>(
15700 44 57 4f 52 44 29 6e 52 65 6d 20 29 7b 0a 20 20  DWORD)nRem ){.  
15710 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
15720 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
15730 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ();.        brea
15740 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 20 21  k;.      }.#if !
15750 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15760 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
15770 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52  TE_WIN32_NO_OVER
15780 4c 41 50 50 45 44 29 0a 20 20 20 20 20 20 6f 66  LAPPED).      of
15790 66 73 65 74 20 2b 3d 20 6e 57 72 69 74 65 3b 0a  fset += nWrite;.
157a0 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
157b0 2e 4f 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29  .Offset = (LONG)
157c0 28 6f 66 66 73 65 74 20 26 20 30 78 66 66 66 66  (offset & 0xffff
157d0 66 66 66 66 29 3b 0a 20 20 20 20 20 20 6f 76 65  ffff);.      ove
157e0 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74 48 69  rlapped.OffsetHi
157f0 67 68 20 3d 20 28 4c 4f 4e 47 29 28 28 6f 66 66  gh = (LONG)((off
15800 73 65 74 3e 3e 33 32 29 20 26 20 30 78 37 66 66  set>>32) & 0x7ff
15810 66 66 66 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  fffff);.#endif. 
15820 20 20 20 20 20 61 52 65 6d 20 2b 3d 20 6e 57 72       aRem += nWr
15830 69 74 65 3b 0a 20 20 20 20 20 20 6e 52 65 6d 20  ite;.      nRem 
15840 2d 3d 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 7d  -= nWrite;.    }
15850 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3e 30 20  .    if( nRem>0 
15860 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
15870 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74  lastErrno = last
15880 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  Errno;.      rc 
15890 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
158a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
158b0 69 66 28 20 20 20 28 20 70 46 69 6c 65 2d 3e 6c  if(   ( pFile->l
158c0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
158d0 48 41 4e 44 4c 45 5f 44 49 53 4b 5f 46 55 4c 4c  HANDLE_DISK_FULL
158e0 20 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 20 70   ).       || ( p
158f0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
15900 3d 45 52 52 4f 52 5f 44 49 53 4b 5f 46 55 4c 4c  =ERROR_DISK_FULL
15910 20 29 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41   )){.      OSTRA
15920 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d 25  CE(("WRITE pid=%
15930 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
15940 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
15950 5f 46 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20  _FULL\n",.      
15960 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
15970 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
15980 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e  , pFile, pFile->
15990 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  h));.      retur
159a0 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
159b0 4c 49 54 45 5f 46 55 4c 4c 2c 20 70 46 69 6c 65  LITE_FULL, pFile
159c0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159e0 20 20 20 20 20 20 22 77 69 6e 57 72 69 74 65 31        "winWrite1
159f0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
15a00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52  ;.    }.    OSTR
15a10 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64 3d  ACE(("WRITE pid=
15a20 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
15a30 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
15a40 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 5c 6e 22  E_IOERR_WRITE\n"
15a50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  ,.             o
15a60 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15a70 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15a80 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
15a90 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
15aa0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  r(SQLITE_IOERR_W
15ab0 52 49 54 45 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  RITE, pFile->las
15ac0 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
15ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15ae0 77 69 6e 57 72 69 74 65 32 22 2c 20 70 46 69 6c  winWrite2", pFil
15af0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
15b00 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f 67 49 6f  se{.    winLogIo
15b10 65 72 72 28 6e 52 65 74 72 79 2c 20 5f 5f 4c 49  err(nRetry, __LI
15b20 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  NE__);.  }.  OST
15b30 52 41 43 45 28 28 22 57 52 49 54 45 20 70 69 64  RACE(("WRITE pid
15b40 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
15b50 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
15b60 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
15b70 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
15b80 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
15b90 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
15ba0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15bb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  _OK;.}../*.** Tr
15bc0 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
15bd0 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
15be0 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69  ed size.*/.stati
15bf0 63 20 69 6e 74 20 77 69 6e 54 72 75 6e 63 61 74  c int winTruncat
15c00 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
15c10 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
15c20 34 20 6e 42 79 74 65 29 7b 0a 20 20 77 69 6e 46  4 nByte){.  winF
15c30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69  ile *pFile = (wi
15c40 6e 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 46  nFile*)id;  /* F
15c50 69 6c 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ile handle objec
15c60 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  t */.  int rc = 
15c70 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
15c80 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
15c90 20 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 66   code for this f
15ca0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 44 57 4f  unction */.  DWO
15cb0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 0a 20  RD lastErrno;.. 
15cc0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
15cd0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
15ce0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
15cf0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
15d00 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
15d10 52 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c  RUNCATE pid=%lu,
15d20 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
15d30 25 70 2c 20 73 69 7a 65 3d 25 6c 6c 64 2c 20 6c  %p, size=%lld, l
15d40 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ock=%d\n",.     
15d50 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
15d60 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
15d70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
15d80 6e 42 79 74 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f  nByte, pFile->lo
15d90 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
15da0 49 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20  If the user has 
15db0 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75  configured a chu
15dc0 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73  nk-size for this
15dd0 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20   file, truncate 
15de0 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f  the.  ** file so
15df0 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74   that it consist
15e00 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20  s of an integer 
15e10 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73  number of chunks
15e20 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20   (i.e. the.  ** 
15e30 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65  actual file size
15e40 20 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61   after the opera
15e50 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67  tion may be larg
15e60 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
15e70 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29  ested.  ** size)
15e80 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
15e90 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
15ea0 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e  .    nByte = ((n
15eb0 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a  Byte + pFile->sz
15ec0 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65  Chunk - 1)/pFile
15ed0 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69  ->szChunk) * pFi
15ee0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d  le->szChunk;.  }
15ef0 0a 0a 20 20 2f 2a 20 53 65 74 45 6e 64 4f 66 46  ..  /* SetEndOfF
15f00 69 6c 65 28 29 20 72 65 74 75 72 6e 73 20 6e 6f  ile() returns no
15f10 6e 2d 7a 65 72 6f 20 77 68 65 6e 20 73 75 63 63  n-zero when succ
15f20 65 73 73 66 75 6c 2c 20 6f 72 20 7a 65 72 6f 20  essful, or zero 
15f30 77 68 65 6e 20 69 74 20 66 61 69 6c 73 2e 20 2a  when it fails. *
15f40 2f 0a 20 20 69 66 28 20 77 69 6e 53 65 65 6b 46  /.  if( winSeekF
15f50 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
15f60 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  ) ){.    rc = wi
15f70 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
15f80 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
15f90 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15fa0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
15fb0 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
15fc0 63 61 74 65 31 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate1", pFile->z
15fd0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Path);.  }else i
15fe0 66 28 20 30 3d 3d 6f 73 53 65 74 45 6e 64 4f 66  f( 0==osSetEndOf
15ff0 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 29 20 26  File(pFile->h) &
16000 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 28  &.            ((
16010 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
16020 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21 3d 45  tLastError())!=E
16030 52 52 4f 52 5f 55 53 45 52 5f 4d 41 50 50 45 44  RROR_USER_MAPPED
16040 5f 46 49 4c 45 29 20 29 7b 0a 20 20 20 20 70 46  _FILE) ){.    pF
16050 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16060 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
16070 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72  rc = winLogError
16080 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
16090 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d 3e 6c  UNCATE, pFile->l
160a0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
160c0 77 69 6e 54 72 75 6e 63 61 74 65 32 22 2c 20 70  winTruncate2", p
160d0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
160e0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  }..#if SQLITE_MA
160f0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
16100 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  /* If the file w
16110 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  as truncated to 
16120 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
16130 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
16140 79 0a 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65  y.  ** mapped re
16150 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65  gion, reduce the
16160 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70 69   effective mappi
16170 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e  ng size as well.
16180 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 2a   SQLite will.  *
16190 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
161a0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
161b0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
161c0 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
161d0 6f 77 20 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ow on..  */.  if
161e0 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
161f0 69 6f 6e 20 26 26 20 6e 42 79 74 65 3c 70 46 69  ion && nByte<pFi
16200 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
16210 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
16220 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  ize = nByte;.  }
16230 0a 23 65 6e 64 69 66 0a 0a 20 20 4f 53 54 52 41  .#endif..  OSTRA
16240 43 45 28 28 22 54 52 55 4e 43 41 54 45 20 70 69  CE(("TRUNCATE pi
16250 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16260 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
16270 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
16280 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
16290 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
162a0 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
162b0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
162c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
162d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
162e0 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
162f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
16300 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
16310 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
16320 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
16330 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
16340 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
16350 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
16360 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
16370 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
16380 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
16390 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
163a0 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
163b0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
163c0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
163d0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
163e0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
163f0 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
16400 69 63 20 69 6e 74 20 77 69 6e 53 79 6e 63 28 73  ic int winSync(s
16410 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16420 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 23 69 66   int flags){.#if
16430 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  ndef SQLITE_NO_S
16440 59 4e 43 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  YNC.  /*.  ** Us
16450 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 53 51 4c  ed only when SQL
16460 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69 73 20 6e  ITE_NO_SYNC is n
16470 6f 74 20 64 65 66 69 6e 65 64 2e 0a 20 20 20 2a  ot defined..   *
16480 2f 0a 20 20 42 4f 4f 4c 20 72 63 3b 0a 23 65 6e  /.  BOOL rc;.#en
16490 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
164a0 28 4e 44 45 42 55 47 29 20 7c 7c 20 21 64 65 66  (NDEBUG) || !def
164b0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 5f 53  ined(SQLITE_NO_S
164c0 59 4e 43 29 20 7c 7c 20 5c 0a 20 20 20 20 64 65  YNC) || \.    de
164d0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56  fined(SQLITE_HAV
164e0 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 2f 2a  E_OS_TRACE).  /*
164f0 0a 20 20 2a 2a 20 55 73 65 64 20 77 68 65 6e 20  .  ** Used when 
16500 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 69  SQLITE_NO_SYNC i
16510 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 61 6e  s not defined an
16520 64 20 62 79 20 74 68 65 20 61 73 73 65 72 74 28  d by the assert(
16530 29 20 61 6e 64 2f 6f 72 0a 20 20 2a 2a 20 4f 53  ) and/or.  ** OS
16540 54 52 41 43 45 28 29 20 6d 61 63 72 6f 73 2e 0a  TRACE() macros..
16550 20 20 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20     */.  winFile 
16560 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c  *pFile = (winFil
16570 65 2a 29 69 64 3b 0a 23 65 6c 73 65 0a 20 20 55  e*)id;.#else.  U
16580 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
16590 69 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  id);.#endif..  a
165a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
165b0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
165c0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
165d0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
165e0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
165f0 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
16600 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
16610 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
16620 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
16630 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
16640 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
16650 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
16660 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
16670 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
16680 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
16690 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
166a0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
166b0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
166c0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
166d0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
166e0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
166f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
16700 4c 4c 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45  LL );..  OSTRACE
16710 28 28 22 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c  (("SYNC pid=%lu,
16720 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d   pFile=%p, file=
16730 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6c 6f  %p, flags=%x, lo
16740 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
16750 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
16760 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
16770 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 66  ile, pFile->h, f
16780 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
16790 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
167a0 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
167b0 49 54 45 5f 54 45 53 54 0a 20 20 55 4e 55 53 45  ITE_TEST.  UNUSE
167c0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 6c 61 67  D_PARAMETER(flag
167d0 73 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  s);.#else.  if( 
167e0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
167f0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 20 29  LITE_SYNC_FULL )
16800 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 75  {.    sqlite3_fu
16810 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
16820 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 79    }.  sqlite3_sy
16830 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
16840 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
16850 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
16860 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16870 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
16880 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
16890 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
168a0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
168b0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4e  OSTRACE(("SYNC-N
168c0 4f 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  OP pid=%lu, pFil
168d0 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72  e=%p, file=%p, r
168e0 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
168f0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
16900 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
16910 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
16920 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->h));.  return 
16930 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65  SQLITE_OK;.#else
16940 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
16950 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
16960 28 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  ( pFile->pMapReg
16970 69 6f 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ion ){.    if( o
16980 73 46 6c 75 73 68 56 69 65 77 4f 66 46 69 6c 65  sFlushViewOfFile
16990 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
169a0 6f 6e 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  on, 0) ){.      
169b0 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 2d 4d  OSTRACE(("SYNC-M
169c0 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  MAP pid=%lu, pFi
169d0 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67 69 6f  le=%p, pMapRegio
169e0 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20 20 20  n=%p, ".        
169f0 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c 49 54         "rc=SQLIT
16a00 45 5f 4f 4b 5c 6e 22 2c 20 6f 73 47 65 74 43 75  E_OK\n", osGetCu
16a10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
16a20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16a30 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 70   pFile, pFile->p
16a40 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20  MapRegion));.   
16a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
16a60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
16a70 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
16a80 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
16a90 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16aa0 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16ab0 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
16ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16ad0 22 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  "rc=SQLITE_IOERR
16ae0 5f 4d 4d 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43  _MMAP\n", osGetC
16af0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
16b00 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
16b10 20 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e    pFile, pFile->
16b20 70 4d 61 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20  pMapRegion));.  
16b30 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
16b40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
16b50 45 52 52 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d  ERR_MMAP, pFile-
16b60 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 22 77 69 6e 53 79 6e 63 31 22 2c       "winSync1",
16b90 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16ba0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
16bb0 0a 20 20 72 63 20 3d 20 6f 73 46 6c 75 73 68 46  .  rc = osFlushF
16bc0 69 6c 65 42 75 66 66 65 72 73 28 70 46 69 6c 65  ileBuffers(pFile
16bd0 2d 3e 68 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ->h);.  Simulate
16be0 49 4f 45 72 72 6f 72 28 20 72 63 3d 46 41 4c 53  IOError( rc=FALS
16bf0 45 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  E );.  if( rc ){
16c00 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 53  .    OSTRACE(("S
16c10 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  YNC pid=%lu, pFi
16c20 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
16c30 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
16c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
16c50 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
16c60 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
16c70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
16c80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
16ca0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
16cb0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
16cc0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
16cd0 53 59 4e 43 20 70 69 64 3d 25 6c 75 2c 20 70 46  SYNC pid=%lu, pF
16ce0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
16cf0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
16d00 5f 46 53 59 4e 43 5c 6e 22 2c 0a 20 20 20 20 20  _FSYNC\n",.     
16d10 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16d20 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16d30 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16d40 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
16d50 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
16d60 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 70  E_IOERR_FSYNC, p
16d70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
16d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16d90 20 20 20 20 20 20 20 20 22 77 69 6e 53 79 6e 63          "winSync
16da0 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  2", pFile->zPath
16db0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
16dc0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
16dd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
16de0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
16df0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
16e00 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 73  nt winFileSize(s
16e10 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
16e20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
16e30 70 53 69 7a 65 29 7b 0a 20 20 77 69 6e 46 69 6c  pSize){.  winFil
16e40 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46  e *pFile = (winF
16e50 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  ile*)id;.  int r
16e60 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
16e70 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
16e80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 69  );.  assert( pSi
16e90 7a 65 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  ze!=0 );.  Simul
16ea0 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72  ateIOError(retur
16eb0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
16ec0 53 54 41 54 29 3b 0a 20 20 4f 53 54 52 41 43 45  STAT);.  OSTRACE
16ed0 28 28 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c  (("SIZE file=%p,
16ee0 20 70 53 69 7a 65 3d 25 70 5c 6e 22 2c 20 70 46   pSize=%p\n", pF
16ef0 69 6c 65 2d 3e 68 2c 20 70 53 69 7a 65 29 29 3b  ile->h, pSize));
16f00 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
16f10 57 49 4e 52 54 0a 20 20 7b 0a 20 20 20 20 46 49  WINRT.  {.    FI
16f20 4c 45 5f 53 54 41 4e 44 41 52 44 5f 49 4e 46 4f  LE_STANDARD_INFO
16f30 20 69 6e 66 6f 3b 0a 20 20 20 20 69 66 28 20 6f   info;.    if( o
16f40 73 47 65 74 46 69 6c 65 49 6e 66 6f 72 6d 61 74  sGetFileInformat
16f50 69 6f 6e 42 79 48 61 6e 64 6c 65 45 78 28 70 46  ionByHandleEx(pF
16f60 69 6c 65 2d 3e 68 2c 20 46 69 6c 65 53 74 61 6e  ile->h, FileStan
16f70 64 61 72 64 49 6e 66 6f 2c 0a 20 20 20 20 20 20  dardInfo,.      
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
16fa0 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66  info, sizeof(inf
16fb0 6f 29 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 53  o)) ){.      *pS
16fc0 69 7a 65 20 3d 20 69 6e 66 6f 2e 45 6e 64 4f 66  ize = info.EndOf
16fd0 46 69 6c 65 2e 51 75 61 64 50 61 72 74 3b 0a 20  File.QuadPart;. 
16fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16ff0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17000 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
17010 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
17020 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17030 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 2c 20  TE_IOERR_FSTAT, 
17040 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
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 20 22 77 69 6e 46 69 6c           "winFil
17070 65 53 69 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  eSize", pFile->z
17080 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
17090 0a 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44  .#else.  {.    D
170a0 57 4f 52 44 20 75 70 70 65 72 42 69 74 73 3b 0a  WORD upperBits;.
170b0 20 20 20 20 44 57 4f 52 44 20 6c 6f 77 65 72 42      DWORD lowerB
170c0 69 74 73 3b 0a 20 20 20 20 44 57 4f 52 44 20 6c  its;.    DWORD l
170d0 61 73 74 45 72 72 6e 6f 3b 0a 0a 20 20 20 20 6c  astErrno;..    l
170e0 6f 77 65 72 42 69 74 73 20 3d 20 6f 73 47 65 74  owerBits = osGet
170f0 46 69 6c 65 53 69 7a 65 28 70 46 69 6c 65 2d 3e  FileSize(pFile->
17100 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a  h, &upperBits);.
17110 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28      *pSize = (((
17120 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 75 70  sqlite3_int64)up
17130 70 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20  perBits)<<32) + 
17140 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20 20 20 69  lowerBits;.    i
17150 66 28 20 20 20 28 6c 6f 77 65 72 42 69 74 73 20  f(   (lowerBits 
17160 3d 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  == INVALID_FILE_
17170 53 49 5a 45 29 0a 20 20 20 20 20 20 20 26 26 20  SIZE).       && 
17180 28 28 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73  ((lastErrno = os
17190 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 21  GetLastError())!
171a0 3d 4e 4f 5f 45 52 52 4f 52 29 20 29 7b 0a 20 20  =NO_ERROR) ){.  
171b0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
171c0 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f  rrno = lastErrno
171d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
171e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
171f0 49 4f 45 52 52 5f 46 53 54 41 54 2c 20 70 46 69  IOERR_FSTAT, pFi
17200 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 20 20 22 77 69 6e 46 69 6c 65 53 69        "winFileSi
17230 7a 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ze", pFile->zPat
17240 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  h);.    }.  }.#e
17250 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
17260 22 53 49 5a 45 20 66 69 6c 65 3d 25 70 2c 20 70  "SIZE file=%p, p
17270 53 69 7a 65 3d 25 70 2c 20 2a 70 53 69 7a 65 3d  Size=%p, *pSize=
17280 25 6c 6c 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  %lld, rc=%s\n",.
17290 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
172a0 2d 3e 68 2c 20 70 53 69 7a 65 2c 20 2a 70 53 69  ->h, pSize, *pSi
172b0 7a 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  ze, sqlite3ErrNa
172c0 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
172d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
172e0 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
172f0 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
17300 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
17310 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
17320 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
17330 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17340 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
17350 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
17360 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
17370 0a 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46 49  ..#ifndef LOCKFI
17380 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  LE_EXCLUSIVE_LOC
17390 4b 0a 23 20 64 65 66 69 6e 65 20 4c 4f 43 4b 46  K.# define LOCKF
173a0 49 4c 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ILE_EXCLUSIVE_LO
173b0 43 4b 20 32 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  CK 2.#endif../*.
173c0 2a 2a 20 48 69 73 74 6f 72 69 63 61 6c 6c 79 2c  ** Historically,
173d0 20 53 51 4c 69 74 65 20 68 61 73 20 75 73 65 64   SQLite has used
173e0 20 62 6f 74 68 20 74 68 65 20 4c 6f 63 6b 46 69   both the LockFi
173f0 6c 65 20 61 6e 64 20 4c 6f 63 6b 46 69 6c 65 45  le and LockFileE
17400 78 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 20  x functions..** 
17410 57 68 65 6e 20 74 68 65 20 4c 6f 63 6b 46 69 6c  When the LockFil
17420 65 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 75  e function was u
17430 73 65 64 2c 20 69 74 20 77 61 73 20 61 6c 77 61  sed, it was alwa
17440 79 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 66  ys expected to f
17450 61 69 6c 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ail.** immediate
17460 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 63  ly if the lock c
17470 6f 75 6c 64 20 6e 6f 74 20 62 65 20 6f 62 74 61  ould not be obta
17480 69 6e 65 64 2e 20 20 41 6c 73 6f 2c 20 69 74 20  ined.  Also, it 
17490 61 6c 77 61 79 73 20 65 78 70 65 63 74 65 64 20  always expected 
174a0 74 6f 0a 2a 2a 20 6f 62 74 61 69 6e 20 61 6e 20  to.** obtain an 
174b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20  exclusive lock. 
174c0 20 54 68 65 73 65 20 66 6c 61 67 73 20 61 72 65   These flags are
174d0 20 75 73 65 64 20 77 69 74 68 20 74 68 65 20 4c   used with the L
174e0 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74 69  ockFileEx functi
174f0 6f 6e 0a 2a 2a 20 61 6e 64 20 72 65 66 6c 65 63  on.** and reflec
17500 74 20 74 68 6f 73 65 20 65 78 70 65 63 74 61 74  t those expectat
17510 69 6f 6e 73 3b 20 74 68 65 72 65 66 6f 72 65 2c  ions; therefore,
17520 20 74 68 65 79 20 73 68 6f 75 6c 64 20 6e 6f 74   they should not
17530 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a   be changed..*/.
17540 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
17550 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 0a 23 20  OCKFILE_FLAGS.# 
17560 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4c 4f  define SQLITE_LO
17570 43 4b 46 49 4c 45 5f 46 4c 41 47 53 20 20 20 28  CKFILE_FLAGS   (
17580 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
17590 4d 45 44 49 41 54 45 4c 59 20 7c 20 5c 0a 20 20  MEDIATELY | \.  
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c 55 53 49  LOCKFILE_EXCLUSI
175d0 56 45 5f 4c 4f 43 4b 29 0a 23 65 6e 64 69 66 0a  VE_LOCK).#endif.
175e0 0a 2f 2a 0a 2a 2a 20 43 75 72 72 65 6e 74 6c 79  ./*.** Currently
175f0 2c 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 63  , SQLite never c
17600 61 6c 6c 73 20 74 68 65 20 4c 6f 63 6b 46 69 6c  alls the LockFil
17610 65 45 78 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  eEx function wit
17620 68 6f 75 74 20 77 61 6e 74 69 6e 67 20 74 68 65  hout wanting the
17630 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 61 69 6c  .** call to fail
17640 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20   immediately if 
17650 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
17660 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 2a 2f 0a  be obtained..*/.
17670 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4c  #ifndef SQLITE_L
17680 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 0a  OCKFILEEX_FLAGS.
17690 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
176a0 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
176b0 20 28 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f   (LOCKFILE_FAIL_
176c0 49 4d 4d 45 44 49 41 54 45 4c 59 29 0a 23 65 6e  IMMEDIATELY).#en
176d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  dif../*.** Acqui
176e0 72 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b  re a reader lock
176f0 2e 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20 41  ..** Different A
17700 50 49 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  PI routines are 
17710 63 61 6c 6c 65 64 20 64 65 70 65 6e 64 69 6e 67  called depending
17720 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
17730 6f 74 20 74 68 69 73 0a 2a 2a 20 69 73 20 57 69  ot this.** is Wi
17740 6e 39 78 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f  n9x or WinNT..*/
17750 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47  .static int winG
17760 65 74 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69  etReadLock(winFi
17770 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e  le *pFile){.  in
17780 74 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  t res;.  OSTRACE
17790 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20 66 69 6c  (("READ-LOCK fil
177a0 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
177b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
177c0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
177d0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
177e0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
177f0 49 4e 43 45 0a 20 20 20 20 2f 2a 0a 20 20 20 20  INCE.    /*.    
17800 2a 2a 20 4e 4f 54 45 3a 20 57 69 6e 64 6f 77 73  ** NOTE: Windows
17810 20 43 45 20 69 73 20 68 61 6e 64 6c 65 64 20 64   CE is handled d
17820 69 66 66 65 72 65 6e 74 6c 79 20 68 65 72 65 20  ifferently here 
17830 64 75 65 20 69 74 73 20 6c 61 63 6b 20 6f 66 20  due its lack of 
17840 74 68 65 20 57 69 6e 33 32 0a 20 20 20 20 2a 2a  the Win32.    **
17850 20 20 20 20 20 20 20 41 50 49 20 4c 6f 63 6b 46         API LockF
17860 69 6c 65 45 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  ileEx..    */.  
17870 20 20 72 65 73 20 3d 20 77 69 6e 63 65 4c 6f 63    res = winceLoc
17880 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
17890 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30   SHARED_FIRST, 0
178a0 2c 20 31 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20  , 1, 0);.#else. 
178b0 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b     res = winLock
178c0 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20  File(&pFile->h, 
178d0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 45  SQLITE_LOCKFILEE
178e0 58 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44 5f  X_FLAGS, SHARED_
178f0 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20 20  FIRST, 0,.      
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b  SHARED_SIZE, 0);
17920 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
17930 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
17940 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
17950 0a 20 20 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20  .    int lk;.   
17960 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
17970 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
17980 26 6c 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  &lk);.    pFile-
17990 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20  >sharedLockByte 
179a0 3d 20 28 73 68 6f 72 74 29 28 28 6c 6b 20 26 20  = (short)((lk & 
179b0 30 78 37 66 66 66 66 66 66 66 29 25 28 53 48 41  0x7fffffff)%(SHA
179c0 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 29 3b 0a  RED_SIZE - 1));.
179d0 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f 63      res = winLoc
179e0 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c  kFile(&pFile->h,
179f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17a00 5f 46 4c 41 47 53 2c 0a 20 20 20 20 20 20 20 20  _FLAGS,.        
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
17a20 41 52 45 44 5f 46 49 52 53 54 2b 70 46 69 6c 65  ARED_FIRST+pFile
17a30 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  ->sharedLockByte
17a40 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  , 0, 1, 0);.  }.
17a50 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 65 73  #endif.  if( res
17a60 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   == 0 ){.    pFi
17a70 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17a80 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
17a90 3b 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ;.    /* No need
17aa0 20 74 6f 20 6c 6f 67 20 61 20 66 61 69 6c 75 72   to log a failur
17ab0 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d  e to lock */.  }
17ac0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
17ad0 44 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  D-LOCK file=%p, 
17ae0 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c 20 70 46  result=%d\n", pF
17af0 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20  ile->h, res));. 
17b00 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
17b10 2f 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61  /*.** Undo a rea
17b20 64 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  dlock.*/.static 
17b30 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 52 65 61  int winUnlockRea
17b40 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  dLock(winFile *p
17b50 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73  File){.  int res
17b60 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
17b70 72 6e 6f 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  rno;.  OSTRACE((
17b80 22 52 45 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c  "READ-UNLOCK fil
17b90 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22  e=%p, lock=%d\n"
17ba0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c  , pFile->h, pFil
17bb0 65 2d 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 20  e->locktype));. 
17bc0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
17bd0 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
17be0 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d  lockFile(&pFile-
17bf0 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
17c00 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
17c10 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66  , 0);.  }.#ifdef
17c20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41   SQLITE_WIN32_HA
17c30 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20  S_ANSI.  else{. 
17c40 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f     res = winUnlo
17c50 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
17c60 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  , SHARED_FIRST+p
17c70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b  File->sharedLock
17c80 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  Byte, 0, 1, 0);.
17c90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
17ca0 20 72 65 73 3d 3d 30 20 26 26 20 28 28 6c 61 73   res==0 && ((las
17cb0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17cc0 73 74 45 72 72 6f 72 28 29 29 21 3d 45 52 52 4f  stError())!=ERRO
17cd0 52 5f 4e 4f 54 5f 4c 4f 43 4b 45 44 29 20 29 7b  R_NOT_LOCKED) ){
17ce0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
17cf0 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e  Errno = lastErrn
17d00 6f 3b 0a 20 20 20 20 77 69 6e 4c 6f 67 45 72 72  o;.    winLogErr
17d10 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
17d20 55 4e 4c 4f 43 4b 2c 20 70 46 69 6c 65 2d 3e 6c  UNLOCK, pFile->l
17d30 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
17d40 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55 6e            "winUn
17d50 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 22 2c 20 70  lockReadLock", p
17d60 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
17d70 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  }.  OSTRACE(("RE
17d80 41 44 2d 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25  AD-UNLOCK file=%
17d90 70 2c 20 72 65 73 75 6c 74 3d 25 64 5c 6e 22 2c  p, result=%d\n",
17da0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29   pFile->h, res))
17db0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
17dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
17dd0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
17de0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
17df0 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
17e00 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
17e10 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
17e20 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
17e30 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
17e40 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
17e50 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
17e60 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
17e70 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
17e80 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
17e90 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
17ea0 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
17eb0 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
17ec0 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
17ed0 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
17ee0 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
17ef0 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
17f00 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
17f10 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
17f20 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
17f30 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
17f40 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
17f50 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
17f60 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
17f70 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
17f80 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
17f90 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
17fa0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
17fb0 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
17fc0 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
17fd0 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
17fe0 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
17ff0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
18000 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
18010 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
18020 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
18030 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
18040 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
18050 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
18060 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
18070 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
18080 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
18090 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
180a0 6b 2e 20 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63  k.  The winUnloc
180b0 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
180c0 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
180d0 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
180e0 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
180f0 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
18100 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
18110 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
18120 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
18130 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
18140 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
18150 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
18160 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
18170 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
18180 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 73  ic int winLock(s
18190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
181a0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
181b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
181c0 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 74 75  E_OK;    /* Retu
181d0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  rn code from sub
181e0 72 6f 75 74 69 6e 65 73 20 2a 2f 0a 20 20 69 6e  routines */.  in
181f0 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20 20  t res = 1;      
18200 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6f       /* Result o
18210 66 20 61 20 57 69 6e 64 6f 77 73 20 6c 6f 63 6b  f a Windows lock
18220 20 63 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e   call */.  int n
18230 65 77 4c 6f 63 6b 74 79 70 65 3b 20 20 20 20 20  ewLocktype;     
18240 20 20 2f 2a 20 53 65 74 20 70 46 69 6c 65 2d 3e    /* Set pFile->
18250 6c 6f 63 6b 74 79 70 65 20 74 6f 20 74 68 69 73  locktype to this
18260 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 65 78   value before ex
18270 69 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 67  iting */.  int g
18280 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
18290 30 3b 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20  0;/* True if we 
182a0 61 63 71 75 69 72 65 64 20 61 20 50 45 4e 44 49  acquired a PENDI
182b0 4e 47 20 6c 6f 63 6b 20 74 68 69 73 20 74 69 6d  NG lock this tim
182c0 65 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a  e */.  winFile *
182d0 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
182e0 2a 29 69 64 3b 0a 20 20 44 57 4f 52 44 20 6c 61  *)id;.  DWORD la
182f0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
18300 4f 52 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  OR;..  assert( i
18310 64 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  d!=0 );.  OSTRAC
18320 45 28 28 22 4c 4f 43 4b 20 66 69 6c 65 3d 25 70  E(("LOCK file=%p
18330 2c 20 6f 6c 64 4c 6f 63 6b 3d 25 64 28 25 64 29  , oldLock=%d(%d)
18340 2c 20 6e 65 77 4c 6f 63 6b 3d 25 64 5c 6e 22 2c  , newLock=%d\n",
18350 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18360 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63  e->h, pFile->loc
18370 6b 74 79 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68  ktype, pFile->sh
18380 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 6c 6f  aredLockByte, lo
18390 63 6b 74 79 70 65 29 29 3b 0a 0a 20 20 2f 2a 20  cktype));..  /* 
183a0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
183b0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
183c0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
183d0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
183e0 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65 2c 20  he.  ** OsFile, 
183f0 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
18400 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
18410 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
18420 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4f 73  s.  ** sqlite3Os
18430 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
18440 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
18450 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
18460 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e  pFile->locktype>
18470 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
18480 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d   OSTRACE(("LOCK-
18490 48 45 4c 44 20 66 69 6c 65 3d 25 70 2c 20 72 63  HELD file=%p, rc
184a0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
184b0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
184c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
184d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  .  }..  /* Do no
184e0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 6b 69 6e 64  t allow any kind
184f0 20 6f 66 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f   of write-lock o
18500 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  n a read-only da
18510 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 69 66  tabase.  */.  if
18520 28 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  ( (pFile->ctrlFl
18530 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
18540 4f 4e 4c 59 29 21 3d 30 20 26 26 20 6c 6f 63 6b  ONLY)!=0 && lock
18550 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c  type>=RESERVED_L
18560 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  OCK ){.    retur
18570 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
18580 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  OCK;.  }..  /* M
18590 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
185a0 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
185b0 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
185c0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
185d0 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
185e0 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
185f0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
18600 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
18610 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
18620 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
18630 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
18640 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
18650 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
18660 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
18670 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
18680 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
18690 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
186a0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
186b0 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
186c0 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
186d0 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
186e0 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
186f0 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
18700 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
18710 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
18720 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
18730 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
18740 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 20  ocktype;.  if(  
18750 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70   (pFile->locktyp
18760 65 3d 3d 4e 4f 5f 4c 4f 43 4b 29 0a 20 20 20 20  e==NO_LOCK).    
18770 20 7c 7c 20 28 20 20 20 28 6c 6f 63 6b 74 79 70   || (   (locktyp
18780 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
18790 4b 29 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  K).         && (
187a0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d  pFile->locktype=
187b0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 29  =RESERVED_LOCK))
187c0 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e  .  ){.    int cn
187d0 74 20 3d 20 33 3b 0a 20 20 20 20 77 68 69 6c 65  t = 3;.    while
187e0 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
187f0 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28  s = winLockFile(
18800 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54  &pFile->h, SQLIT
18810 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53  E_LOCKFILE_FLAGS
18820 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
18830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18840 20 20 20 20 20 20 20 20 20 20 20 50 45 4e 44 49             PENDI
18850 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  NG_BYTE, 0, 1, 0
18860 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ))==0 ){.      /
18870 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
18880 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
18890 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 69 73 20   lock.  This is 
188a0 6e 65 65 64 65 64 20 74 6f 20 77 6f 72 6b 0a 20  needed to work. 
188b0 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e 64 20 70       ** around p
188c0 72 6f 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62  roblems caused b
188d0 79 20 69 6e 64 65 78 69 6e 67 20 61 6e 64 2f 6f  y indexing and/o
188e0 72 20 61 6e 74 69 2d 76 69 72 75 73 20 73 6f 66  r anti-virus sof
188f0 74 77 61 72 65 20 6f 6e 0a 20 20 20 20 20 20 2a  tware on.      *
18900 2a 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65 6d  * Windows system
18910 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 79  s..      ** If y
18920 6f 75 20 61 72 65 20 75 73 69 6e 67 20 74 68 69  ou are using thi
18930 73 20 63 6f 64 65 20 61 73 20 61 20 6d 6f 64 65  s code as a mode
18940 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61 74 69 76  l for alternativ
18950 65 20 56 46 53 65 73 2c 20 64 6f 20 6e 6f 74 0a  e VFSes, do not.
18960 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 74 68        ** copy th
18970 69 73 20 72 65 74 72 79 20 6c 6f 67 69 63 2e 20  is retry logic. 
18980 20 49 74 20 69 73 20 61 20 68 61 63 6b 20 69 6e   It is a hack in
18990 74 65 6e 64 65 64 20 66 6f 72 20 57 69 6e 64 6f  tended for Windo
189a0 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20 2a  ws only..      *
189b0 2f 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  /.      lastErrn
189c0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
189d0 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  or();.      OSTR
189e0 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45 4e 44 49  ACE(("LOCK-PENDI
189f0 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c  NG-FAIL file=%p,
18a00 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65 73 75 6c   count=%d, resul
18a10 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
18a20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68          pFile->h
18a30 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b 0a 20 20  , cnt, res));.  
18a40 20 20 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e      if( lastErrn
18a50 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41 4c 49 44  o==ERROR_INVALID
18a60 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20 20 20 20  _HANDLE ){.     
18a70 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72     pFile->lastEr
18a80 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b  rno = lastErrno;
18a90 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
18aa0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
18ab0 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45  .        OSTRACE
18ac0 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20 66 69 6c  (("LOCK-FAIL fil
18ad0 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20  e=%p, count=%d, 
18ae0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
18af0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18b00 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c 69 74 65  ->h, cnt, sqlite
18b10 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a  3ErrName(rc)));.
18b20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
18b30 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
18b40 20 69 66 28 20 63 6e 74 20 29 20 73 71 6c 69 74   if( cnt ) sqlit
18b50 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 31  e3_win32_sleep(1
18b60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
18b70 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 72 65  PendingLock = re
18b80 73 3b 0a 20 20 20 20 69 66 28 20 21 72 65 73 20  s;.    if( !res 
18b90 29 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  ){.      lastErr
18ba0 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
18bb0 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ror();.    }.  }
18bc0 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
18bd0 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20 20 2a   shared lock.  *
18be0 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18bf0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26  ==SHARED_LOCK &&
18c00 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
18c10 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
18c20 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ype==NO_LOCK );.
18c30 20 20 20 20 72 65 73 20 3d 20 77 69 6e 47 65 74      res = winGet
18c40 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
18c50 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a  .    if( res ){.
18c60 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70        newLocktyp
18c70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  e = SHARED_LOCK;
18c80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18c90 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73    lastErrno = os
18ca0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a  GetLastError();.
18cb0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18cc0 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52 56  Acquire a RESERV
18cd0 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ED lock.  */.  i
18ce0 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53  f( locktype==RES
18cf0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65  ERVED_LOCK && re
18d00 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
18d10 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18d20 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
18d30 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c 6f  .    res = winLo
18d40 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68  ckFile(&pFile->h
18d50 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  , SQLITE_LOCKFIL
18d60 45 5f 46 4c 41 47 53 2c 20 52 45 53 45 52 56 45  E_FLAGS, RESERVE
18d70 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  D_BYTE, 0, 1, 0)
18d80 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
18d90 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
18da0 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  pe = RESERVED_LO
18db0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
18dc0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18dd0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18de0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18df0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 50 45 4e  /* Acquire a PEN
18e00 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20  DING lock.  */. 
18e10 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45   if( locktype==E
18e20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
18e30 20 72 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c   res ){.    newL
18e40 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e  ocktype = PENDIN
18e50 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50  G_LOCK;.    gotP
18e60 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a  endingLock = 0;.
18e70 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18e80 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
18e90 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ock.  */.  if( l
18ea0 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
18eb0 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  VE_LOCK && res )
18ec0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
18ed0 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53  ile->locktype>=S
18ee0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
18ef0 20 20 72 65 73 20 3d 20 77 69 6e 55 6e 6c 6f 63    res = winUnloc
18f00 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  kReadLock(pFile)
18f10 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 4c  ;.    res = winL
18f20 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
18f30 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49  h, SQLITE_LOCKFI
18f40 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41 52 45 44  LE_FLAGS, SHARED
18f50 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20 20 20 20  _FIRST, 0,.     
18f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f70 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
18f80 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
18f90 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
18fa0 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
18fb0 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
18fc0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
18fd0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
18fe0 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 47 65 74  ();.      winGet
18ff0 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
19000 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
19010 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c 64 69   If we are holdi
19020 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  ng a PENDING loc
19030 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74 6f 20  k that ought to 
19040 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65  be released, the
19050 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65 20 69  n.  ** release i
19060 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66  t now..  */.  if
19070 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b  ( gotPendingLock
19080 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   && locktype==SH
19090 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
190a0 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26   winUnlockFile(&
190b0 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e  pFile->h, PENDIN
190c0 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29  G_BYTE, 0, 1, 0)
190d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  ;.  }..  /* Upda
190e0 74 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  te the state of 
190f0 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c  the lock has hel
19100 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  d in the file de
19110 73 63 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20  scriptor then.  
19120 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 70  ** return the ap
19130 70 72 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74  propriate result
19140 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   code..  */.  if
19150 28 20 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20  ( res ){.    rc 
19160 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
19170 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
19180 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
19190 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d  tErrno;.    rc =
191a0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
191b0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
191c0 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70 2c 20 77  -FAIL file=%p, w
191d0 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74 3d 25 64  anted=%d, got=%d
191e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
191f0 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b    pFile->h, lock
19200 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
19210 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  e));.  }.  pFile
19220 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 28 75 38  ->locktype = (u8
19230 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b 0a 20 20  )newLocktype;.  
19240 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 66  OSTRACE(("LOCK f
19250 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c  ile=%p, lock=%d,
19260 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
19270 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
19280 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
19290 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
192a0 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  rc)));.  return 
192b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
192c0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
192d0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
192e0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
192f0 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
19300 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
19310 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
19320 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
19330 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
19340 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a   return.** non-z
19350 65 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 7a  ero, otherwise z
19360 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ero..*/.static i
19370 6e 74 20 77 69 6e 43 68 65 63 6b 52 65 73 65 72  nt winCheckReser
19380 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
19390 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
193a0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
193b0 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  es;.  winFile *p
193c0 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a  File = (winFile*
193d0 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
193e0 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
193f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
19400 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
19410 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
19420 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c 65  EST-WR-LOCK file
19430 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70 5c  =%p, pResOut=%p\
19440 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 70 52  n", pFile->h, pR
19450 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61 73 73 65  esOut));..  asse
19460 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 69  rt( id!=0 );.  i
19470 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
19480 70 65 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe>=RESERVED_LOC
19490 4b 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 31  K ){.    res = 1
194a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
194b0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
194c0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
194d0 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70 46 69 6c  (local)\n", pFil
194e0 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 7d  e->h, res));.  }
194f0 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20 3d 20  else{.    res = 
19500 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69  winLockFile(&pFi
19510 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f  le->h, SQLITE_LO
19520 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53 2c 52  CKFILEEX_FLAGS,R
19530 45 53 45 52 56 45 44 5f 42 59 54 45 2c 30 2c 31  ESERVED_BYTE,0,1
19540 2c 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  ,0);.    if( res
19550 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 55 6e 6c   ){.      winUnl
19560 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19570 68 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  h, RESERVED_BYTE
19580 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
19590 7d 0a 20 20 20 20 72 65 73 20 3d 20 21 72 65 73  }.    res = !res
195a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
195b0 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
195c0 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d 25 64 20  e=%p, result=%d 
195d0 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20 70 46 69  (remote)\n", pFi
195e0 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20  le->h, res));.  
195f0 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  }.  *pResOut = r
19600 65 73 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  es;.  OSTRACE(("
19610 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66 69 6c  TEST-WR-LOCK fil
19620 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d 25 70  e=%p, pResOut=%p
19630 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72  , *pResOut=%d, r
19640 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a  c=SQLITE_OK\n",.
19650 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19660 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ->h, pResOut, *p
19670 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
19680 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19690 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
196a0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
196b0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
196c0 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65  r id to locktype
196d0 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d  .  locktype.** m
196e0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
196f0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
19700 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
19710 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
19720 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
19730 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
19740 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
19750 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
19760 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
19770 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19780 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74   no-op..**.** It
19790 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
197a0 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e   for this routin
197b0 65 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65  e to fail if the
197c0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
197d0 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20  .** is NO_LOCK. 
197e0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
197f0 72 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45  rgument is SHARE
19800 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73  D_LOCK then this
19810 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
19820 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  t return SQLITE_
19830 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63  IOERR;.*/.static
19840 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63 6b 28 73   int winUnlock(s
19850 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19860 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
19870 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 77 69    int type;.  wi
19880 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
19890 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  winFile*)id;.  i
198a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
198b0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  K;.  assert( pFi
198c0 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  le!=0 );.  asser
198d0 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41  t( locktype<=SHA
198e0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 4f 53  RED_LOCK );.  OS
198f0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 66  TRACE(("UNLOCK f
19900 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f 63 6b 3d  ile=%p, oldLock=
19910 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f 63 6b 3d  %d(%d), newLock=
19920 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
19930 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c    pFile->h, pFil
19940 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  e->locktype, pFi
19950 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
19960 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29 29 3b 0a  te, locktype));.
19970 20 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e    type = pFile->
19980 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20  locktype;.  if( 
19990 74 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f  type>=EXCLUSIVE_
199a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
199b0 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nlockFile(&pFile
199c0 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53  ->h, SHARED_FIRS
199d0 54 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a  T, 0, SHARED_SIZ
199e0 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6c  E, 0);.    if( l
199f0 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f  ocktype==SHARED_
19a00 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47 65 74 52  LOCK && !winGetR
19a10 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 20 29  eadLock(pFile) )
19a20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
19a30 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70  should never hap
19a40 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20  pen.  We should 
19a50 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74  always be able t
19a60 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71  o.      ** reacq
19a70 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
19a80 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  ck */.      rc =
19a90 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
19aa0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
19ab0 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  , osGetLastError
19ac0 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  (),.            
19ad0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 55             "winU
19ae0 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  nlock", pFile->z
19af0 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Path);.    }.  }
19b00 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53  .  if( type>=RES
19b10 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
19b20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28    winUnlockFile(
19b30 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52  &pFile->h, RESER
19b40 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20  VED_BYTE, 0, 1, 
19b50 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  0);.  }.  if( lo
19b60 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
19b70 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44 5f  && type>=SHARED_
19b80 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55  LOCK ){.    winU
19b90 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46  nlockReadLock(pF
19ba0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ile);.  }.  if( 
19bb0 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  type>=PENDING_LO
19bc0 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6c  CK ){.    winUnl
19bd0 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65 2d 3e  ockFile(&pFile->
19be0 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  h, PENDING_BYTE,
19bf0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 1, 0);.  }. 
19c00 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
19c10 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b   = (u8)locktype;
19c20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
19c30 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63  OCK file=%p, loc
19c40 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a  k=%d, rc=%s\n",.
19c50 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
19c60 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
19c70 74 79 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72  type, sqlite3Err
19c80 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65  Name(rc)));.  re
19c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19ca0 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
19cb0 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
19cc0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
19cd0 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
19ce0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
19cf0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
19d00 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
19d10 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
19d20 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
19d30 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
19d40 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
19d50 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
19d60 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
19d70 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
19d80 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
19d90 4d 6f 64 65 42 69 74 28 77 69 6e 46 69 6c 65 20  ModeBit(winFile 
19da0 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  *pFile, unsigned
19db0 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20   char mask, int 
19dc0 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20 2a 70  *pArg){.  if( *p
19dd0 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41  Arg<0 ){.    *pA
19de0 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72  rg = (pFile->ctr
19df0 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29 21 3d  lFlags & mask)!=
19e00 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28  0;.  }else if( (
19e10 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20  *pArg)==0 ){.   
19e20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
19e30 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65  s &= ~mask;.  }e
19e40 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  lse{.    pFile->
19e50 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73  ctrlFlags |= mas
19e60 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72  k;.  }.}../* For
19e70 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73 20  ward references 
19e80 74 6f 20 56 46 53 20 68 65 6c 70 65 72 20 6d 65  to VFS helper me
19e90 74 68 6f 64 73 20 75 73 65 64 20 66 6f 72 20 74  thods used for t
19ea0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
19eb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
19ec0 47 65 74 54 65 6d 70 6e 61 6d 65 28 73 71 6c 69  GetTempname(sqli
19ed0 74 65 33 5f 76 66 73 20 2a 2c 20 63 68 61 72 20  te3_vfs *, char 
19ee0 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  **);.static int 
19ef0 77 69 6e 49 73 44 69 72 28 63 6f 6e 73 74 20 76  winIsDir(const v
19f00 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69 63 20 42  oid *);.static B
19f10 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65  OOL winIsDriveLe
19f20 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 63 6f 6e  tterAndColon(con
19f30 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 2f 2a 0a  st char *);../*.
19f40 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e 64 20 71  ** Control and q
19f50 75 65 72 79 20 6f 66 20 74 68 65 20 6f 70 65 6e  uery of the open
19f60 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f   file handle..*/
19f70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
19f80 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
19f90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19fa0 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
19fb0 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69  {.  winFile *pFi
19fc0 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69  le = (winFile*)i
19fd0 64 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46  d;.  OSTRACE(("F
19fe0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 6f 70  CNTL file=%p, op
19ff0 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c 6e 22 2c  =%d, pArg=%p\n",
1a000 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70 2c 20 70   pFile->h, op, p
1a010 41 72 67 29 29 3b 0a 20 20 73 77 69 74 63 68 28  Arg));.  switch(
1a020 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1a030 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
1a040 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
1a050 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
1a060 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20  ile->locktype;. 
1a070 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1a080 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1a090 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1a0a0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1a0b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a0c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1a0d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
1a0e0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
1a0f0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1a100 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e 6c 61 73   (int)pFile->las
1a110 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 4f 53  tErrno;.      OS
1a120 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a130 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a140 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a150 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a160 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a170 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1a180 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49  E_FCNTL_CHUNK_SI
1a190 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ZE: {.      pFil
1a1a0 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69  e->szChunk = *(i
1a1b0 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  nt *)pArg;.     
1a1c0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a1d0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a1e0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a1f0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a200 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a210 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a220 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
1a230 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 66  HINT: {.      if
1a240 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1a250 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >0 ){.        sq
1a260 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 6c 64 53  lite3_int64 oldS
1a270 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  z;.        int r
1a280 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28  c = winFileSize(
1a290 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a 20 20 20  id, &oldSz);.   
1a2a0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1a2b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a2c0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
1a2d0 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73 71 6c 69  4 newSz = *(sqli
1a2e0 74 65 33 5f 69 6e 74 36 34 2a 29 70 41 72 67 3b  te3_int64*)pArg;
1a2f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
1a300 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b 0a 20 20  ewSz>oldSz ){.  
1a310 20 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61            Simula
1a320 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1a330 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1);.            
1a340 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61 74 65  rc = winTruncate
1a350 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a 20 20 20  (id, newSz);.   
1a360 20 20 20 20 20 20 20 20 20 53 69 6d 75 6c 61 74           Simulat
1a370 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1a380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1a390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1a3a0 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a3b0 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c   file=%p, rc=%s\
1a3c0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 71  n", pFile->h, sq
1a3d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
1a3e0 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
1a3f0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
1a400 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1a410 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1a420 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1a430 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1a440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a450 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1a460 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1a470 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1a480 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28 70      winModeBit(p
1a490 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50 45  File, WINFILE_PE
1a4a0 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
1a4b0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 4f 53  )pArg);.      OS
1a4c0 54 52 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69  TRACE(("FCNTL fi
1a4d0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
1a4e0 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
1a4f0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
1a500 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1a510 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1a520 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46  E_FCNTL_POWERSAF
1a530 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20  E_OVERWRITE: {. 
1a540 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69 74 28       winModeBit(
1a550 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45 5f 50  pFile, WINFILE_P
1a560 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1a570 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1a580 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a590 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a5a0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a5b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a5c0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1a5d0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a5e0 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1a5f0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1a600 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1a610 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1a620 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1a630 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a640 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a650 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1a660 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1a670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a690 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49   SQLITE_FCNTL_WI
1a6a0 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a 20 7b 0a  N32_AV_RETRY: {.
1a6b0 20 20 20 20 20 20 69 6e 74 20 2a 61 20 3d 20 28        int *a = (
1a6c0 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20  int*)pArg;.     
1a6d0 20 69 66 28 20 61 5b 30 5d 3e 30 20 29 7b 0a 20   if( a[0]>0 ){. 
1a6e0 20 20 20 20 20 20 20 77 69 6e 49 6f 65 72 72 52         winIoerrR
1a6f0 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a 20 20 20  etry = a[0];.   
1a700 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a710 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49 6f 65 72    a[0] = winIoer
1a720 72 52 65 74 72 79 3b 0a 20 20 20 20 20 20 7d 0a  rRetry;.      }.
1a730 20 20 20 20 20 20 69 66 28 20 61 5b 31 5d 3e 30        if( a[1]>0
1a740 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49   ){.        winI
1a750 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 20 3d  oerrRetryDelay =
1a760 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c   a[1];.      }el
1a770 73 65 7b 0a 20 20 20 20 20 20 20 20 61 5b 31 5d  se{.        a[1]
1a780 20 3d 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79   = winIoerrRetry
1a790 44 65 6c 61 79 3b 0a 20 20 20 20 20 20 7d 0a 20  Delay;.      }. 
1a7a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1a7b0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1a7c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70  =SQLITE_OK\n", p
1a7d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1a7e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a7f0 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  K;.    }.#ifdef 
1a800 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20  SQLITE_TEST.    
1a810 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a820 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
1a830 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c 50 48 41  LE: {.      LPHA
1a840 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d 20 28 4c  NDLE phFile = (L
1a850 50 48 41 4e 44 4c 45 29 70 41 72 67 3b 0a 20 20  PHANDLE)pArg;.  
1a860 20 20 20 20 48 41 4e 44 4c 45 20 68 4f 6c 64 46      HANDLE hOldF
1a870 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  ile = pFile->h;.
1a880 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d        pFile->h =
1a890 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20 20 20 20   *phFile;.      
1a8a0 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c 64 46 69  *phFile = hOldFi
1a8b0 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  le;.      OSTRAC
1a8c0 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64 46 69 6c  E(("FCNTL oldFil
1a8d0 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65 3d 25 70  e=%p, newFile=%p
1a8e0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
1a8f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a900 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70 46 69 6c    hOldFile, pFil
1a910 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65  e->h));.      re
1a920 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a930 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1a940 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1a950 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a  TL_TEMPFILENAME:
1a960 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a   {.      char *z
1a970 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  TFile = 0;.     
1a980 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 47 65 74   int rc = winGet
1a990 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e  Tempname(pFile->
1a9a0 70 56 66 73 2c 20 26 7a 54 46 69 6c 65 29 3b 0a  pVfs, &zTFile);.
1a9b0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a9c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a9d0 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1a9e0 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20   = zTFile;.     
1a9f0 20 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45   }.      OSTRACE
1aa00 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1aa10 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70 46 69 6c  , rc=%s\n", pFil
1aa20 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33 45 72 72  e->h, sqlite3Err
1aa30 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
1aa40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1aa50 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41   }.#if SQLITE_MA
1aa60 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1aa70 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1aa80 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
1aa90 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
1aaa0 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
1aab0 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
1aac0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1aad0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1aae0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1aaf0 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
1ab00 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
1ab10 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ab20 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
1ab30 20 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34     }.      *(i64
1ab40 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
1ab50 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20  mmapSizeMax;.   
1ab60 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
1ab70 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d  =0 && newLimit!=
1ab80 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1ab90 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65  ax && pFile->nFe
1aba0 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  tchOut==0 ){.   
1abb0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1abc0 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d  SizeMax = newLim
1abd0 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  it;.        if( 
1abe0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e  pFile->mmapSize>
1abf0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  0 ){.          w
1ac00 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  inUnmapfile(pFil
1ac10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
1ac20 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65 28 70 46   = winMapfile(pF
1ac30 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  ile, -1);.      
1ac40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ac50 20 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54    OSTRACE(("FCNT
1ac60 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73  L file=%p, rc=%s
1ac70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73  \n", pFile->h, s
1ac80 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
1ac90 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  )));.      retur
1aca0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
1acb0 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  if.  }.  OSTRACE
1acc0 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70  (("FCNTL file=%p
1acd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 54 46  , rc=SQLITE_NOTF
1ace0 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  OUND\n", pFile->
1acf0 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  h));.  return SQ
1ad00 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1ad10 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ad20 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ad30 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1ad40 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ad50 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ad60 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1ad70 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ad80 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1ad90 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1ada0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1adb0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1adc0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1add0 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1ade0 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1adf0 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1ae00 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1ae10 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1ae20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1ae30 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1ae40 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1ae50 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1ae60 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1ae70 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1ae80 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1ae90 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1aea0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
1aeb0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1aec0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1aed0 28 76 6f 69 64 29 69 64 3b 0a 20 20 72 65 74 75  (void)id;.  retu
1aee0 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
1aef0 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
1af00 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1af10 20 76 65 63 74 6f 72 20 6f 66 20 64 65 76 69 63   vector of devic
1af20 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
1af30 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1af40 20 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63   winDeviceCharac
1af50 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
1af60 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 77  3_file *id){.  w
1af70 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28 77 69 6e  inFile *p = (win
1af80 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72 65 74 75  File*)id;.  retu
1af90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rn SQLITE_IOCAP_
1afa0 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57 48 45 4e  UNDELETABLE_WHEN
1afb0 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20 20 20 20  _OPEN |.        
1afc0 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20   ((p->ctrlFlags 
1afd0 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 29 3f  & WINFILE_PSOW)?
1afe0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
1aff0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1b000 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 69  :0);.}../*.** Wi
1b010 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e 6c 79 20  ndows will only 
1b020 6c 65 74 20 79 6f 75 20 63 72 65 61 74 65 20 66  let you create f
1b030 69 6c 65 20 76 69 65 77 20 6d 61 70 70 69 6e 67  ile view mapping
1b040 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63 61 74 69  s.** on allocati
1b050 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75 6c 61 72  on size granular
1b060 69 74 79 20 62 6f 75 6e 64 61 72 69 65 73 2e 0a  ity boundaries..
1b070 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c 69 74 65  ** During sqlite
1b080 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 65 20 64  3_os_init() we d
1b090 6f 20 61 20 47 65 74 53 79 73 74 65 6d 49 6e 66  o a GetSystemInf
1b0a0 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74 20 74 68  o().** to get th
1b0b0 65 20 67 72 61 6e 75 6c 61 72 69 74 79 20 73 69  e granularity si
1b0c0 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 59  ze..*/.static SY
1b0d0 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e 53 79 73  STEM_INFO winSys
1b0e0 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65 66 20 53  Info;..#ifndef S
1b0f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a  QLITE_OMIT_WAL..
1b100 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
1b110 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
1b120 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
1b130 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
1b140 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
1b150 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
1b160 20 70 72 6f 74 65 63 74 20 74 68 65 20 77 69 6e   protect the win
1b170 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65 63 74 73  LockInfo objects
1b180 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73   used by.** this
1b190 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77 68   file, all of wh
1b1a0 69 63 68 20 6d 61 79 20 62 65 20 73 68 61 72 65  ich may be share
1b1b0 64 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68  d by multiple th
1b1c0 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e  reads..**.** Fun
1b1d0 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d 75 74 65  ction winShmMute
1b1e0 78 48 65 6c 64 28 29 20 69 73 20 75 73 65 64 20  xHeld() is used 
1b1f0 74 6f 20 61 73 73 65 72 74 28 29 20 74 68 61 74  to assert() that
1b200 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
1b210 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20 77 68 65  x.** is held whe
1b220 6e 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  n required. This
1b230 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
1b240 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  y used as part o
1b250 66 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73 74  f assert().** st
1b260 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a  atements. e.g..*
1b270 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 45 6e 74  *.**   winShmEnt
1b280 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20 20 20 20  erMutex().**    
1b290 20 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d   assert( winShmM
1b2a0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a 2a  utexHeld() );.**
1b2b0 20 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75     winShmLeaveMu
1b2c0 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  tex().*/.static 
1b2d0 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e 74 65 72  void winShmEnter
1b2e0 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
1b2f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1b300 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
1b310 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1b320 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
1b330 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
1b340 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1b350 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
1b360 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
1b370 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
1b380 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1b390 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66  IC_VFS1));.}.#if
1b3a0 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1b3b0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4d 75 74  ic int winShmMut
1b3c0 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20  exHeld(void) {. 
1b3d0 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
1b3e0 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74  mutex_held(sqlit
1b3f0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1b400 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1b410 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69  _VFS1));.}.#endi
1b420 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  f../*.** Object 
1b430 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
1b440 74 20 61 20 73 69 6e 67 6c 65 20 66 69 6c 65 20  t a single file 
1b450 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d 61 70 70  opened and mmapp
1b460 65 64 20 74 6f 20 70 72 6f 76 69 64 65 0a 2a 2a  ed to provide.**
1b470 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
1b480 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74   When multiple t
1b490 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72  hreads all refer
1b4a0 65 6e 63 65 20 74 68 65 20 73 61 6d 65 0a 2a 2a  ence the same.**
1b4b0 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c 20 65 61   log-summary, ea
1b4c0 63 68 20 74 68 72 65 61 64 20 68 61 73 20 69 74  ch thread has it
1b4d0 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65 20 6f 62  s own winFile ob
1b4e0 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
1b4f0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  ll.** point to a
1b500 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
1b510 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 2e   of this object.
1b520 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
1b530 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67 2d 73 75  , each.** log-su
1b540 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e 65 64 20  mmary is opened 
1b550 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72  only once per pr
1b560 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 77 69 6e  ocess..**.** win
1b570 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
1b580 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65 6e  ust be true when
1b590 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73   creating or des
1b5a0 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20  troying.** this 
1b5b0 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20  object or while 
1b5c0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
1b5d0 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
1b5e0 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20   fields:.**.**  
1b5f0 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20 20 20 20      nRef.**     
1b600 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65   pNext.**.** The
1b610 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
1b620 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
1b630 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
1b640 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a   is created:.**.
1b650 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
1b660 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
1b670 0a 2a 2a 20 45 69 74 68 65 72 20 77 69 6e 53 68  .** Either winSh
1b680 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74  mNode.mutex must
1b690 20 62 65 20 68 65 6c 64 20 6f 72 20 77 69 6e 53   be held or winS
1b6a0 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
1b6b0 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d 75 74 65  nd.** winShmMute
1b6c0 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
1b6d0 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
1b6e0 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
1b6f0 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
1b700 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  is structure..**
1b710 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 53 68  .*/.struct winSh
1b720 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c 69 74 65  mNode {.  sqlite
1b730 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
1b740 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
1b750 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
1b760 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
1b770 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
1b780 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1b790 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 77 69 6e  he file */.  win
1b7a0 46 69 6c 65 20 68 46 69 6c 65 3b 20 20 20 20 20  File hFile;     
1b7b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1b7c0 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77 69 6e 4f  handle from winO
1b7d0 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74 20 73 7a  pen */..  int sz
1b7e0 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1b7f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1b800 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
1b810 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  gions */.  int n
1b820 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  Region;         
1b830 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b840 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20   array apRegion 
1b850 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 68 6d 52  */.  struct ShmR
1b860 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48 41 4e 44  egion {.    HAND
1b870 4c 45 20 68 4d 61 70 3b 20 20 20 20 20 20 20 20  LE hMap;        
1b880 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e       /* File han
1b890 64 6c 65 20 66 72 6f 6d 20 43 72 65 61 74 65 46  dle from CreateF
1b8a0 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ileMapping */.  
1b8b0 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b 0a 20 20    void *pMap;.  
1b8c0 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20 20 44 57  } *aRegion;.  DW
1b8d0 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  ORD lastErrno;  
1b8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b8f0 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f 20 66 72  Windows errno fr
1b900 6f 6d 20 74 68 65 20 6c 61 73 74 20 49 2f 4f 20  om the last I/O 
1b910 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69 6e 74 20  error */..  int 
1b920 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
1b930 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b940 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62 6a 65 63   of winShm objec
1b950 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
1b960 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20  his */.  winShm 
1b970 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
1b980 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69 6e 53 68      /* All winSh
1b990 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
1b9a0 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
1b9b0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e 65 78  winShmNode *pNex
1b9c0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65  t;         /* Ne
1b9d0 78 74 20 69 6e 20 6c 69 73 74 20 6f 66 20 61 6c  xt in list of al
1b9e0 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a  l winShmNode obj
1b9f0 65 63 74 73 20 2a 2f 0a 23 69 66 20 64 65 66 69  ects */.#if defi
1ba00 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1ba10 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1ba20 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43  ITE_HAVE_OS_TRAC
1ba30 45 29 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  E).  u8 nextShmI
1ba40 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1ba50 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
1ba60 65 20 77 69 6e 53 68 6d 2e 69 64 20 76 61 6c 75  e winShm.id valu
1ba70 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
1ba80 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 61  /*.** A global a
1ba90 72 72 61 79 20 6f 66 20 61 6c 6c 20 77 69 6e 53  rray of all winS
1baa0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 73 2e 0a  hmNode objects..
1bab0 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e 53 68 6d  **.** The winShm
1bac0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
1bad0 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
1bae0 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1baf0 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
1bb00 73 74 61 74 69 63 20 77 69 6e 53 68 6d 4e 6f 64  static winShmNod
1bb10 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  e *winShmNodeLis
1bb20 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  t = 0;../*.** St
1bb30 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
1bb40 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
1bb50 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
1bb60 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
1bb70 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
1bb80 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
1bb90 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
1bba0 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
1bbb0 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
1bbc0 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
1bbd0 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
1bbe0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
1bbf0 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
1bc00 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65   winShm.pShmNode
1bc10 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d 2e 69 64  .**    winShm.id
1bc20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
1bc30 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
1bc40 2f 77 72 69 74 65 2e 20 20 54 68 65 20 77 69 6e  /write.  The win
1bc50 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  Shm.pShmNode->mu
1bc60 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
1bc70 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73  .** while access
1bc80 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69  ing any read/wri
1bc90 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74  te fields..*/.st
1bca0 72 75 63 74 20 77 69 6e 53 68 6d 20 7b 0a 20 20  ruct winShm {.  
1bcb0 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  winShmNode *pShm
1bcc0 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a 20 54 68  Node;      /* Th
1bcd0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 77 69 6e  e underlying win
1bce0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
1bcf0 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70 4e 65 78  /.  winShm *pNex
1bd00 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
1bd10 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d 20 77 69  * Next winShm wi
1bd20 74 68 20 74 68 65 20 73 61 6d 65 20 77 69 6e 53  th the same winS
1bd30 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
1bd40 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
1bd50 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1bd60 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 77 69  f holding the wi
1bd70 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a  nShmNode mutex *
1bd80 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61  /.  u16 sharedMa
1bd90 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  sk;            /
1bda0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
1bdb0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
1bdc0 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20   u16 exclMask;  
1bdd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1bde0 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
1bdf0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 23   locks held */.#
1be00 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1be10 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69  E_DEBUG) || defi
1be20 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
1be30 4f 53 5f 54 52 41 43 45 29 0a 20 20 75 38 20 69  OS_TRACE).  u8 i
1be40 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
1be50 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20         /* Id of 
1be60 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1be70 77 69 74 68 20 69 74 73 20 77 69 6e 53 68 6d 4e  with its winShmN
1be80 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b  ode */.#endif.};
1be90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
1bea0 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
1beb0 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49  ng.*/.#define WI
1bec0 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  N_SHM_BASE   ((2
1bed0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
1bee0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 2f 2a  CK)*4)        /*
1bef0 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74 65   first lock byte
1bf00 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 49 4e 5f   */.#define WIN_
1bf10 53 48 4d 5f 44 4d 53 20 20 20 20 28 57 49 4e 5f  SHM_DMS    (WIN_
1bf20 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f  SHM_BASE+SQLITE_
1bf30 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64  SHM_NLOCK)  /* d
1bf40 65 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f  eadman switch */
1bf50 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 61 64  ../*.** Apply ad
1bf60 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72  visory locks for
1bf70 20 61 6c 6c 20 6e 20 62 79 74 65 73 20 62 65 67   all n bytes beg
1bf80 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73 74 2e 0a  inning at ofst..
1bf90 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f  */.#define _SHM_
1bfa0 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66 69 6e 65  UNLCK  1.#define
1bfb0 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20 32 0a 23   _SHM_RDLCK  2.#
1bfc0 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57 52 4c 43  define _SHM_WRLC
1bfd0 4b 20 20 33 0a 73 74 61 74 69 63 20 69 6e 74 20  K  3.static int 
1bfe0 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  winShmSystemLock
1bff0 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  (.  winShmNode *
1c000 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20 41 70 70  pFile,    /* App
1c010 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
1c020 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
1c030 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
1c040 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20   int lockType,  
1c050 20 20 20 20 20 20 20 2f 2a 20 5f 53 48 4d 5f 55         /* _SHM_U
1c060 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  NLCK, _SHM_RDLCK
1c070 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c 43 4b 20  , or _SHM_WRLCK 
1c080 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1c090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1c0a0 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
1c0b0 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2f  te to be locked/
1c0c0 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e  unlocked */.  in
1c0d0 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
1c0e0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c0f0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 6f   bytes to lock o
1c100 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  r unlock */.){. 
1c110 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20   int rc = 0;    
1c120 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1c130 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f 63 6b 2f   code form Lock/
1c140 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 2a  UnlockFileEx() *
1c150 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74  /..  /* Access t
1c160 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65  o the winShmNode
1c170 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
1c180 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
1c190 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
1c1a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c1b0 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78  eld(pFile->mutex
1c1c0 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e 52 65 66  ) || pFile->nRef
1c1d0 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ==0 );..  OSTRAC
1c1e0 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c  E(("SHM-LOCK fil
1c1f0 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64 2c 20 6f  e=%p, lock=%d, o
1c200 66 66 73 65 74 3d 25 64 2c 20 73 69 7a 65 3d 25  ffset=%d, size=%
1c210 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1c220 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c   pFile->hFile.h,
1c230 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66 73 74 2c   lockType, ofst,
1c240 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 2f 2a 20   nByte));..  /* 
1c250 52 65 6c 65 61 73 65 2f 41 63 71 75 69 72 65 20  Release/Acquire 
1c260 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
1c270 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 6c   lock */.  if( l
1c280 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d 5f 55 4e  ockType==_SHM_UN
1c290 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  LCK ){.    rc = 
1c2a0 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70  winUnlockFile(&p
1c2b0 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 6f  File->hFile.h, o
1c2c0 66 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30  fst, 0, nByte, 0
1c2d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1c2e0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1c2f0 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65  e locking parame
1c300 74 65 72 73 20 2a 2f 0a 20 20 20 20 44 57 4f 52  ters */.    DWOR
1c310 44 20 64 77 46 6c 61 67 73 20 3d 20 4c 4f 43 4b  D dwFlags = LOCK
1c320 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49  FILE_FAIL_IMMEDI
1c330 41 54 45 4c 59 3b 0a 20 20 20 20 69 66 28 20 6c  ATELY;.    if( l
1c340 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f  ockType == _SHM_
1c350 57 52 4c 43 4b 20 29 20 64 77 46 6c 61 67 73 20  WRLCK ) dwFlags 
1c360 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  |= LOCKFILE_EXCL
1c370 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20  USIVE_LOCK;.    
1c380 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65  rc = winLockFile
1c390 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
1c3a0 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66 73 74 2c  , dwFlags, ofst,
1c3b0 20 30 2c 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20   0, nByte, 0);. 
1c3c0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 20 30   }..  if( rc!= 0
1c3d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1c3e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
1c3f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74  .    pFile->last
1c400 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65 74 4c 61  Errno =  osGetLa
1c410 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 72  stError();.    r
1c420 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
1c430 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28  .  }..  OSTRACE(
1c440 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69 6c 65 3d  ("SHM-LOCK file=
1c450 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20 65 72 72  %p, func=%s, err
1c460 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73 5c 6e 22  no=%lu, rc=%s\n"
1c470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
1c480 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20 28 6c 6f  le->hFile.h, (lo
1c490 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48 4d 5f 55  ckType == _SHM_U
1c4a0 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55 6e 6c 6f  NLCK) ? "winUnlo
1c4b0 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20 20 20 20  ckFile" :.      
1c4c0 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b 46 69 6c       "winLockFil
1c4d0 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  e", pFile->lastE
1c4e0 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33 45 72 72  rrno, sqlite3Err
1c4f0 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a 20 20 72  Name(rc)));..  r
1c500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1c510 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
1c520 65 73 20 74 6f 20 56 46 53 20 6d 65 74 68 6f 64  es to VFS method
1c530 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
1c540 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  winOpen(sqlite3_
1c550 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  vfs*,const char*
1c560 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  ,sqlite3_file*,i
1c570 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63  nt,int*);.static
1c580 20 69 6e 74 20 77 69 6e 44 65 6c 65 74 65 28 73   int winDelete(s
1c590 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 63 6f 6e  qlite3_vfs *,con
1c5a0 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 0a  st char*,int);..
1c5b0 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20  /*.** Purge the 
1c5c0 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c  winShmNodeList l
1c5d0 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1c5e0 65 73 20 77 69 74 68 20 77 69 6e 53 68 6d 4e 6f  es with winShmNo
1c5f0 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
1c600 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
1c610 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1c620 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
1c630 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
1c640 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
1c650 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
1c660 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
1c670 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d  atic void winShm
1c680 50 75 72 67 65 28 73 71 6c 69 74 65 33 5f 76 66  Purge(sqlite3_vf
1c690 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 64 65 6c  s *pVfs, int del
1c6a0 65 74 65 46 6c 61 67 29 7b 0a 20 20 77 69 6e 53  eteFlag){.  winS
1c6b0 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a 20 20 77  hmNode **pp;.  w
1c6c0 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b 0a 20 20  inShmNode *p;.  
1c6d0 61 73 73 65 72 74 28 20 77 69 6e 53 68 6d 4d 75  assert( winShmMu
1c6e0 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 4f  texHeld() );.  O
1c6f0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1c700 47 45 20 70 69 64 3d 25 6c 75 2c 20 64 65 6c 65  GE pid=%lu, dele
1c710 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c 0a 20 20  teFlag=%d\n",.  
1c720 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1c730 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1c740 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 29 3b 0a  , deleteFlag));.
1c750 20 20 70 70 20 3d 20 26 77 69 6e 53 68 6d 4e 6f    pp = &winShmNo
1c760 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
1c770 20 28 70 20 3d 20 2a 70 70 29 21 3d 30 20 29 7b   (p = *pp)!=0 ){
1c780 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 52 65 66  .    if( p->nRef
1c790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
1c7a0 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   i;.      if( p-
1c7b0 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c 69 74 65  >mutex ){ sqlite
1c7c0 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e  3_mutex_free(p->
1c7d0 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20 20 20 20  mutex); }.      
1c7e0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
1c7f0 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  egion; i++){.   
1c800 20 20 20 20 20 42 4f 4f 4c 20 62 52 63 20 3d 20       BOOL bRc = 
1c810 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66 46 69 6c  osUnmapViewOfFil
1c820 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e  e(p->aRegion[i].
1c830 70 4d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f  pMap);.        O
1c840 53 54 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52  STRACE(("SHM-PUR
1c850 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d 25 6c 75  GE-UNMAP pid=%lu
1c860 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d  , region=%d, rc=
1c870 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1c880 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
1c890 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
1c8a0 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a   i, bRc ? "ok" :
1c8b0 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20   "failed"));.   
1c8c0 20 20 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49       UNUSED_VARI
1c8d0 41 42 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b  ABLE_VALUE(bRc);
1c8e0 0a 20 20 20 20 20 20 20 20 62 52 63 20 3d 20 6f  .        bRc = o
1c8f0 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e  sCloseHandle(p->
1c900 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d 61 70 29  aRegion[i].hMap)
1c910 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41 43  ;.        OSTRAC
1c920 45 28 28 22 53 48 4d 2d 50 55 52 47 45 2d 43 4c  E(("SHM-PURGE-CL
1c930 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67  OSE pid=%lu, reg
1c940 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73 5c 6e 22  ion=%d, rc=%s\n"
1c950 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c960 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
1c970 72 6f 63 65 73 73 49 64 28 29 2c 20 69 2c 20 62  rocessId(), i, b
1c980 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  Rc ? "ok" : "fai
1c990 6c 65 64 22 29 29 3b 0a 20 20 20 20 20 20 20 20  led"));.        
1c9a0 55 4e 55 53 45 44 5f 56 41 52 49 41 42 4c 45 5f  UNUSED_VARIABLE_
1c9b0 56 41 4c 55 45 28 62 52 63 29 3b 0a 20 20 20 20  VALUE(bRc);.    
1c9c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
1c9d0 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c 4c 20 26  >hFile.h!=NULL &
1c9e0 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 49 4e  & p->hFile.h!=IN
1c9f0 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1ca00 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 53 69  UE ){.        Si
1ca10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1ca20 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20  ign(1);.        
1ca30 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c 69 74 65  winClose((sqlite
1ca40 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e 68 46 69  3_file *)&p->hFi
1ca50 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 53 69 6d  le);.        Sim
1ca60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1ca70 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gn(0);.      }. 
1ca80 20 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46       if( deleteF
1ca90 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 53  lag ){.        S
1caa0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1cab0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20  nign(1);.       
1cac0 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
1cad0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
1cae0 20 20 20 20 20 77 69 6e 44 65 6c 65 74 65 28 70       winDelete(p
1caf0 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65 6e 61 6d  Vfs, p->zFilenam
1cb00 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  e, 0);.        s
1cb10 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
1cb20 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
1cb30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1cb40 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
1cb50 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
1cb60 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
1cb70 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
1cb80 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73  Region);.      s
1cb90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
1cba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cbb0 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65 78 74 3b   pp = &p->pNext;
1cbc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1cbd0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 73 68 61  .** Open the sha
1cbe0 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20  red-memory area 
1cbf0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1cc00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 44  database file pD
1cc10 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  bFd..**.** When 
1cc20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1cc30 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1cc40 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1cc50 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1cc60 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1cc70 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1cc80 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1cc90 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1cca0 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1ccb0 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1ccc0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1ccd0 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1cce0 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1ccf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
1cd00 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  inOpenSharedMemo
1cd10 72 79 28 77 69 6e 46 69 6c 65 20 2a 70 44 62 46  ry(winFile *pDbF
1cd20 64 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69 6e  d){.  struct win
1cd30 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
1cd40 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1cd50 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65  connection to be
1cd60 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72   opened */.  str
1cd70 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  uct winShmNode *
1cd80 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 20 20 20  pShmNode = 0;   
1cd90 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1cda0 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  g mmapped file *
1cdb0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1cdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cdd0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1cde0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74 72 75 63   code */.  struc
1cdf0 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 4e  t winShmNode *pN
1ce00 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ew;           /*
1ce10 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   Newly allocated
1ce20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20   winShmNode */. 
1ce30 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
1ce40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a      /* Size of z
1ce60 4e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  Name in bytes */
1ce70 0a 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ..  assert( pDbF
1ce80 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 20 20 20  d->pShm==0 );   
1ce90 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69 6f 75 73   /* Not previous
1cea0 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a 0a 20 20  ly opened */..  
1ceb0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63  /* Allocate spac
1cec0 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 71  e for the new sq
1ced0 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a 65 63 74  lite3_shm object
1cee0 2e 20 20 41 6c 73 6f 20 73 70 65 63 75 6c 61 74  .  Also speculat
1cef0 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63  ively.  ** alloc
1cf00 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
1cf10 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64 65 20 61  new winShmNode a
1cf20 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a  nd filename..  *
1cf30 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  /.  p = sqlite3M
1cf40 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1cf50 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
1cf60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
1cf70 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
1cf80 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65 20 3d 20  BKPT;.  nName = 
1cf90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1cfa0 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1cfb0 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 4d   pNew = sqlite3M
1cfc0 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f  allocZero( sizeo
1cfd0 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e  f(*pShmNode) + n
1cfe0 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a 20 20 69  Name + 17 );.  i
1cff0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1d000 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1d010 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1d020 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1d030 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 4e 65  _BKPT;.  }.  pNe
1d040 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  w->zFilename = (
1d050 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a  char*)&pNew[1];.
1d060 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1d070 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20 70 4e 65  tf(nName+15, pNe
1d080 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25  w->zFilename, "%
1d090 73 2d 73 68 6d 22 2c 20 70 44 62 46 64 2d 3e 7a  s-shm", pDbFd->z
1d0a0 50 61 74 68 29 3b 0a 20 20 73 71 6c 69 74 65 33  Path);.  sqlite3
1d0b0 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46  FileSuffix3(pDbF
1d0c0 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65 77 2d 3e  d->zPath, pNew->
1d0d0 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a 20 20 2f  zFilename);..  /
1d0e0 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66  * Look to see if
1d0f0 20 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69   there is an exi
1d100 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64 65  sting winShmNode
1d110 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1d120 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1d130 74 63 68 69 6e 67 20 77 69 6e 53 68 6d 4e 6f 64  tching winShmNod
1d140 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73  e currently exis
1d150 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65 77  ts, create a new
1d160 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 69 6e   one..  */.  win
1d170 53 68 6d 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  ShmEnterMutex();
1d180 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f 64 65 20  .  for(pShmNode 
1d190 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74  = winShmNodeList
1d1a0 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70 53 68 6d  ; pShmNode; pShm
1d1b0 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  Node=pShmNode->p
1d1c0 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 54 42  Next){.    /* TB
1d1d0 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d 65 20 75  D need to come u
1d1e0 70 20 77 69 74 68 20 62 65 74 74 65 72 20 6d 61  p with better ma
1d1f0 74 63 68 20 68 65 72 65 2e 20 20 50 65 72 68 61  tch here.  Perha
1d200 70 73 0a 20 20 20 20 2a 2a 20 75 73 65 20 46 49  ps.    ** use FI
1d210 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49 52 5f 49  LE_ID_BOTH_DIR_I
1d220 4e 46 4f 20 53 74 72 75 63 74 75 72 65 2e 0a 20  NFO Structure.. 
1d230 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1d240 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 53 68  lite3StrICmp(pSh
1d250 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
1d260 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d  , pNew->zFilenam
1d270 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
1d280 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
1d290 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1d2a0 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d  _free(pNew);.  }
1d2b0 65 6c 73 65 7b 0a 20 20 20 20 70 53 68 6d 4e 6f  else{.    pShmNo
1d2c0 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 70  de = pNew;.    p
1d2d0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 28 28 77  New = 0;.    ((w
1d2e0 69 6e 46 69 6c 65 2a 29 28 26 70 53 68 6d 4e 6f  inFile*)(&pShmNo
1d2f0 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e 68 20 3d  de->hFile))->h =
1d300 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
1d310 56 41 4c 55 45 3b 0a 20 20 20 20 70 53 68 6d 4e  VALUE;.    pShmN
1d320 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 77 69 6e  ode->pNext = win
1d330 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  ShmNodeList;.   
1d340 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 20   winShmNodeList 
1d350 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 20  = pShmNode;..   
1d360 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
1d370 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
1d380 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
1d390 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69  TEX_FAST);.    i
1d3a0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  f( pShmNode->mut
1d3b0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ex==0 ){.      r
1d3c0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1d3d0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
1d3e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
1d3f0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
1d400 20 72 63 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44   rc = winOpen(pD
1d410 62 46 64 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20  bFd->pVfs,.     
1d420 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
1d430 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  Node->zFilename,
1d440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d450 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1d460 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20   (UTF-8) */.    
1d470 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73 71               (sq
1d480 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 53 68  lite3_file*)&pSh
1d490 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f  mNode->hFile,  /
1d4a0 2a 20 46 69 6c 65 20 68 61 6e 64 6c 65 20 68 65  * File handle he
1d4b0 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  re */.          
1d4c0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
1d4d0 45 4e 5f 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f  EN_WAL | SQLITE_
1d4e0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
1d4f0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1d500 41 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ATE,.           
1d510 20 20 20 20 20 20 30 29 3b 0a 20 20 20 20 69 66        0);.    if
1d520 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1d530 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  ){.      goto sh
1d540 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
1d550 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
1d560 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65  to see if anothe
1d570 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
1d580 64 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61  ding the dead-ma
1d590 6e 20 73 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a  n switch..    **
1d5a0 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
1d5b0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
1d5c0 72 6f 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a  ro length..    *
1d5d0 2f 0a 20 20 20 20 69 66 28 20 77 69 6e 53 68 6d  /.    if( winShm
1d5e0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e  SystemLock(pShmN
1d5f0 6f 64 65 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c  ode, _SHM_WRLCK,
1d600 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29   WIN_SHM_DMS, 1)
1d610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d620 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1d630 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1d640 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1d650 3e 68 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20  >hFile, 0);.    
1d660 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d670 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1d680 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1d690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1d6a0 4f 50 45 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45  OPEN, osGetLastE
1d6b0 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1d6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d6d0 20 22 77 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70   "winOpenShm", p
1d6e0 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  DbFd->zPath);.  
1d6f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1d700 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d710 4b 20 29 7b 0a 20 20 20 20 20 20 77 69 6e 53 68  K ){.      winSh
1d720 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1d730 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1d740 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1d750 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
1d760 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  nShmSystemLock(p
1d770 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44  ShmNode, _SHM_RD
1d780 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53  LCK, WIN_SHM_DMS
1d790 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1d7a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
1d7b0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a  m_open_err;.  }.
1d7c0 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
1d7d0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
1d7e0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 77 69 6e  child of the win
1d7f0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e  ShmNode */.  p->
1d800 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
1d810 6f 64 65 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ode;.#if defined
1d820 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
1d830 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
1d840 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a  _HAVE_OS_TRACE).
1d850 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
1d860 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
1d870 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
1d880 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
1d890 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
1d8a0 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1d8b0 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72  x();..  /* The r
1d8c0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
1d8d0 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61  n pShmNode has a
1d8e0 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
1d8f0 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20  emented under.  
1d900 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20  ** the cover of 
1d910 74 68 65 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d  the winShmEnterM
1d920 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
1d930 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
1d940 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
1d950 73 74 72 75 63 74 20 77 69 6e 53 68 6d 29 20 6f  struct winShm) o
1d960 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
1d970 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
1d980 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
1d990 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
1d9a0 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
1d9b0 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
1d9c0 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
1d9d0 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
1d9e0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1d9f0 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
1da00 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
1da10 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
1da20 6d 75 74 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78  mutex.  ** mutex
1da30 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1da40 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1da50 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1da60 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d   p->pNext = pShm
1da70 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20  Node->pFirst;.  
1da80 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1da90 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = p;.  sqlite3_
1daa0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
1dab0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
1dac0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dad0 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
1dae0 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a  e on any error *
1daf0 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a  /.shm_open_err:.
1db00 20 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f    winShmSystemLo
1db10 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1db20 4d 5f 55 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d  M_UNLCK, WIN_SHM
1db30 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53  _DMS, 1);.  winS
1db40 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70  hmPurge(pDbFd->p
1db50 56 66 73 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a  Vfs, 0);      /*
1db60 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
1db70 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
1db80 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
1db90 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 73 71  e3_free(p);.  sq
1dba0 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
1dbb0 3b 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d  ;.  winShmLeaveM
1dbc0 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
1dbd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c   rc;.}../*.** Cl
1dbe0 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
1dbf0 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
1dc00 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
1dc10 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f  nderlying.** sto
1dc20 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c  rage if deleteFl
1dc30 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ag is true..*/.s
1dc40 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1dc50 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
1dc60 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
1dc70 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dc80 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
1dc90 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64  emory */.  int d
1dca0 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20  eleteFlag       
1dcb0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
1dcc0 61 66 74 65 72 20 63 6c 6f 73 69 6e 67 20 69 66  after closing if
1dcd0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69   true */.){.  wi
1dce0 6e 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  nFile *pDbFd;   
1dcf0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1dd00 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 2d 6d  holding shared-m
1dd10 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68  emory */.  winSh
1dd20 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
1dd30 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1dd40 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  on to be closed 
1dd50 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20  */.  winShmNode 
1dd60 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68  *pShmNode; /* Th
1dd70 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1dd80 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1dd90 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70  */.  winShm **pp
1dda0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f  ;          /* Fo
1ddb0 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73  r looping over s
1ddc0 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1ddd0 6e 73 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  ns */..  pDbFd =
1dde0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20   (winFile*)fd;. 
1ddf0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
1de00 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1de10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1de20 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d  .  pShmNode = p-
1de30 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a  >pShmNode;..  /*
1de40 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
1de50 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
1de60 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
1de70 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
1de80 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
1de90 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1dea0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
1deb0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
1dec0 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
1ded0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
1dee0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
1def0 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
1df00 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
1df10 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
1df20 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
1df30 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
1df40 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
1df50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1df60 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
1df70 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
1df80 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
1df90 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
1dfa0 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
1dfb0 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
1dfc0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
1dfd0 6f 6f 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e  oo */.  winShmEn
1dfe0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
1dff0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
1e000 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
1e010 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
1e020 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
1e030 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e  ef==0 ){.    win
1e040 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 2d 3e  ShmPurge(pDbFd->
1e050 70 56 66 73 2c 20 64 65 6c 65 74 65 46 6c 61 67  pVfs, deleteFlag
1e060 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c  );.  }.  winShmL
1e070 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
1e080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
1e0a0 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
1e0b0 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
1e0c0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f  mory segment..*/
1e0d0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
1e0e0 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
1e0f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
1e100 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
1e110 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
1e120 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1e130 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
1e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e150 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
1e160 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
1e170 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e1a0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
1e1b0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
1e1c0 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1e0 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
1e1f0 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
1e200 20 77 69 6e 46 69 6c 65 20 2a 70 44 62 46 64 20   winFile *pDbFd 
1e210 3d 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20  = (winFile*)fd; 
1e220 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
1e230 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
1e240 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1e250 77 69 6e 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  winShm *p = pDbF
1e260 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
1e270 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1e280 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
1e290 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e   locked */.  win
1e2a0 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e2c0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
1e2d0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
1e2e0 6e 67 73 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e  ngs */.  winShmN
1e2f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
1e300 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  p->pShmNode;.  i
1e310 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1e320 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
1e330 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1e340 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
1e350 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e370 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
1e380 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
1e390 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
1e3a0 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
1e3b0 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
1e3c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1e3d0 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
1e3e0 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
1e3f0 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
1e400 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1e410 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1e420 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
1e430 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
1e440 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
1e450 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
1e460 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
1e470 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
1e480 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
1e490 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
1e4a0 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
1e4b0 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
1e4c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
1e4d0 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
1e4e0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
1e4f0 56 45 29 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  VE)!=0 );..  mas
1e500 6b 20 3d 20 28 75 31 36 29 28 28 31 55 3c 3c 28  k = (u16)((1U<<(
1e510 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c  ofst+n)) - (1U<<
1e520 6f 66 73 74 29 29 3b 0a 20 20 61 73 73 65 72 74  ofst));.  assert
1e530 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
1e540 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
1e550 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1e560 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
1e570 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
1e580 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
1e590 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
1e5a0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
1e5b0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
1e5c0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
1e5d0 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
1e5e0 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
1e5f0 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
1e600 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
1e610 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
1e620 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
1e630 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
1e640 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
1e650 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1e660 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
1e670 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
1e680 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
1e690 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
1e6a0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1e6b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1e6c0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
1e6d0 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
1e6e0 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
1e6f0 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
1e700 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1e710 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1e720 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b  Node, _SHM_UNLCK
1e730 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42  , ofst+WIN_SHM_B
1e740 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c  ASE, n);.    }el
1e750 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1e760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1e770 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65  .    /* Undo the
1e780 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a   local locks */.
1e790 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e7a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1e7b0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
1e7c0 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68  ask;.      p->sh
1e7d0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
1e7e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
1e7f0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
1e800 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
1e810 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
1e820 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
1e830 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
1e840 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
1e850 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
1e860 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
1e870 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
1e880 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
1e890 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
1e8a0 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
1e8b0 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
1e8c0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
1e8d0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
1e8e0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
1e8f0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
1e900 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
1e910 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
1e920 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
1e930 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
1e940 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
1e950 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
1e960 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
1e970 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1e980 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
1e990 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1e9a0 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
1e9b0 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1e9c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
1e9d0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
1e9e0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
1e9f0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
1ea00 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1ea10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ea20 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
1ea30 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
1ea40 20 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53         rc = winS
1ea50 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
1ea60 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43  mNode, _SHM_RDLC
1ea70 4b 2c 20 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f  K, ofst+WIN_SHM_
1ea80 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
1ea90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1eaa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1eab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1eac0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
1ead0 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
1eae0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
1eaf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1eb00 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
1eb10 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
1eb20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
1eb30 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
1eb40 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1eb50 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
1eb60 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
1eb70 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
1eb80 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
1eb90 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
1eba0 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
1ebb0 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
1ebc0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
1ebd0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
1ebe0 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
1ebf0 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
1ec00 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
1ec10 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
1ec20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1ec30 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1ec40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ec50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ec60 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
1ec70 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
1ec80 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
1ec90 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
1eca0 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
1ecb0 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
1ecc0 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
1ecd0 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
1ece0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ecf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ed00 72 63 20 3d 20 77 69 6e 53 68 6d 53 79 73 74 65  rc = winShmSyste
1ed10 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20  mLock(pShmNode, 
1ed20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  _SHM_WRLCK, ofst
1ed30 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  +WIN_SHM_BASE, n
1ed40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1ed50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ed60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
1ed70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
1ed80 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
1ed90 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
1eda0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
1edb0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1edc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1edd0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1ede0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
1edf0 4d 2d 4c 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20  M-LOCK pid=%lu, 
1ee00 69 64 3d 25 64 2c 20 73 68 61 72 65 64 4d 61 73  id=%d, sharedMas
1ee10 6b 3d 25 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b  k=%03x, exclMask
1ee20 3d 25 30 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  =%03x, rc=%s\n",
1ee30 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1ee40 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1ee50 64 28 29 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73  d(), p->id, p->s
1ee60 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
1ee70 63 6c 4d 61 73 6b 2c 0a 20 20 20 20 20 20 20 20  clMask,.        
1ee80 20 20 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d     sqlite3ErrNam
1ee90 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72  e(rc)));.  retur
1eea0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
1eeb0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
1eec0 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
1eed0 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
1eee0 72 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  red memory..**.*
1eef0 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
1ef00 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
1ef10 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
1ef20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
1ef30 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
1ef40 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
1ef50 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
1ef60 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
1ef70 64 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72 28  d winShmBarrier(
1ef80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ef90 2a 66 64 20 20 20 20 20 20 20 20 20 20 2f 2a 20  *fd          /* 
1efa0 44 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  Database holding
1efb0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
1efc0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
1efd0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
1efe0 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79  .  sqlite3Memory
1eff0 42 61 72 72 69 65 72 28 29 3b 20 20 20 2f 2a 20  Barrier();   /* 
1f000 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
1f010 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
1f020 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1f030 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 2f  Mutex();       /
1f040 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f  * Also mutex, fo
1f050 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a  r redundancy */.
1f060 20 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74    winShmLeaveMut
1f070 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ex();.}../*.** T
1f080 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1f090 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
1f0a0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
1f0b0 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
1f0c0 74 68 65 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  the.** shared-me
1f0d0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
1f0e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
1f0f0 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
1f100 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
1f110 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
1f120 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
1f130 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
1f140 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
1f150 73 20 73 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79  s szRegion.** by
1f160 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
1f170 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1f180 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1f190 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
1f1a0 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
1f1b0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
1f1c0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
1f1d0 20 69 73 57 72 69 74 65 20 70 61 72 61 6d 65 74   isWrite paramet
1f1e0 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
1f1f0 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
1f200 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
1f210 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
1f220 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
1f230 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
1f240 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
1f250 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
1f260 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
1f270 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
1f280 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
1f290 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
1f2a0 69 73 57 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a  isWrite is non-z
1f2b0 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75  ero and the requ
1f2c0 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  ested shared-mem
1f2d0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e  ory region has n
1f2e0 6f 74 20 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61  ot yet.** been a
1f2f0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
1f300 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
1f310 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
1f320 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
1f330 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
1f340 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61  s already been a
1f350 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61  llocated or is a
1f360 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74  llocated by.** t
1f370 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63  his call as desc
1f380 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65  ribed above, the
1f390 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69  n it is mapped i
1f3a0 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
1f3b0 65 73 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  es.** address sp
1f3c0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
1f3d0 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
1f3e0 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
1f3f0 74 6f 20 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a  to the mapped.**
1f400 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
1f410 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
1f420 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
1f430 6e 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  nShmMap(.  sqlit
1f440 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1f450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
1f460 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
1f470 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1f480 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
1f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4a0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
1f4b0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
1f4c0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
1f4d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1f4e0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
1f4f0 0a 20 20 69 6e 74 20 69 73 57 72 69 74 65 2c 20  .  int isWrite, 
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
1f520 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
1f530 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
1f540 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
1f550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1f560 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
1f570 79 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c  y */.){.  winFil
1f580 65 20 2a 70 44 62 46 64 20 3d 20 28 77 69 6e 46  e *pDbFd = (winF
1f590 69 6c 65 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68  ile*)fd;.  winSh
1f5a0 6d 20 2a 70 53 68 6d 20 3d 20 70 44 62 46 64 2d  m *pShm = pDbFd-
1f5b0 3e 70 53 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e  >pShm;.  winShmN
1f5c0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
1f5d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1f5e0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 53 68  _OK;..  if( !pSh
1f5f0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69  m ){.    rc = wi
1f600 6e 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  nOpenSharedMemor
1f610 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
1f620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f630 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f640 20 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70   pShm = pDbFd->p
1f650 53 68 6d 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e  Shm;.  }.  pShmN
1f660 6f 64 65 20 3d 20 70 53 68 6d 2d 3e 70 53 68 6d  ode = pShm->pShm
1f670 4e 6f 64 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33  Node;..  sqlite3
1f680 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
1f690 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1f6a0 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
1f6b0 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
1f6c0 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
1f6d0 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
1f6e0 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
1f6f0 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69  ->nRegion<=iRegi
1f700 6f 6e 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  on ){.    struct
1f710 20 53 68 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65   ShmRegion *apNe
1f720 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  w;           /* 
1f730 4e 65 77 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72  New aRegion[] ar
1f740 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ray */.    int n
1f750 42 79 74 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b  Byte = (iRegion+
1f760 31 29 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a  1)*szRegion;  /*
1f770 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65   Minimum require
1f780 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1f790 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34     sqlite3_int64
1f7a0 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   sz;            
1f7b0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1f7c0 20 73 69 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64   size of wal-ind
1f7d0 65 78 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20  ex file */..    
1f7e0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1f7f0 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
1f800 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1f810 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
1f820 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
1f830 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
1f840 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
1f850 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
1f860 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
1f870 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
1f880 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
1f890 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20   file is.    ** 
1f8a0 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
1f8b0 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
1f8c0 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
1f8d0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77     */.    rc = w
1f8e0 69 6e 46 69 6c 65 53 69 7a 65 28 28 73 71 6c 69  inFileSize((sqli
1f8f0 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d  te3_file *)&pShm
1f900 4e 6f 64 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a  Node->hFile, &sz
1f910 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f920 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f930 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
1f940 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
1f950 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61  SHMSIZE, osGetLa
1f960 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20  stError(),.     
1f970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f980 20 20 22 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20    "winShmMap1", 
1f990 70 44 62 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  pDbFd->zPath);. 
1f9a0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
1f9b0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  e_out;.    }..  
1f9c0 20 20 69 66 28 20 73 7a 3c 6e 42 79 74 65 20 29    if( sz<nByte )
1f9d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
1f9e0 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20  equested memory 
1f9f0 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  region does not 
1fa00 65 78 69 73 74 2e 20 49 66 20 69 73 57 72 69 74  exist. If isWrit
1fa10 65 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20  e is set to.    
1fa20 20 20 2a 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20    ** zero, exit 
1fa30 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
1fa40 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
1fa50 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1fa60 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  urned..      **.
1fa70 20 20 20 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61        ** Alterna
1fa80 74 69 76 65 6c 79 2c 20 69 66 20 69 73 57 72 69  tively, if isWri
1fa90 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  te is non-zero, 
1faa0 75 73 65 20 66 74 72 75 6e 63 61 74 65 28 29 20  use ftruncate() 
1fab0 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20  to allocate.    
1fac0 20 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74    ** the request
1fad0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
1fae0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1faf0 20 69 66 28 20 21 69 73 57 72 69 74 65 20 29 20   if( !isWrite ) 
1fb00 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
1fb10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
1fb20 54 72 75 6e 63 61 74 65 28 28 73 71 6c 69 74 65  Truncate((sqlite
1fb30 33 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f  3_file *)&pShmNo
1fb40 64 65 2d 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65  de->hFile, nByte
1fb50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1fb60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fb70 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f        rc = winLo
1fb80 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1fb90 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47  ERR_SHMSIZE, osG
1fba0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20  etLastError(),. 
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d          "winShmM
1fbd0 61 70 32 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61  ap2", pDbFd->zPa
1fbe0 74 68 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  th);.        got
1fbf0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1fc00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1fc10 20 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71    /* Map the req
1fc20 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65  uested memory re
1fc30 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70  gion into this p
1fc40 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
1fc50 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
1fc60 70 4e 65 77 20 3d 20 28 73 74 72 75 63 74 20 53  pNew = (struct S
1fc70 68 6d 52 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74  hmRegion *)sqlit
1fc80 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20  e3_realloc64(.  
1fc90 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
1fca0 61 52 65 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f  aRegion, (iRegio
1fcb0 6e 2b 31 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65  n+1)*sizeof(apNe
1fcc0 77 5b 30 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20  w[0]).    );.   
1fcd0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
1fce0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1fcf0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
1fd00 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
1fd10 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
1fd20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
1fd30 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
1fd40 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
1fd50 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69  Node->nRegion<=i
1fd60 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  Region ){.      
1fd70 48 41 4e 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55  HANDLE hMap = NU
1fd80 4c 4c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 66  LL;         /* f
1fd90 69 6c 65 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64  ile-mapping hand
1fda0 6c 65 20 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64  le */.      void
1fdb0 20 2a 70 4d 61 70 20 3d 20 30 3b 20 20 20 20 20   *pMap = 0;     
1fdc0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 70 70 65          /* Mappe
1fdd0 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d memory region 
1fde0 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  */..#if SQLITE_O
1fdf0 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 68 4d  S_WINRT.      hM
1fe00 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c  ap = osCreateFil
1fe10 65 4d 61 70 70 69 6e 67 46 72 6f 6d 41 70 70 28  eMappingFromApp(
1fe20 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e  pShmNode->hFile.
1fe30 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c  h,.          NUL
1fe40 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54  L, PAGE_READWRIT
1fe50 45 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20  E, nByte, NULL. 
1fe60 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65       );.#elif de
1fe70 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
1fe80 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
1fe90 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72 65 61     hMap = osCrea
1fea0 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 57 28 70  teFileMappingW(p
1feb0 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68  ShmNode->hFile.h
1fec0 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c  ,.          NULL
1fed0 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49 54 45  , PAGE_READWRITE
1fee0 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c  , 0, nByte, NULL
1fef0 0a 20 20 20 20 20 20 29 3b 0a 23 65 6c 69 66 20  .      );.#elif 
1ff00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57  defined(SQLITE_W
1ff10 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 29 20 26  IN32_HAS_ANSI) &
1ff20 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43  & SQLITE_WIN32_C
1ff30 52 45 41 54 45 46 49 4c 45 4d 41 50 50 49 4e 47  REATEFILEMAPPING
1ff40 41 0a 20 20 20 20 20 20 68 4d 61 70 20 3d 20 6f  A.      hMap = o
1ff50 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69  sCreateFileMappi
1ff60 6e 67 41 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46  ngA(pShmNode->hF
1ff70 69 6c 65 2e 68 2c 0a 20 20 20 20 20 20 20 20 20  ile.h,.         
1ff80 20 4e 55 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44   NULL, PAGE_READ
1ff90 57 52 49 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c  WRITE, 0, nByte,
1ffa0 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23   NULL.      );.#
1ffb0 65 6e 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52  endif.      OSTR
1ffc0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52  ACE(("SHM-MAP-CR
1ffd0 45 41 54 45 20 70 69 64 3d 25 6c 75 2c 20 72 65  EATE pid=%lu, re
1ffe0 67 69 6f 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64  gion=%d, size=%d
1fff0 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20  , rc=%s\n",.    
20000 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
20010 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
20020 28 29 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  (), pShmNode->nR
20030 65 67 69 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20  egion, nByte,.  
20040 20 20 20 20 20 20 20 20 20 20 20 20 20 68 4d 61               hMa
20050 70 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  p ? "ok" : "fail
20060 65 64 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28  ed"));.      if(
20070 20 68 4d 61 70 20 29 7b 0a 20 20 20 20 20 20 20   hMap ){.       
20080 20 69 6e 74 20 69 4f 66 66 73 65 74 20 3d 20 70   int iOffset = p
20090 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
200a0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20  *szRegion;.     
200b0 20 20 20 69 6e 74 20 69 4f 66 66 73 65 74 53 68     int iOffsetSh
200c0 69 66 74 20 3d 20 69 4f 66 66 73 65 74 20 25 20  ift = iOffset % 
200d0 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c  winSysInfo.dwAll
200e0 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69  ocationGranulari
200f0 74 79 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ty;.#if SQLITE_O
20100 53 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 20 20  S_WINRT.        
20110 70 4d 61 70 20 3d 20 6f 73 4d 61 70 56 69 65 77  pMap = osMapView
20120 4f 66 46 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d  OfFileFromApp(hM
20130 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49  ap, FILE_MAP_WRI
20140 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45  TE | FILE_MAP_RE
20150 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AD,.            
20160 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66 73 65  iOffset - iOffse
20170 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e  tShift, szRegion
20180 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66 74 0a   + iOffsetShift.
20190 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6c 73 65          );.#else
201a0 0a 20 20 20 20 20 20 20 20 70 4d 61 70 20 3d 20  .        pMap = 
201b0 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28  osMapViewOfFile(
201c0 68 4d 61 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57  hMap, FILE_MAP_W
201d0 52 49 54 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f  RITE | FILE_MAP_
201e0 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20 20 20  READ,.          
201f0 20 20 30 2c 20 69 4f 66 66 73 65 74 20 2d 20 69    0, iOffset - i
20200 4f 66 66 73 65 74 53 68 69 66 74 2c 20 73 7a 52  OffsetShift, szR
20210 65 67 69 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53  egion + iOffsetS
20220 68 69 66 74 0a 20 20 20 20 20 20 20 20 29 3b 0a  hift.        );.
20230 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 4f  #endif.        O
20240 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4d 41 50  STRACE(("SHM-MAP
20250 2d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 72 65  -MAP pid=%lu, re
20260 67 69 6f 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d  gion=%d, offset=
20270 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d  %d, size=%d, rc=
20280 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
20290 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
202a0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
202b0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
202c0 6f 6e 2c 20 69 4f 66 66 73 65 74 2c 0a 20 20 20  on, iOffset,.   
202d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 7a                sz
202e0 52 65 67 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22  Region, pMap ? "
202f0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
20300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20310 69 66 28 20 21 70 4d 61 70 20 29 7b 0a 20 20 20  if( !pMap ){.   
20320 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c       pShmNode->l
20330 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
20340 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
20350 20 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67       rc = winLog
20360 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
20370 52 52 5f 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e  RR_SHMMAP, pShmN
20380 6f 64 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ode->lastErrno,.
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 20 20 20 20 20 20 20 20 22 77 69 6e 53 68 6d           "winShm
203b0 4d 61 70 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50  Map3", pDbFd->zP
203c0 61 74 68 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ath);.        if
203d0 28 20 68 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65  ( hMap ) osClose
203e0 48 61 6e 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20  Handle(hMap);.  
203f0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
20400 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
20410 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20420 3e 61 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64  >aRegion[pShmNod
20430 65 2d 3e 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70  e->nRegion].pMap
20440 20 3d 20 70 4d 61 70 3b 0a 20 20 20 20 20 20 70   = pMap;.      p
20450 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e  ShmNode->aRegion
20460 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
20470 6f 6e 5d 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b  on].hMap = hMap;
20480 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
20490 3e 6e 52 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20  >nRegion++;.    
204a0 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f  }.  }..shmpage_o
204b0 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  ut:.  if( pShmNo
204c0 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67  de->nRegion>iReg
204d0 69 6f 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ion ){.    int i
204e0 4f 66 66 73 65 74 20 3d 20 69 52 65 67 69 6f 6e  Offset = iRegion
204f0 2a 73 7a 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69  *szRegion;.    i
20500 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74 20  nt iOffsetShift 
20510 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e 53  = iOffset % winS
20520 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74  ysInfo.dwAllocat
20530 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a  ionGranularity;.
20540 20 20 20 20 63 68 61 72 20 2a 70 20 3d 20 28 63      char *p = (c
20550 68 61 72 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e  har *)pShmNode->
20560 61 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  aRegion[iRegion]
20570 2e 70 4d 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d  .pMap;.    *pp =
20580 20 28 76 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66   (void *)&p[iOff
20590 73 65 74 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c  setShift];.  }el
205a0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
205b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
205c0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
205d0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
205e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c  eturn rc;.}..#el
205f0 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53  se.# define winS
20600 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
20610 66 69 6e 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20  fine winShmLock 
20620 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 77 69     0.# define wi
20630 6e 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  nShmBarrier 0.# 
20640 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d  define winShmUnm
20650 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a  ap   0.#endif /*
20660 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f   #ifndef SQLITE_
20670 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a  OMIT_WAL */../*.
20680 2a 2a 20 43 6c 65 61 6e 73 20 75 70 20 74 68 65  ** Cleans up the
20690 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6f   mapped region o
206a0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
206b0 66 69 6c 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  file, if any..*/
206c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
206d0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74  MMAP_SIZE>0.stat
206e0 69 63 20 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66  ic int winUnmapf
206f0 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ile(winFile *pFi
20700 6c 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  le){.  assert( p
20710 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54  File!=0 );.  OST
20720 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c  RACE(("UNMAP-FIL
20730 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  E pid=%lu, pFile
20740 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d  =%p, hMap=%p, pM
20750 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20  apRegion=%p, ". 
20760 20 20 20 20 20 20 20 20 20 20 22 6d 6d 61 70 53            "mmapS
20770 69 7a 65 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69  ize=%lld, mmapSi
20780 7a 65 41 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d  zeActual=%lld, m
20790 6d 61 70 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c  mapSizeMax=%lld\
207a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
207b0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
207c0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
207d0 46 69 6c 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c  File->hMap, pFil
207e0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20  e->pMapRegion,. 
207f0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
20800 3e 6d 6d 61 70 53 69 7a 65 2c 20 70 46 69 6c 65  >mmapSize, pFile
20810 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
20820 2c 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  , pFile->mmapSiz
20830 65 4d 61 78 29 29 3b 0a 20 20 69 66 28 20 70 46  eMax));.  if( pF
20840 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  ile->pMapRegion 
20850 29 7b 0a 20 20 20 20 69 66 28 20 21 6f 73 55 6e  ){.    if( !osUn
20860 6d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  mapViewOfFile(pF
20870 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
20880 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20890 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47  >lastErrno = osG
208a0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20  etLastError();. 
208b0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 55       OSTRACE(("U
208c0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
208d0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61  u, pFile=%p, pMa
208e0 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20  pRegion=%p, ".  
208f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 63               "rc
20900 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  =SQLITE_IOERR_MM
20910 41 50 5c 6e 22 2c 20 6f 73 47 65 74 43 75 72 72  AP\n", osGetCurr
20920 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
20930 70 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  pFile,.         
20940 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61        pFile->pMa
20950 70 52 65 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20  pRegion));.     
20960 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
20970 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20980 5f 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61  _MMAP, pFile->la
20990 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  stErrno,.       
209a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
209b0 20 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31    "winUnmapfile1
209c0 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
209d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
209e0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  e->pMapRegion = 
209f0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  0;.    pFile->mm
20a00 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
20a10 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41  pFile->mmapSizeA
20a20 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  ctual = 0;.  }. 
20a30 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70   if( pFile->hMap
20a40 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  !=NULL ){.    if
20a50 28 20 21 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65  ( !osCloseHandle
20a60 28 70 46 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b  (pFile->hMap) ){
20a70 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
20a80 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
20a90 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
20aa0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20ab0 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20ac0 70 46 69 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25  pFile=%p, hMap=%
20ad0 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  p, rc=SQLITE_IOE
20ae0 52 52 5f 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20  RR_MMAP\n",.    
20af0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
20b00 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
20b10 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65  (), pFile, pFile
20b20 2d 3e 68 4d 61 70 29 29 3b 0a 20 20 20 20 20 20  ->hMap));.      
20b30 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
20b40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20b50 4d 4d 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  MMAP, pFile->las
20b60 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
20b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b80 20 22 77 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22   "winUnmapfile2"
20b90 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
20ba0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65  .    }.    pFile
20bb0 2d 3e 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20  ->hMap = NULL;. 
20bc0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55   }.  OSTRACE(("U
20bd0 4e 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  NMAP-FILE pid=%l
20be0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
20bf0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
20c00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
20c10 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
20c20 2c 20 70 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  , pFile));.  ret
20c30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
20c40 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d  ../*.** Memory m
20c50 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20  ap or remap the 
20c60 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66  file opened by f
20c70 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
20c80 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a  Fd (if the file.
20c90 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61  ** is already ma
20ca0 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69  pped, the existi
20cb0 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65  ng mapping is re
20cc0 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65  placed by the ne
20cd0 77 29 2e 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68  w). Or, if.** th
20ce0 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
20cf0 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
20d00 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
20d10 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 0a  there are still.
20d20 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
20d30 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
20d40 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
20d50 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20d60 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
20d70 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
20d80 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
20d90 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
20da0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a  uested size of.*
20db0 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
20dc0 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
20dd0 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
20de0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
20df0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75  then the.** requ
20e00 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
20e10 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
20e20 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
20e30 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
20e40 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
20e50 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
20e60 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
20e70 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
20e80 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 75 73  configured.** us
20e90 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ing SQLITE_FCNTL
20ea0 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 77 68 69 63  _MMAP_SIZE, whic
20eb0 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
20ec0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
20ed0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
20ee0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
20ef0 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
20f00 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
20f10 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
20f20 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
20f30 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
20f40 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
20f50 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
20f60 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
20f70 20 69 6e 74 20 77 69 6e 4d 61 70 66 69 6c 65 28   int winMapfile(
20f80 77 69 6e 46 69 6c 65 20 2a 70 46 64 2c 20 73 71  winFile *pFd, sq
20f90 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74  lite3_int64 nByt
20fa0 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  e){.  sqlite3_in
20fb0 74 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65  t64 nMap = nByte
20fc0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
20fd0 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
20fe0 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
20ff0 3d 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ==0 );.  OSTRACE
21000 28 28 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d  (("MAP-FILE pid=
21010 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73  %lu, pFile=%p, s
21020 69 7a 65 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20  ize=%lld\n",.   
21030 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
21040 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21050 20 70 46 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a   pFd, nByte));..
21060 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
21070 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
21080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
21090 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
210a0 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65  rc = winFileSize
210b0 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  ((sqlite3_file*)
210c0 70 46 64 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20  pFd, &nMap);.   
210d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
210e0 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
210f0 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
21100 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
21110 5f 49 4f 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c  _IOERR_FSTAT\n",
21120 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21130 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
21140 65 73 73 49 64 28 29 2c 20 70 46 64 29 29 3b 0a  essId(), pFd));.
21150 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
21160 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
21170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
21180 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
21190 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
211a0 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
211b0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61  zeMax;.  }.  nMa
211c0 70 20 26 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69  p &= ~(sqlite3_i
211d0 6e 74 36 34 29 28 77 69 6e 53 79 73 49 6e 66 6f  nt64)(winSysInfo
211e0 2e 64 77 50 61 67 65 53 69 7a 65 20 2d 20 31 29  .dwPageSize - 1)
211f0 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30  ;..  if( nMap==0
21200 20 26 26 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   && pFd->mmapSiz
21210 65 3e 30 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e  e>0 ){.    winUn
21220 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
21230 7d 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46  }.  if( nMap!=pF
21240 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  d->mmapSize ){. 
21250 20 20 20 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20     void *pNew = 
21260 30 3b 0a 20 20 20 20 44 57 4f 52 44 20 70 72 6f  0;.    DWORD pro
21270 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45 41 44  tect = PAGE_READ
21280 4f 4e 4c 59 3b 0a 20 20 20 20 44 57 4f 52 44 20  ONLY;.    DWORD 
21290 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50  flags = FILE_MAP
212a0 5f 52 45 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55  _READ;..    winU
212b0 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 23  nmapfile(pFd);.#
212c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41  ifdef SQLITE_MMA
212d0 50 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  P_READWRITE.    
212e0 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c  if( (pFd->ctrlFl
212f0 61 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 52 44  ags & WINFILE_RD
21300 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
21310 20 20 70 72 6f 74 65 63 74 20 3d 20 50 41 47 45    protect = PAGE
21320 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20  _READWRITE;.    
21330 20 20 66 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f    flags |= FILE_
21340 4d 41 50 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  MAP_WRITE;.    }
21350 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
21360 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20  TE_OS_WINRT.    
21370 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72  pFd->hMap = osCr
21380 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 46  eateFileMappingF
21390 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e  romApp(pFd->h, N
213a0 55 4c 4c 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d  ULL, protect, nM
213b0 61 70 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66  ap, NULL);.#elif
213c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
213d0 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29 0a  WIN32_HAS_WIDE).
213e0 20 20 20 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20      pFd->hMap = 
213f0 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
21400 69 6e 67 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c  ingW(pFd->h, NUL
21410 4c 2c 20 70 72 6f 74 65 63 74 2c 0a 20 20 20 20  L, protect,.    
21420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21430 20 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f              (DWO
21440 52 44 29 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26  RD)((nMap>>32) &
21450 20 30 78 66 66 66 66 66 66 66 66 29 2c 0a 20 20   0xffffffff),.  
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 44                (D
21480 57 4f 52 44 29 28 6e 4d 61 70 20 26 20 30 78 66  WORD)(nMap & 0xf
21490 66 66 66 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b  fffffff), NULL);
214a0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
214b0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
214c0 41 4e 53 49 29 20 26 26 20 53 51 4c 49 54 45 5f  ANSI) && SQLITE_
214d0 57 49 4e 33 32 5f 43 52 45 41 54 45 46 49 4c 45  WIN32_CREATEFILE
214e0 4d 41 50 50 49 4e 47 41 0a 20 20 20 20 70 46 64  MAPPINGA.    pFd
214f0 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
21500 65 46 69 6c 65 4d 61 70 70 69 6e 67 41 28 70 46  eFileMappingA(pF
21510 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74  d->h, NULL, prot
21520 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ect,.           
21530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21540 20 20 20 20 20 28 44 57 4f 52 44 29 28 28 6e 4d       (DWORD)((nM
21550 61 70 3e 3e 33 32 29 20 26 20 30 78 66 66 66 66  ap>>32) & 0xffff
21560 66 66 66 66 29 2c 0a 20 20 20 20 20 20 20 20 20  ffff),.         
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21580 20 20 20 20 20 20 20 28 44 57 4f 52 44 29 28 6e         (DWORD)(n
21590 4d 61 70 20 26 20 30 78 66 66 66 66 66 66 66 66  Map & 0xffffffff
215a0 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  ), NULL);.#endif
215b0 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 68 4d  .    if( pFd->hM
215c0 61 70 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  ap==NULL ){.    
215d0 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f    pFd->lastErrno
215e0 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f   = osGetLastErro
215f0 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  r();.      rc = 
21600 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
21610 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70  TE_IOERR_MMAP, p
21620 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  Fd->lastErrno,. 
21630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21640 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c        "winMapfil
21650 65 31 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  e1", pFd->zPath)
21660 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74  ;.      /* Log t
21670 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f  he error, but co
21680 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70  ntinue normal op
21690 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52  eration using xR
216a0 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20  ead/xWrite */.  
216b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41      OSTRACE(("MA
216c0 50 2d 46 49 4c 45 2d 43 52 45 41 54 45 20 70 69  P-FILE-CREATE pi
216d0 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
216e0 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
216f0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
21700 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
21710 29 2c 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45  ), pFd, sqlite3E
21720 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
21730 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21740 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
21750 61 73 73 65 72 74 28 20 28 6e 4d 61 70 20 25 20  assert( (nMap % 
21760 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 50 61 67  winSysInfo.dwPag
21770 65 53 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20  eSize)==0 );.   
21780 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
21790 53 49 5a 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28  SIZE_T)==sizeof(
217a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 20 7c  sqlite3_int64) |
217b0 7c 20 6e 4d 61 70 3c 3d 30 78 66 66 66 66 66 66  | nMap<=0xffffff
217c0 66 66 20 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ff );.#if SQLITE
217d0 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e  _OS_WINRT.    pN
217e0 65 77 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66  ew = osMapViewOf
217f0 46 69 6c 65 46 72 6f 6d 41 70 70 28 70 46 64 2d  FileFromApp(pFd-
21800 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c  >hMap, flags, 0,
21810 20 28 53 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a   (SIZE_T)nMap);.
21820 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
21830 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65   osMapViewOfFile
21840 28 70 46 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67  (pFd->hMap, flag
21850 73 2c 20 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54  s, 0, 0, (SIZE_T
21860 29 6e 4d 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20  )nMap);.#endif. 
21870 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c     if( pNew==NUL
21880 4c 20 29 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f  L ){.      osClo
21890 73 65 48 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d  seHandle(pFd->hM
218a0 61 70 29 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ap);.      pFd->
218b0 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  hMap = NULL;.   
218c0 20 20 20 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e     pFd->lastErrn
218d0 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
218e0 6f 72 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  or();.      rc =
218f0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
21900 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20  ITE_IOERR_MMAP, 
21910 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  pFd->lastErrno,.
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 22 77 69 6e 4d 61 70 66 69         "winMapfi
21940 6c 65 32 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68  le2", pFd->zPath
21950 29 3b 0a 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20  );.      /* Log 
21960 74 68 65 20 65 72 72 6f 72 2c 20 62 75 74 20 63  the error, but c
21970 6f 6e 74 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f  ontinue normal o
21980 70 65 72 61 74 69 6f 6e 20 75 73 69 6e 67 20 78  peration using x
21990 52 65 61 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20  Read/xWrite */. 
219a0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4d       OSTRACE(("M
219b0 41 50 2d 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d  AP-FILE-MAP pid=
219c0 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72  %lu, pFile=%p, r
219d0 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
219e0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
219f0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
21a00 20 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72   pFd, sqlite3Err
21a10 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
21a20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21a30 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46  OK;.    }.    pF
21a40 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
21a50 70 4e 65 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d  pNew;.    pFd->m
21a60 6d 61 70 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a  mapSize = nMap;.
21a70 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
21a80 65 41 63 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a  eActual = nMap;.
21a90 20 20 7d 0a 0a 20 20 4f 53 54 52 41 43 45 28 28    }..  OSTRACE((
21aa0 22 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c  "MAP-FILE pid=%l
21ab0 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d  u, pFile=%p, rc=
21ac0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
21ad0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21ae0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21af0 2c 20 70 46 64 29 29 3b 0a 20 20 72 65 74 75 72  , pFd));.  retur
21b00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
21b10 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21b20 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20  MAX_MMAP_SIZE>0 
21b30 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73  */../*.** If pos
21b40 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20  sible, return a 
21b50 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70  pointer to a map
21b60 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20  ping of file fd 
21b70 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73  starting at offs
21b80 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20  et.** iOff. The 
21b90 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20  mapping must be 
21ba0 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61  valid for at lea
21bb0 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a  st nAmt bytes..*
21bc0 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70  *.** If such a p
21bd0 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62  ointer can be ob
21be0 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74  tained, store it
21bf0 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75   in *pp and retu
21c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
21c10 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e   Or, if one cann
21c20 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  ot but no error 
21c30 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20  occurs, set *pp 
21c40 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
21c50 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69  SQLITE_OK..** Fi
21c60 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72  nally, if an err
21c70 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72  or does occur, r
21c80 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
21c90 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20  error code. The 
21ca0 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f  final.** value o
21cb0 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e  f *pp is undefin
21cc0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
21cd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66  .**.** If this f
21ce0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74  unction does ret
21cf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74  urn a pointer, t
21d00 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65  he caller must e
21d10 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c  ventually.** rel
21d20 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
21d30 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 77 69  ce by calling wi
21d40 6e 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73  nUnfetch()..*/.s
21d50 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46 65 74  tatic int winFet
21d60 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ch(sqlite3_file 
21d70 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69  *fd, i64 iOff, i
21d80 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a  nt nAmt, void **
21d90 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pp){.#if SQLITE_
21da0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
21db0 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d    winFile *pFd =
21dc0 20 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20   (winFile*)fd;  
21dd0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
21de0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
21df0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
21e00 20 3d 20 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45   = 0;..  OSTRACE
21e10 28 28 22 46 45 54 43 48 20 70 69 64 3d 25 6c 75  (("FETCH pid=%lu
21e20 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73  , pFile=%p, offs
21e30 65 74 3d 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d  et=%lld, amount=
21e40 25 64 2c 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20  %d, pp=%p\n",.  
21e50 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
21e60 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
21e70 2c 20 66 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74  , fd, iOff, nAmt
21e80 2c 20 70 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c  , pp));..#if SQL
21e90 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
21ea0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
21eb0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
21ec0 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
21ed0 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
21ee0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
21ef0 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
21f00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
21f10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21f20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
21f30 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
21f40 69 6c 65 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22  ile=%p, rc=%s\n"
21f50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21f60 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
21f70 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
21f80 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
21f90 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
21fa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21fb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
21fc0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
21fd0 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
21fe0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
21ff0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
22000 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
22010 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
22020 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
22030 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
22040 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
22050 46 69 6c 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20  File=%p, pp=%p, 
22060 2a 70 70 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  *pp=%p, rc=SQLIT
22070 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
22080 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22090 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 2c  ProcessId(), fd,
220a0 20 70 70 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65   pp, *pp));.  re
220b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
220c0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
220d0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
220e0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
220f0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
22100 65 6c 65 61 73 65 73 20 61 0a 2a 2a 20 72 65 66  eleases a.** ref
22110 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20  erence obtained 
22120 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
22130 6c 6c 20 74 6f 20 77 69 6e 46 65 74 63 68 28 29  ll to winFetch()
22140 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  . The second.** 
22150 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
22160 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
22170 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
22180 65 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70  e as the corresp
22190 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65  onding.** argume
221a0 6e 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73  nt that was pass
221b0 65 64 20 74 6f 20 74 68 65 20 77 69 6e 46 65 74  ed to the winFet
221c0 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
221d0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
221e0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
221f0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
22200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22210 62 65 69 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20  being called.** 
22220 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
22230 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
22240 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
22250 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
22260 61 70 70 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f  apping.** may no
22270 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e 64  w be invalid and
22280 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70   should be unmap
22290 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
222a0 6e 74 20 77 69 6e 55 6e 66 65 74 63 68 28 73 71  nt winUnfetch(sq
222b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
222c0 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a  i64 iOff, void *
222d0 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
222e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
222f0 20 77 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20   winFile *pFd = 
22300 28 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20  (winFile*)fd;   
22310 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
22320 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
22330 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  */..  /* If p==0
22340 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
22350 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
22360 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
22370 75 74 73 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20  utstanding.  ** 
22380 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
22390 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
223a0 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
223b0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
223c0 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
223d0 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
223e0 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
223f0 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
22400 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
22410 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
22420 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
22430 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
22440 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
22450 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
22460 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
22470 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
22480 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54  [iOff] );..  OST
22490 52 41 43 45 28 28 22 55 4e 46 45 54 43 48 20 70  RACE(("UNFETCH p
224a0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
224b0 2c 20 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70  , offset=%lld, p
224c0 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
224d0 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50     osGetCurrentP
224e0 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 64 2c  rocessId(), pFd,
224f0 20 69 4f 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69   iOff, p));..  i
22500 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
22510 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
22520 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49  }else{.    /* FI
22530 58 4d 45 3a 20 20 49 66 20 57 69 6e 64 6f 77 73  XME:  If Windows
22540 20 74 72 75 6c 79 20 61 6c 77 61 79 73 20 70 72   truly always pr
22550 65 76 65 6e 74 73 20 74 72 75 6e 63 61 74 69 6e  events truncatin
22560 67 20 6f 72 20 64 65 6c 65 74 69 6e 67 20 61 0a  g or deleting a.
22570 20 20 20 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c      ** file whil
22580 65 20 61 20 6d 61 70 70 69 6e 67 20 69 73 20 68  e a mapping is h
22590 65 6c 64 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  eld, then the fo
225a0 6c 6c 6f 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70  llowing winUnmap
225b0 66 69 6c 65 28 29 20 63 61 6c 6c 0a 20 20 20 20  file() call.    
225c0 2a 2a 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72  ** is unnecessar
225d0 79 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64  y can be omitted
225e0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69   - potentially i
225f0 6d 70 72 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20  mproving.    ** 
22600 70 65 72 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f  performance.  */
22610 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c  .    winUnmapfil
22620 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
22630 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
22640 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64  chOut>=0 );.#end
22650 69 66 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  if..  OSTRACE(("
22660 55 4e 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c  UNFETCH pid=%lu,
22670 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51   pFile=%p, rc=SQ
22680 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20  LITE_OK\n",.    
22690 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
226a0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
226b0 66 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  fd));.  return S
226c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
226d0 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68 65  ** Here ends the
226e0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
226f0 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  of all sqlite3_f
22700 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a  ile methods..**.
22710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22720 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74  ****** End sqlit
22730 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73 20  e3_file Methods 
22740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
22760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
227b0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
227c0 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
227d0 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
227e0 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
227f0 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c  n.** sqlite3_fil
22800 65 20 66 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a  e for win32..*/.
22810 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
22820 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
22830 77 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  winIoMethod = {.
22840 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
22870 0a 20 20 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20  .  winClose,    
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
228a0 20 20 77 69 6e 52 65 61 64 2c 20 20 20 20 20 20    winRead,      
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20    /* xRead */.  
228d0 77 69 6e 57 72 69 74 65 2c 20 20 20 20 20 20 20  winWrite,       
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 2f 2a 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 77  /* xWrite */.  w
22900 69 6e 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20  inTruncate,     
22910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22920 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20  * xTruncate */. 
22930 20 77 69 6e 53 79 6e 63 2c 20 20 20 20 20 20 20   winSync,       
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77   /* xSync */.  w
22960 69 6e 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  inFileSize,     
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22980 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20  * xFileSize */. 
22990 20 77 69 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20   winLock,       
229a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229b0 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77   /* xLock */.  w
229c0 69 6e 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  inUnlock,       
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
229e0 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77  * xUnlock */.  w
229f0 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  inCheckReservedL
22a00 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ock,           /
22a10 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
22a20 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c  Lock */.  winFil
22a30 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
22a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
22a50 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77  leControl */.  w
22a60 69 6e 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20  inSectorSize,   
22a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a80 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
22a90 0a 20 20 77 69 6e 44 65 76 69 63 65 43 68 61 72  .  winDeviceChar
22aa0 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 20 20  acteristics,    
22ab0 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
22ac0 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
22ad0 20 20 77 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20    winShmMap,    
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a    /* xShmMap */.
22b00 20 20 77 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20    winShmLock,   
22b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
22b30 0a 20 20 77 69 6e 53 68 6d 42 61 72 72 69 65 72  .  winShmBarrier
22b40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b50 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65     /* xShmBarrie
22b60 72 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d  r */.  winShmUnm
22b70 61 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ap,             
22b80 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
22b90 6d 61 70 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63  map */.  winFetc
22ba0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
22bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
22bc0 63 68 20 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74  ch */.  winUnfet
22bd0 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
22be0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
22bf0 74 63 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a  tch */.};../****
22c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
22c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c60 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
22c70 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
22c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22c90 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
22ca0 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
22cb0 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
22cc0 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
22cd0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
22ce0 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
22cf0 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
22d00 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a  __CYGWIN__)./*.*
22d10 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 69 6c 65  * Convert a file
22d20 6e 61 6d 65 20 66 72 6f 6d 20 77 68 61 74 65 76  name from whatev
22d30 65 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  er the underlyin
22d40 67 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  g operating syst
22d50 65 6d 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 66  em.** supports f
22d60 6f 72 20 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74  or filenames int
22d70 6f 20 55 54 46 2d 38 2e 20 20 53 70 61 63 65 20  o UTF-8.  Space 
22d80 74 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75  to hold the resu
22d90 6c 74 20 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65  lt is.** obtaine
22da0 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e  d from malloc an
22db0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
22dc0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66  by the calling f
22dd0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  unction..*/.stat
22de0 69 63 20 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76  ic char *winConv
22df0 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d  ertToUtf8Filenam
22e00 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46  e(const void *zF
22e10 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72  ilename){.  char
22e20 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
22e30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
22e40 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
22e50 65 64 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ed = winUnicodeT
22e60 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29  oUtf8(zFilename)
22e70 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
22e80 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
22e90 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
22ea0 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 4d  Converted = winM
22eb0 62 63 73 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e  bcsToUtf8(zFilen
22ec0 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ame, osAreFileAp
22ed0 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23  isANSI());.  }.#
22ee0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
22ef0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
22f00 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
22f10 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
22f20 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ed;.}.#endif../*
22f30 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 55 54  .** Convert a UT
22f40 46 2d 38 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  F-8 filename int
22f50 6f 20 77 68 61 74 65 76 65 72 20 66 6f 72 6d 20  o whatever form 
22f60 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a  the underlying.*
22f70 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
22f80 65 6d 20 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d  em wants filenam
22f90 65 73 20 69 6e 2e 20 20 53 70 61 63 65 20 74 6f  es in.  Space to
22fa0 20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74   hold the result
22fb0 0a 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20  .** is obtained 
22fc0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20  from malloc and 
22fd0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79  must be freed by
22fe0 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20   the calling.** 
22ff0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
23000 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e  tic void *winCon
23010 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
23020 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20  name(const char 
23030 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76  *zFilename){.  v
23040 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20  oid *zConverted 
23050 3d 20 30 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e  = 0;.  if( osIsN
23060 54 28 29 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76  T() ){.    zConv
23070 65 72 74 65 64 20 3d 20 77 69 6e 55 74 66 38 54  erted = winUtf8T
23080 6f 55 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61  oUnicode(zFilena
23090 6d 65 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20  me);.  }.#ifdef 
230a0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
230b0 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20  _ANSI.  else{.  
230c0 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77    zConverted = w
230d0 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a 46 69  inUtf8ToMbcs(zFi
230e0 6c 65 6e 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c  lename, osAreFil
230f0 65 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20  eApisANSI());.  
23100 7d 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61  }.#endif.  /* ca
23110 6c 6c 65 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65  ller will handle
23120 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a   out of memory *
23130 2f 0a 20 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76  /.  return zConv
23140 65 72 74 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  erted;.}../*.** 
23150 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
23160 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
23170 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
23180 55 54 46 2d 38 20 73 74 72 69 6e 67 20 62 75 66  UTF-8 string buf
23190 66 65 72 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68  fer.** ends with
231a0 20 61 20 64 69 72 65 63 74 6f 72 79 20 73 65 70   a directory sep
231b0 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
231c0 20 6f 72 20 6f 6e 65 20 77 61 73 20 73 75 63 63   or one was succ
231d0 65 73 73 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65  essfully.** adde
231e0 64 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  d to it..*/.stat
231f0 69 63 20 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e  ic int winMakeEn
23200 64 49 6e 44 69 72 53 65 70 28 69 6e 74 20 6e 42  dInDirSep(int nB
23210 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
23220 0a 20 20 69 66 28 20 7a 42 75 66 20 29 7b 0a 20  .  if( zBuf ){. 
23230 20 20 20 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71     int nLen = sq
23240 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
23250 75 66 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65  uf);.    if( nLe
23260 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  n>0 ){.      if(
23270 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 42 75   winIsDirSep(zBu
23280 66 5b 6e 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20  f[nLen-1]) ){.  
23290 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
232a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
232b0 6e 4c 65 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20  nLen+1<nBuf ){. 
232c0 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e         zBuf[nLen
232d0 5d 20 3d 20 77 69 6e 47 65 74 44 69 72 53 65 70  ] = winGetDirSep
232e0 28 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66  ();.        zBuf
232f0 5b 6e 4c 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b  [nLen+1] = '\0';
23300 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23310 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
23320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
23330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
23340 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
23350 65 20 6e 61 6d 65 20 61 6e 64 20 73 74 6f 72 65  e name and store
23360 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 70   the resulting p
23370 6f 69 6e 74 65 72 20 69 6e 74 6f 20 70 7a 42 75  ointer into pzBu
23380 66 2e 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  f..** The pointe
23390 72 20 72 65 74 75 72 6e 65 64 20 69 6e 20 70 7a  r returned in pz
233a0 42 75 66 20 6d 75 73 74 20 62 65 20 66 72 65 65  Buf must be free
233b0 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 66 72  d via sqlite3_fr
233c0 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ee()..*/.static 
233d0 69 6e 74 20 77 69 6e 47 65 74 54 65 6d 70 6e 61  int winGetTempna
233e0 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  me(sqlite3_vfs *
233f0 70 56 66 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42  pVfs, char **pzB
23400 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68  uf){.  static ch
23410 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20  ar zChars[] =.  
23420 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d    "abcdefghijklm
23430 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20  nopqrstuvwxyz". 
23440 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c     "ABCDEFGHIJKL
23450 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a  MNOPQRSTUVWXYZ".
23460 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22      "0123456789"
23470 3b 0a 20 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b  ;.  size_t i, j;
23480 0a 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 73 71  .  int nPre = sq
23490 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 53 51  lite3Strlen30(SQ
234a0 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
234b0 52 45 46 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d  REFIX);.  int nM
234c0 61 78 2c 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20  ax, nBuf, nDir, 
234d0 6e 4c 65 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42  nLen;.  char *zB
234e0 75 66 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  uf;..  /* It's o
234f0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
23500 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
23510 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
23520 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
23530 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
23540 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
23550 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
23560 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
23570 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
23580 61 69 6c 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53  ailing..  */.  S
23590 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
235a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
235b0 45 52 52 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  ERR );..  /* All
235c0 6f 63 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72  ocate a temporar
235d0 79 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  y buffer to stor
235e0 65 20 74 68 65 20 66 75 6c 6c 79 20 71 75 61 6c  e the fully qual
235f0 69 66 69 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20  ified file.  ** 
23600 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 74 65 6d  name for the tem
23610 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 49 66  porary file.  If
23620 20 74 68 69 73 20 66 61 69 6c 73 2c 20 77 65 20   this fails, we 
23630 63 61 6e 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e  cannot continue.
23640 0a 20 20 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70  .  */.  nMax = p
23650 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b  Vfs->mxPathname;
23660 20 6e 42 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32   nBuf = nMax + 2
23670 3b 0a 20 20 7a 42 75 66 20 3d 20 73 71 6c 69 74  ;.  zBuf = sqlit
23680 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42  e3MallocZero( nB
23690 75 66 20 29 3b 0a 20 20 69 66 28 20 21 7a 42 75  uf );.  if( !zBu
236a0 66 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  f ){.    OSTRACE
236b0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
236c0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
236d0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
236e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
236f0 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
23700 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72  .  }..  /* Figur
23710 65 20 6f 75 74 20 74 68 65 20 65 66 66 65 63 74  e out the effect
23720 69 76 65 20 74 65 6d 70 6f 72 61 72 79 20 64 69  ive temporary di
23730 72 65 63 74 6f 72 79 2e 20 20 46 69 72 73 74 2c  rectory.  First,
23740 20 63 68 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20   check if one.  
23750 2a 2a 20 68 61 73 20 62 65 65 6e 20 65 78 70 6c  ** has been expl
23760 69 63 69 74 6c 79 20 73 65 74 20 62 79 20 74 68  icitly set by th
23770 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f  e application; o
23780 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 74 68  therwise, use th
23790 65 20 6f 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69  e one.  ** confi
237a0 67 75 72 65 64 20 62 79 20 74 68 65 20 6f 70 65  gured by the ope
237b0 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20  rating system.. 
237c0 20 2a 2f 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61   */.  nDir = nMa
237d0 78 20 2d 20 28 6e 50 72 65 20 2b 20 31 35 29 3b  x - (nPre + 15);
237e0 0a 20 20 61 73 73 65 72 74 28 20 6e 44 69 72 3e  .  assert( nDir>
237f0 30 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  0 );.  if( sqlit
23800 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
23810 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69  y ){.    int nDi
23820 72 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  rLen = sqlite3St
23830 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 74  rlen30(sqlite3_t
23840 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a  emp_directory);.
23850 20 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e      if( nDirLen>
23860 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
23870 77 69 6e 49 73 44 69 72 53 65 70 28 73 71 6c 69  winIsDirSep(sqli
23880 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
23890 72 79 5b 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29  ry[nDirLen-1]) )
238a0 7b 0a 20 20 20 20 20 20 20 20 6e 44 69 72 4c 65  {.        nDirLe
238b0 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
238c0 20 20 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e     if( nDirLen>n
238d0 44 69 72 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Dir ){.        s
238e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
238f0 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52 41  );.        OSTRA
23900 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
23910 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52 52  ME rc=SQLITE_ERR
23920 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  OR\n"));.       
23930 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
23940 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
23950 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
23960 6e 61 6d 65 31 22 2c 20 30 29 3b 0a 20 20 20 20  name1", 0);.    
23970 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
23980 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
23990 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 73 71 6c   zBuf, "%s", sql
239a0 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
239b0 6f 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ory);.    }.  }.
239c0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59  #if defined(__CY
239d0 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a  GWIN__).  else{.
239e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
239f0 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
23a00 3d 20 7b 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a  = {.       0, /*
23a10 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
23a20 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20  TMPDIR") */.    
23a30 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28     0, /* getenv(
23a40 22 54 4d 50 44 49 52 22 29 20 2a 2f 0a 20 20 20  "TMPDIR") */.   
23a50 20 20 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76      0, /* getenv
23a60 28 22 54 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20  ("TMP") */.     
23a70 20 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22    0, /* getenv("
23a80 54 45 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20  TEMP") */.      
23a90 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 55   0, /* getenv("U
23aa0 53 45 52 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a  SERPROFILE") */.
23ab0 20 20 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70         "/var/tmp
23ac0 22 2c 0a 20 20 20 20 20 20 20 22 2f 75 73 72 2f  ",.       "/usr/
23ad0 74 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74  tmp",.       "/t
23ae0 6d 70 22 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c  mp",.       ".",
23af0 0a 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20  .       0       
23b00 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61   /* List termina
23b10 74 6f 72 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  tor */.    };.  
23b20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
23b30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
23b40 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20   *zDir = 0;..   
23b50 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
23b60 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
23b70 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
23b80 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
23b90 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69  azDirs[1] ) azDi
23ba0 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[1] = getenv("
23bb0 54 4d 50 44 49 52 22 29 3b 0a 20 20 20 20 69 66  TMPDIR");.    if
23bc0 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61  ( !azDirs[2] ) a
23bd0 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e  zDirs[2] = geten
23be0 76 28 22 54 4d 50 22 29 3b 0a 20 20 20 20 69 66  v("TMP");.    if
23bf0 28 20 21 61 7a 44 69 72 73 5b 33 5d 20 29 20 61  ( !azDirs[3] ) a
23c00 7a 44 69 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e  zDirs[3] = geten
23c10 76 28 22 54 45 4d 50 22 29 3b 0a 20 20 20 20 69  v("TEMP");.    i
23c20 66 28 20 21 61 7a 44 69 72 73 5b 34 5d 20 29 20  f( !azDirs[4] ) 
23c30 61 7a 44 69 72 73 5b 34 5d 20 3d 20 67 65 74 65  azDirs[4] = gete
23c40 6e 76 28 22 55 53 45 52 50 52 4f 46 49 4c 45 22  nv("USERPROFILE"
23c50 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
23c60 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
23c70 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
23c80 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
23c90 69 2b 2b 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69  i++]){.      voi
23ca0 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20  d *zConverted;. 
23cb0 20 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30       if( zDir==0
23cc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
23cd0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 74     /* If the pat
23ce0 68 20 73 74 61 72 74 73 20 77 69 74 68 20 61 20  h starts with a 
23cf0 64 72 69 76 65 20 6c 65 74 74 65 72 20 66 6f 6c  drive letter fol
23d00 6c 6f 77 65 64 20 62 79 20 74 68 65 20 63 6f 6c  lowed by the col
23d10 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 63 68 61 72  on.      ** char
23d20 61 63 74 65 72 2c 20 61 73 73 75 6d 65 20 69 74  acter, assume it
23d30 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6e 61   is already a na
23d40 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68 3b  tive Win32 path;
23d50 20 6f 74 68 65 72 77 69 73 65 2c 0a 20 20 20 20   otherwise,.    
23d60 20 20 2a 2a 20 69 74 20 6d 75 73 74 20 62 65 20    ** it must be 
23d70 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6e  converted to a n
23d80 61 74 69 76 65 20 57 69 6e 33 32 20 70 61 74 68  ative Win32 path
23d90 20 76 69 61 20 74 68 65 20 43 79 67 77 69 6e 20   via the Cygwin 
23da0 41 50 49 0a 20 20 20 20 20 20 2a 2a 20 70 72 69  API.      ** pri
23db0 6f 72 20 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a  or to using it..
23dc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
23dd0 66 28 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74  f( winIsDriveLet
23de0 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72  terAndColon(zDir
23df0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  ) ){.        zCo
23e00 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
23e10 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
23e20 6e 61 6d 65 28 7a 44 69 72 29 3b 0a 20 20 20 20  name(zDir);.    
23e30 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
23e40 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
23e50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
23e60 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
23e70 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
23e80 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
23e90 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
23ea0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
23eb0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
23ec0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
23ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
23ee0 66 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e  f( winIsDir(zCon
23ef0 76 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 20  verted) ){.     
23f00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
23f10 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66  rintf(nMax, zBuf
23f20 2c 20 22 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20  , "%s", zDir);. 
23f30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23f40 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
23f50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
23f60 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
23f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23f80 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
23f90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23fa0 20 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20       zConverted 
23fb0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
23fc0 65 72 6f 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20  ero( nMax+1 );. 
23fd0 20 20 20 20 20 20 20 69 66 28 20 21 7a 43 6f 6e         if( !zCon
23fe0 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
23ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24000 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20 20  (zBuf);.        
24010 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24020 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24030 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
24040 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n"));.          
24050 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
24060 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
24070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24080 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e    if( cygwin_con
24090 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20 20 20  v_path(.        
240a0 20 20 20 20 20 20 20 20 6f 73 49 73 4e 54 28 29          osIsNT()
240b0 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f   ? CCP_POSIX_TO_
240c0 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49  WIN_W : CCP_POSI
240d0 58 5f 54 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72  X_TO_WIN_A, zDir
240e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
240f0 20 20 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d    zConverted, nM
24100 61 78 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  ax+1)<0 ){.     
24110 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24120 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
24130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
24140 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
24150 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28         OSTRACE((
24160 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72  "TEMP-FILENAME r
24170 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  c=SQLITE_IOERR_C
24180 4f 4e 56 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20  ONVPATH\n"));.  
24190 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 77          return w
241a0 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
241b0 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
241c0 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69               "wi
241f0 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20  nGetTempname2", 
24200 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  zDir);.        }
24210 0a 20 20 20 20 20 20 20 20 69 66 28 20 77 69 6e  .        if( win
24220 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74 65 64  IsDir(zConverted
24230 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
24240 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
24250 20 77 65 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e   we know the can
24260 64 69 64 61 74 65 20 64 69 72 65 63 74 6f 72 79  didate directory
24270 20 65 78 69 73 74 73 20 61 6e 64 20 73 68 6f 75   exists and shou
24280 6c 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ld.          ** 
24290 62 65 20 75 73 65 64 2e 20 20 48 6f 77 65 76 65  be used.  Howeve
242a0 72 2c 20 77 65 20 6d 61 79 20 6e 65 65 64 20 74  r, we may need t
242b0 6f 20 63 6f 6e 76 65 72 74 20 74 68 65 20 73 74  o convert the st
242c0 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a  ring containing.
242d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73            ** its
242e0 20 6e 61 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38   name into UTF-8
242f0 20 28 69 2e 65 2e 20 69 66 20 69 74 20 69 73 20   (i.e. if it is 
24300 55 54 46 2d 31 36 20 72 69 67 68 74 20 6e 6f 77  UTF-16 right now
24310 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  )..          */.
24320 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
24330 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
24340 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
24350 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
24360 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 55 74          if( !zUt
24370 66 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  f8 ){.          
24380 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24390 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
243a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
243b0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
243c0 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
243d0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
243e0 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
243f0 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20  NOMEM\n"));.    
24400 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
24410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24420 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
24430 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
24440 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
24450 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c  Max, zBuf, "%s",
24460 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20   zUtf8);.       
24470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24480 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20  zUtf8);.        
24490 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
244a0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
244b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
244c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
244d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
244e0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 7d  verted);.      }
244f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66  .    }.  }.#elif
24500 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
24510 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  T && !defined(__
24520 43 59 47 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65  CYGWIN__).  else
24530 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
24540 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74  .    char *zMult
24550 69 3b 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 57  i;.    LPWSTR zW
24560 69 64 65 50 61 74 68 20 3d 20 73 71 6c 69 74 65  idePath = sqlite
24570 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61  3MallocZero( nMa
24580 78 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29 20  x*sizeof(WCHAR) 
24590 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 57 69 64  );.    if( !zWid
245a0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 20 20 73  ePath ){.      s
245b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66  qlite3_free(zBuf
245c0 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
245d0 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45  (("TEMP-FILENAME
245e0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
245f0 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20  _NOMEM\n"));.   
24600 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24610 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
24620 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  T;.    }.    if(
24630 20 6f 73 47 65 74 54 65 6d 70 50 61 74 68 57 28   osGetTempPathW(
24640 6e 4d 61 78 2c 20 7a 57 69 64 65 50 61 74 68 29  nMax, zWidePath)
24650 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
24660 69 74 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50  ite3_free(zWideP
24670 61 74 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ath);.      sqli
24680 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24690 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
246a0 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
246b0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  =SQLITE_IOERR_GE
246c0 54 54 45 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a  TTEMPPATH\n"));.
246d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
246e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
246f0 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
24700 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
24710 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
24720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
24730 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c  inGetTempname2",
24740 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a   0);.    }.    z
24750 4d 75 6c 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f  Multi = winUnico
24760 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 50 61  deToUtf8(zWidePa
24770 74 68 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75  th);.    if( zMu
24780 6c 74 69 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  lti ){.      sql
24790 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d  ite3_snprintf(nM
247a0 61 78 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20  ax, zBuf, "%s", 
247b0 7a 4d 75 6c 74 69 29 3b 0a 20 20 20 20 20 20 73  zMulti);.      s
247c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c  qlite3_free(zMul
247d0 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ti);.      sqlit
247e0 65 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74  e3_free(zWidePat
247f0 68 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  h);.    }else{. 
24800 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24810 65 28 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20  e(zWidePath);.  
24820 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24830 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53  (zBuf);.      OS
24840 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c  TRACE(("TEMP-FIL
24850 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f  ENAME rc=SQLITE_
24860 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29  IOERR_NOMEM\n"))
24870 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24880 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
24890 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  M_BKPT;.    }.  
248a0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
248b0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
248c0 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20   else{.    char 
248d0 2a 7a 55 74 66 38 3b 0a 20 20 20 20 63 68 61 72  *zUtf8;.    char
248e0 20 2a 7a 4d 62 63 73 50 61 74 68 20 3d 20 73 71   *zMbcsPath = sq
248f0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
24900 20 6e 4d 61 78 20 29 3b 0a 20 20 20 20 69 66 28   nMax );.    if(
24910 20 21 7a 4d 62 63 73 50 61 74 68 20 29 7b 0a 20   !zMbcsPath ){. 
24920 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24930 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f  e(zBuf);.      O
24940 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
24950 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
24960 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
24970 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
24980 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24990 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
249a0 20 20 20 69 66 28 20 6f 73 47 65 74 54 65 6d 70     if( osGetTemp
249b0 50 61 74 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63  PathA(nMax, zMbc
249c0 73 50 61 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20  sPath)==0 ){.   
249d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
249e0 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54  zBuf);.      OST
249f0 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45  RACE(("TEMP-FILE
24a00 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49  NAME rc=SQLITE_I
24a10 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48  OERR_GETTEMPPATH
24a20 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74  \n"));.      ret
24a30 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
24a40 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
24a50 54 45 4d 50 50 41 54 48 2c 20 6f 73 47 65 74 4c  TEMPPATH, osGetL
24a60 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
24a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a80 20 20 20 20 20 22 77 69 6e 47 65 74 54 65 6d 70       "winGetTemp
24a90 6e 61 6d 65 33 22 2c 20 30 29 3b 0a 20 20 20 20  name3", 0);.    
24aa0 7d 0a 20 20 20 20 7a 55 74 66 38 20 3d 20 77 69  }.    zUtf8 = wi
24ab0 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 4d 62 63  nMbcsToUtf8(zMbc
24ac0 73 50 61 74 68 2c 20 6f 73 41 72 65 46 69 6c 65  sPath, osAreFile
24ad0 41 70 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 20  ApisANSI());.   
24ae0 20 69 66 28 20 7a 55 74 66 38 20 29 7b 0a 20 20   if( zUtf8 ){.  
24af0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
24b00 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c  intf(nMax, zBuf,
24b10 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
24b20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24b30 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 7d 65  e(zUtf8);.    }e
24b40 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
24b50 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20  e3_free(zBuf);. 
24b60 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
24b70 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
24b80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24b90 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  EM\n"));.      r
24ba0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
24bb0 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  RR_NOMEM_BKPT;. 
24bc0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
24bd0 2f 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  /* SQLITE_WIN32_
24be0 48 41 53 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64  HAS_ANSI */.#end
24bf0 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53  if /* !SQLITE_OS
24c00 5f 57 49 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a  _WINRT */..  /*.
24c10 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61    ** Check to ma
24c20 6b 65 20 73 75 72 65 20 74 68 65 20 74 65 6d 70  ke sure the temp
24c30 6f 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 20  orary directory 
24c40 65 6e 64 73 20 77 69 74 68 20 61 6e 20 61 70 70  ends with an app
24c50 72 6f 70 72 69 61 74 65 0a 20 20 2a 2a 20 73 65  ropriate.  ** se
24c60 70 61 72 61 74 6f 72 2e 20 20 49 66 20 69 74 20  parator.  If it 
24c70 64 6f 65 73 20 6e 6f 74 20 61 6e 64 20 74 68 65  does not and the
24c80 72 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68  re is not enough
24c90 20 73 70 61 63 65 20 6c 65 66 74 20 74 6f 20 61   space left to a
24ca0 64 64 0a 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69  dd.  ** one, fai
24cb0 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 77  l..  */.  if( !w
24cc0 69 6e 4d 61 6b 65 45 6e 64 49 6e 44 69 72 53 65  inMakeEndInDirSe
24cd0 70 28 6e 44 69 72 2b 31 2c 20 7a 42 75 66 29 20  p(nDir+1, zBuf) 
24ce0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24cf0 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
24d00 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
24d10 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
24d20 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
24d30 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
24d40 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
24d50 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
24d60 6e 61 6d 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a  name4", 0);.  }.
24d70 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b  .  /*.  ** Check
24d80 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74   that the output
24d90 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65   buffer is large
24da0 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20   enough for the 
24db0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 0a 20  temporary file. 
24dc0 20 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20   ** name in the 
24dd0 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74  following format
24de0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c  :.  **.  **   "<
24df0 74 65 6d 70 6f 72 61 72 79 5f 64 69 72 65 63 74  temporary_direct
24e00 6f 72 79 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58  ory>/etilqs_XXXX
24e10 58 58 58 58 58 58 58 58 58 58 58 5c 30 5c 30 22  XXXXXXXXXXX\0\0"
24e20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f  .  **.  ** If no
24e30 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
24e40 5f 45 52 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d  _ERROR.  The num
24e50 62 65 72 20 31 37 20 69 73 20 75 73 65 64 20 68  ber 17 is used h
24e60 65 72 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a  ere in order to.
24e70 20 20 2a 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72    ** account for
24e80 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
24e90 62 79 20 74 68 65 20 31 35 20 63 68 61 72 61 63  by the 15 charac
24ea0 74 65 72 20 72 61 6e 64 6f 6d 20 73 75 66 66 69  ter random suffi
24eb0 78 20 61 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74  x and the.  ** t
24ec0 77 6f 20 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20  wo trailing NUL 
24ed0 63 68 61 72 61 63 74 65 72 73 2e 20 20 54 68 65  characters.  The
24ee0 20 66 69 6e 61 6c 20 64 69 72 65 63 74 6f 72 79   final directory
24ef0 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
24f00 63 74 65 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c  cter.  ** has al
24f10 72 65 61 64 79 20 61 64 64 65 64 20 69 66 20 69  ready added if i
24f20 74 20 77 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  t was not alread
24f30 79 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a  y present..  */.
24f40 20 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33    nLen = sqlite3
24f50 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a  Strlen30(zBuf);.
24f60 20 20 69 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50    if( (nLen + nP
24f70 72 65 20 2b 20 31 37 29 20 3e 20 6e 42 75 66 20  re + 17) > nBuf 
24f80 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
24f90 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f  ree(zBuf);.    O
24fa0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
24fb0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
24fc0 5f 45 52 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20  _ERROR\n"));.   
24fd0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
24fe0 72 6f 72 28 53 51 4c 49 54 45 5f 45 52 52 4f 52  ror(SQLITE_ERROR
24ff0 2c 20 30 2c 20 22 77 69 6e 47 65 74 54 65 6d 70  , 0, "winGetTemp
25000 6e 61 6d 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a  name5", 0);.  }.
25010 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
25020 6e 74 66 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e  ntf(nBuf-16-nLen
25030 2c 20 7a 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c  , zBuf+nLen, SQL
25040 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
25050 45 46 49 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71  EFIX);..  j = sq
25060 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 42  lite3Strlen30(zB
25070 75 66 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  uf);.  sqlite3_r
25080 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
25090 42 75 66 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69  Buf[j]);.  for(i
250a0 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a  =0; i<15; i++, j
250b0 2b 2b 29 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d  ++){.    zBuf[j]
250c0 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
250d0 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
250e0 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
250f0 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
25100 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20    }.  zBuf[j] = 
25110 30 3b 0a 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  0;.  zBuf[j+1] =
25120 20 30 3b 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a   0;.  *pzBuf = z
25130 42 75 66 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28  Buf;..  OSTRACE(
25140 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
25150 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
25160 54 45 5f 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29  TE_OK\n", zBuf))
25170 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
25180 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
25190 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
251a0 65 20 6e 61 6d 65 64 20 66 69 6c 65 20 69 73 20  e named file is 
251b0 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f  really a directo
251c0 72 79 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73  ry.  Return fals
251d0 65 20 69 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f  e if.** it is so
251e0 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  mething other th
251f0 61 6e 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  an a directory, 
25200 6f 72 20 69 66 20 74 68 65 72 65 20 69 73 20 61  or if there is a
25210 6e 79 20 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72  ny kind of memor
25220 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  y.** allocation 
25230 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
25240 69 63 20 69 6e 74 20 77 69 6e 49 73 44 69 72 28  ic int winIsDir(
25250 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e  const void *zCon
25260 76 65 72 74 65 64 29 7b 0a 20 20 44 57 4f 52 44  verted){.  DWORD
25270 20 61 74 74 72 3b 0a 20 20 69 6e 74 20 72 63 20   attr;.  int rc 
25280 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73  = 0;.  DWORD las
25290 74 45 72 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f  tErrno;..  if( o
252a0 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69  sIsNT() ){.    i
252b0 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  nt cnt = 0;.    
252c0 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49  WIN32_FILE_ATTRI
252d0 42 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44  BUTE_DATA sAttrD
252e0 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ata;.    memset(
252f0 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73  &sAttrData, 0, s
25300 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29  izeof(sAttrData)
25310 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28  );.    while( !(
25320 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74  rc = osGetFileAt
25330 74 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43  tributesExW((LPC
25340 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c  WSTR)zConverted,
25350 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65                Ge
25370 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64  tFileExInfoStand
25380 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ard,.           
25390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253a0 20 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26    &sAttrData)) &
253b0 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  & winRetryIoerr(
253c0 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
253d0 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 21 72  ) ){}.    if( !r
253e0 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
253f0 6e 20 30 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20  n 0; /* Invalid 
25400 6e 61 6d 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20  name? */.    }. 
25410 20 20 20 61 74 74 72 20 3d 20 73 41 74 74 72 44     attr = sAttrD
25420 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62  ata.dwFileAttrib
25430 75 74 65 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  utes;.#if SQLITE
25440 5f 4f 53 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d  _OS_WINCE==0.  }
25450 65 6c 73 65 7b 0a 20 20 20 20 61 74 74 72 20 3d  else{.    attr =
25460 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62   osGetFileAttrib
25470 75 74 65 73 41 28 28 63 68 61 72 2a 29 7a 43 6f  utesA((char*)zCo
25480 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69 66  nverted);.#endif
25490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 61  .  }.  return (a
254a0 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ttr!=INVALID_FIL
254b0 45 5f 41 54 54 52 49 42 55 54 45 53 29 20 26 26  E_ATTRIBUTES) &&
254c0 20 28 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52   (attr&FILE_ATTR
254d0 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 29  IBUTE_DIRECTORY)
254e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
254f0 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
25500 63 20 69 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20  c int winOpen(. 
25510 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
25520 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 55 73  fs,        /* Us
25530 65 64 20 74 6f 20 67 65 74 20 6d 61 78 69 6d 75  ed to get maximu
25540 6d 20 70 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67  m path name leng
25550 74 68 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  th */.  const ch
25560 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
25570 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
25580 20 66 69 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f   file (UTF-8) */
25590 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
255a0 2a 69 64 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  *id,         /* 
255b0 57 72 69 74 65 20 74 68 65 20 53 51 4c 69 74 65  Write the SQLite
255c0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72   file handle her
255d0 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
255e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
255f0 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
25600 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
25610 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
25620 20 20 20 2f 2a 20 53 74 61 74 75 73 20 72 65 74     /* Status ret
25630 75 72 6e 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a  urn flags */.){.
25640 20 20 48 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57    HANDLE h;.  DW
25650 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20  ORD lastErrno = 
25660 30 3b 0a 20 20 44 57 4f 52 44 20 64 77 44 65 73  0;.  DWORD dwDes
25670 69 72 65 64 41 63 63 65 73 73 3b 0a 20 20 44 57  iredAccess;.  DW
25680 4f 52 44 20 64 77 53 68 61 72 65 4d 6f 64 65 3b  ORD dwShareMode;
25690 0a 20 20 44 57 4f 52 44 20 64 77 43 72 65 61 74  .  DWORD dwCreat
256a0 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a  ionDisposition;.
256b0 20 20 44 57 4f 52 44 20 64 77 46 6c 61 67 73 41    DWORD dwFlagsA
256c0 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20 30  ndAttributes = 0
256d0 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ;.#if SQLITE_OS_
256e0 57 49 4e 43 45 0a 20 20 69 6e 74 20 69 73 54 65  WINCE.  int isTe
256f0 6d 70 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  mp = 0;.#endif. 
25700 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
25710 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
25720 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74    void *zConvert
25730 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
25740 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20   /* Filename in 
25750 4f 53 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20  OS encoding */. 
25760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 74   const char *zUt
25770 66 38 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20  f8Name = zName; 
25780 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55  /* Filename in U
25790 54 46 2d 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  TF-8 encoding */
257a0 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
257b0 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e  .  /* If argumen
257c0 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c  t zPath is a NUL
257d0 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20  L pointer, this 
257e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75  function is requ
257f0 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a  ired to open.  *
25800 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
25810 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66  le. Use this buf
25820 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65  fer to store the
25830 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20   file name in.. 
25840 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70   */.  char *zTmp
25850 6e 61 6d 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72  name = 0; /* For
25860 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e   temporary filen
25870 61 6d 65 2c 20 69 66 20 6e 65 63 65 73 73 61 72  ame, if necessar
25880 79 2e 20 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20  y. */..  int rc 
25890 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
258a0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
258b0 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
258c0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
258d0 4e 44 45 42 55 47 29 20 7c 7c 20 53 51 4c 49 54  NDEBUG) || SQLIT
258e0 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74  E_OS_WINCE.  int
258f0 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
25900 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
25910 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
25920 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  pen */.#endif.. 
25930 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
25940 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
25950 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
25960 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
25970 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
25980 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
25990 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
259a0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
259b0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
259c0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
259d0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
259e0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
259f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
25a00 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
25a10 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
25a20 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
25a30 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 0a 23 69  _READWRITE);..#i
25a40 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
25a50 6e 74 20 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c  nt isOpenJournal
25a60 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
25a70 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
25a80 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
25a90 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20  TER_JOURNAL.    
25aa0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
25ab0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
25ac0 4e 41 4c 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  NAL.     || eTyp
25ad0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
25ae0 41 4c 0a 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a  AL.  ));.#endif.
25af0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
25b00 4e 20 6e 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65  N name=%s, pFile
25b10 3d 25 70 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70  =%p, flags=%x, p
25b20 4f 75 74 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a  OutFlags=%p\n",.
25b30 20 20 20 20 20 20 20 20 20 20 20 7a 55 74 66 38             zUtf8
25b40 4e 61 6d 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c  Name, id, flags,
25b50 20 70 4f 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20   pOutFlags));.. 
25b60 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
25b70 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
25b80 74 73 20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a  ts are true:.  *
25b90 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
25ba0 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
25bb0 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
25bc0 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
25bd0 74 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  t be set, and.  
25be0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
25bf0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
25c00 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
25c10 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
25c20 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
25c30 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
25c40 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
25c50 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
25c60 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
25c70 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
25c80 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
25c90 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
25ca0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
25cb0 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
25cc0 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
25cd0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
25ce0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
25cf0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
25d00 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
25d10 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
25d20 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
25d30 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
25d40 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
25d50 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
25d60 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
25d70 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
25d80 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
25d90 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
25da0 20 6e 65 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f   never.  ** auto
25db0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
25dc0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
25dd0 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
25de0 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
25df0 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25e00 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25e10 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25e20 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
25e30 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
25e40 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
25e50 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
25e60 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
25e70 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
25e80 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
25e90 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
25ea0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
25eb0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
25ec0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
25ed0 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
25ee0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
25ef0 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
25f00 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
25f10 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
25f20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
25f30 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
25f40 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
25f50 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
25f60 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
25f70 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
25f80 50 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 65  P_DB.       || e
25f90 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
25fa0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
25fb0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
25fc0 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
25fd0 4c 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  L.       || eTyp
25fe0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  e==SQLITE_OPEN_S
25ff0 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65  UBJOURNAL   || e
26000 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26010 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
26020 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
26030 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
26040 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
26050 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
26060 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73  _WAL.  );..  ass
26070 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
26080 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c  .  memset(pFile,
26090 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 46 69   0, sizeof(winFi
260a0 6c 65 29 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68  le));.  pFile->h
260b0 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c   = INVALID_HANDL
260c0 45 5f 56 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51  E_VALUE;..#if SQ
260d0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
260e0 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 26  if( !zUtf8Name &
260f0 26 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  & !sqlite3_temp_
26100 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
26110 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
26120 49 54 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20  ITE_ERROR,.     
26130 20 20 20 22 73 71 6c 69 74 65 33 5f 74 65 6d 70     "sqlite3_temp
26140 5f 64 69 72 65 63 74 6f 72 79 20 76 61 72 69 61  _directory varia
26150 62 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 73 65  ble should be se
26160 74 20 66 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20  t for WinRT");. 
26170 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
26180 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
26190 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
261a0 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c  unction is NULL,
261b0 20 67 65 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a   generate a.  **
261c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
261d0 6e 61 6d 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f  name to use.  */
261e0 0a 20 20 69 66 28 20 21 7a 55 74 66 38 4e 61 6d  .  if( !zUtf8Nam
261f0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
26200 20 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73   isDelete && !is
26210 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  OpenJournal );. 
26220 20 20 20 72 63 20 3d 20 77 69 6e 47 65 74 54 65     rc = winGetTe
26230 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 26 7a 54  mpname(pVfs, &zT
26240 6d 70 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  mpname);.    if(
26250 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26260 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
26270 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
26280 72 63 3d 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d  rc=%s", zUtf8Nam
26290 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  e, sqlite3ErrNam
262a0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
262b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
262c0 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20      zUtf8Name = 
262d0 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20  zTmpname;.  }.. 
262e0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
262f0 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c  enames are doubl
26300 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65  e-zero terminate
26310 64 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f  d if they are no
26320 74 0a 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68  t.  ** URIs with
26330 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
26340 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
26350 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
26360 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  nto.  ** sqlite3
26370 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
26380 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
26390 20 28 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f   (eType!=SQLITE_
263a0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c  OPEN_MAIN_DB) ||
263b0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
263c0 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20  _OPEN_URI) ||.  
263d0 20 20 20 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73       zUtf8Name[s
263e0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
263f0 55 74 66 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20  Utf8Name)+1]==0 
26400 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  );..  /* Convert
26410 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f   the filename to
26420 20 74 68 65 20 73 79 73 74 65 6d 20 65 6e 63 6f   the system enco
26430 64 69 6e 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76  ding. */.  zConv
26440 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65  erted = winConve
26450 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61  rtFromUtf8Filena
26460 6d 65 28 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20  me(zUtf8Name);. 
26470 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
26480 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
26490 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
264a0 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
264b0 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63  OPEN name=%s, rc
264c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
264d0 4d 45 4d 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29  MEM", zUtf8Name)
264e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
264f0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26500 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66  _BKPT;.  }..  if
26510 28 20 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76  ( winIsDir(zConv
26520 65 72 74 65 64 29 20 29 7b 0a 20 20 20 20 73 71  erted) ){.    sq
26530 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
26540 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
26550 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
26560 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
26570 28 22 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  ("OPEN name=%s, 
26580 72 63 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rc=SQLITE_CANTOP
26590 45 4e 5f 49 53 44 49 52 22 2c 20 7a 55 74 66 38  EN_ISDIR", zUtf8
265a0 4e 61 6d 65 29 29 3b 0a 20 20 20 20 72 65 74 75  Name));.    retu
265b0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
265c0 45 4e 5f 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20  EN_ISDIR;.  }.. 
265d0 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65   if( isReadWrite
265e0 20 29 7b 0a 20 20 20 20 64 77 44 65 73 69 72 65   ){.    dwDesire
265f0 64 41 63 63 65 73 73 20 3d 20 47 45 4e 45 52 49  dAccess = GENERI
26600 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43  C_READ | GENERIC
26610 5f 57 52 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b  _WRITE;.  }else{
26620 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
26630 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
26640 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  EAD;.  }..  /* S
26650 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
26660 53 49 56 45 20 69 73 20 75 73 65 64 20 74 6f 20  SIVE is used to 
26670 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 61  make sure that a
26680 20 6e 65 77 20 66 69 6c 65 20 69 73 0a 20 20 2a   new file is.  *
26690 2a 20 63 72 65 61 74 65 64 2e 20 53 51 4c 69 74  * created. SQLit
266a0 65 20 64 6f 65 73 6e 27 74 20 75 73 65 20 69 74  e doesn't use it
266b0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 22 65 78   to indicate "ex
266c0 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 22 0a  clusive access".
266d0 20 20 2a 2a 20 61 73 20 69 74 20 69 73 20 75 73    ** as it is us
266e0 75 61 6c 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64  ually understood
266f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 45  ..  */.  if( isE
26700 78 63 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20  xclusive ){.    
26710 2f 2a 20 43 72 65 61 74 65 73 20 61 20 6e 65 77  /* Creates a new
26720 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69   file, only if i
26730 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
26740 64 79 20 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20  dy exist. */.   
26750 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
26760 65 78 69 73 74 73 2c 20 69 74 20 66 61 69 6c 73  exists, it fails
26770 2e 20 2a 2f 0a 20 20 20 20 64 77 43 72 65 61 74  . */.    dwCreat
26780 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d  ionDisposition =
26790 20 43 52 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d   CREATE_NEW;.  }
267a0 65 6c 73 65 20 69 66 28 20 69 73 43 72 65 61 74  else if( isCreat
267b0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e  e ){.    /* Open
267c0 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 2c 20   existing file, 
267d0 6f 72 20 63 72 65 61 74 65 20 69 66 20 69 74 20  or create if it 
267e0 64 6f 65 73 6e 27 74 20 65 78 69 73 74 20 2a 2f  doesn't exist */
267f0 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44  .    dwCreationD
26800 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45  isposition = OPE
26810 4e 5f 41 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73  N_ALWAYS;.  }els
26820 65 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20  e{.    /* Opens 
26830 61 20 66 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20  a file, only if 
26840 69 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20  it exists. */.  
26850 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
26860 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45  osition = OPEN_E
26870 58 49 53 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20  XISTING;.  }..  
26880 64 77 53 68 61 72 65 4d 6f 64 65 20 3d 20 46 49  dwShareMode = FI
26890 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
268a0 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
268b0 3b 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  ;..  if( isDelet
268c0 65 20 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  e ){.#if SQLITE_
268d0 4f 53 5f 57 49 4e 43 45 0a 20 20 20 20 64 77 46  OS_WINCE.    dwF
268e0 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65  lagsAndAttribute
268f0 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
26900 54 45 5f 48 49 44 44 45 4e 3b 0a 20 20 20 20 69  TE_HIDDEN;.    i
26910 73 54 65 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65  sTemp = 1;.#else
26920 0a 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64 41  .    dwFlagsAndA
26930 74 74 72 69 62 75 74 65 73 20 3d 20 46 49 4c 45  ttributes = FILE
26940 5f 41 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f  _ATTRIBUTE_TEMPO
26950 52 41 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  RARY.           
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26970 20 20 20 20 7c 20 46 49 4c 45 5f 41 54 54 52 49      | FILE_ATTRI
26980 42 55 54 45 5f 48 49 44 44 45 4e 0a 20 20 20 20  BUTE_HIDDEN.    
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269a0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49 4c             | FIL
269b0 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e  E_FLAG_DELETE_ON
269c0 5f 43 4c 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20  _CLOSE;.#endif. 
269d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c   }else{.    dwFl
269e0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
269f0 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
26a00 45 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20  E_NORMAL;.  }.  
26a10 2f 2a 20 52 65 70 6f 72 74 73 20 66 72 6f 6d 20  /* Reports from 
26a20 74 68 65 20 69 6e 74 65 72 6e 65 74 20 61 72 65  the internet are
26a30 20 74 68 61 74 20 70 65 72 66 6f 72 6d 61 6e 63   that performanc
26a40 65 20 69 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a  e is always.  **
26a50 20 62 65 74 74 65 72 20 69 66 20 46 49 4c 45 5f   better if FILE_
26a60 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
26a70 53 53 20 69 73 20 75 73 65 64 2e 20 20 54 69 63  SS is used.  Tic
26a80 6b 65 74 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69  ket #2699. */.#i
26a90 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
26aa0 45 0a 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74  E.  dwFlagsAndAt
26ab0 74 72 69 62 75 74 65 73 20 7c 3d 20 46 49 4c 45  tributes |= FILE
26ac0 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
26ad0 45 53 53 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  ESS;.#endif..  i
26ae0 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23  f( osIsNT() ){.#
26af0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
26b00 52 54 0a 20 20 20 20 43 52 45 41 54 45 46 49 4c  RT.    CREATEFIL
26b10 45 32 5f 45 58 54 45 4e 44 45 44 5f 50 41 52 41  E2_EXTENDED_PARA
26b20 4d 45 54 45 52 53 20 65 78 74 65 6e 64 65 64 50  METERS extendedP
26b30 61 72 61 6d 65 74 65 72 73 3b 0a 20 20 20 20 65  arameters;.    e
26b40 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74 65 72  xtendedParameter
26b50 73 2e 64 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f  s.dwSize = sizeo
26b60 66 28 43 52 45 41 54 45 46 49 4c 45 32 5f 45 58  f(CREATEFILE2_EX
26b70 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54 45 52  TENDED_PARAMETER
26b80 53 29 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64  S);.    extended
26b90 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c  Parameters.dwFil
26ba0 65 41 74 74 72 69 62 75 74 65 73 20 3d 0a 20 20  eAttributes =.  
26bb0 20 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67            dwFlag
26bc0 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 26  sAndAttributes &
26bd0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
26be0 4d 41 53 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64  MASK;.    extend
26bf0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64 77 46  edParameters.dwF
26c00 69 6c 65 46 6c 61 67 73 20 3d 20 64 77 46 6c 61  ileFlags = dwFla
26c10 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20  gsAndAttributes 
26c20 26 20 46 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b  & FILE_FLAG_MASK
26c30 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
26c40 72 61 6d 65 74 65 72 73 2e 64 77 53 65 63 75 72  rameters.dwSecur
26c50 69 74 79 51 6f 73 46 6c 61 67 73 20 3d 20 53 45  ityQosFlags = SE
26c60 43 55 52 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53  CURITY_ANONYMOUS
26c70 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61  ;.    extendedPa
26c80 72 61 6d 65 74 65 72 73 2e 6c 70 53 65 63 75 72  rameters.lpSecur
26c90 69 74 79 41 74 74 72 69 62 75 74 65 73 20 3d 20  ityAttributes = 
26ca0 4e 55 4c 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64  NULL;.    extend
26cb0 65 64 50 61 72 61 6d 65 74 65 72 73 2e 68 54 65  edParameters.hTe
26cc0 6d 70 6c 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c  mplateFile = NUL
26cd0 4c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68  L;.    while( (h
26ce0 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 32   = osCreateFile2
26cf0 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
26d00 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
26d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d20 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
26d30 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a     dwShareMode,.
26d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 77                dw
26d80 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69 74  CreationDisposit
26d90 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
26da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26db0 20 20 20 26 65 78 74 65 6e 64 65 64 50 61 72 61     &extendedPara
26dc0 6d 65 74 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49  meters))==INVALI
26dd0 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26  D_HANDLE_VALUE &
26de0 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  &.              
26df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e00 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63  winRetryIoerr(&c
26e10 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20  nt, &lastErrno) 
26e20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26e30 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20    /* Noop */.   
26e40 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 77 68 69   }.#else.    whi
26e50 6c 65 28 20 28 68 20 3d 20 6f 73 43 72 65 61 74  le( (h = osCreat
26e60 65 46 69 6c 65 57 28 28 4c 50 43 57 53 54 52 29  eFileW((LPCWSTR)
26e70 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20 20 20  zConverted,.    
26e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e90 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
26ea0 72 65 64 41 63 63 65 73 73 2c 0a 20 20 20 20 20  redAccess,.     
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 20 20 20 20 20 20 20 20 20 64 77 53 68 61 72 65           dwShare
26ed0 4d 6f 64 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  Mode, NULL,.    
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ef0 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65 61            dwCrea
26f00 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c  tionDisposition,
26f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
26f30 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69 62 75  wFlagsAndAttribu
26f40 74 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tes,.           
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c     NULL))==INVAL
26f70 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
26f80 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
26f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fa0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
26fb0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
26fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26fd0 20 20 20 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20     /* Noop */.  
26fe0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
26ff0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
27000 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
27010 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
27020 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65  h = osCreateFile
27030 41 28 28 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65  A((LPCSTR)zConve
27040 72 74 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  rted,.          
27050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27060 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63 63      dwDesiredAcc
27070 65 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ess,.           
27080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27090 20 20 20 64 77 53 68 61 72 65 4d 6f 64 65 2c 20     dwShareMode, 
270a0 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  NULL,.          
270b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270c0 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69      dwCreationDi
270d0 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20  sposition,.     
270e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270f0 20 20 20 20 20 20 20 20 20 64 77 46 6c 61 67 73           dwFlags
27100 41 6e 64 41 74 74 72 69 62 75 74 65 73 2c 0a 20  AndAttributes,. 
27110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27120 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c               NUL
27130 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  L))==INVALID_HAN
27140 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20 20 20  DLE_VALUE &&.   
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27160 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 52 65             winRe
27170 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20 26  tryIoerr(&cnt, &
27180 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20  lastErrno) ){.  
27190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271a0 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  Noop */.    }.  
271b0 7d 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f  }.#endif.  winLo
271c0 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49  gIoerr(cnt, __LI
271d0 4e 45 5f 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43  NE__);..  OSTRAC
271e0 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70  E(("OPEN file=%p
271f0 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65 73  , name=%s, acces
27200 73 3d 25 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c  s=%lx, rc=%s\n",
27210 20 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20   h, zUtf8Name,. 
27220 20 20 20 20 20 20 20 20 20 20 64 77 44 65 73 69            dwDesi
27230 72 65 64 41 63 63 65 73 73 2c 20 28 68 3d 3d 49  redAccess, (h==I
27240 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
27250 4c 55 45 29 20 3f 20 22 66 61 69 6c 65 64 22 20  LUE) ? "failed" 
27260 3a 20 22 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28  : "ok"));..  if(
27270 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
27280 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
27290 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
272a0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
272b0 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51    winLogError(SQ
272c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70  LITE_CANTOPEN, p
272d0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
272e0 20 22 77 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66   "winOpen", zUtf
272f0 38 4e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  8Name);.    sqli
27300 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
27310 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ted);.    sqlite
27320 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29  3_free(zTmpname)
27330 3b 0a 20 20 20 20 69 66 28 20 69 73 52 65 61 64  ;.    if( isRead
27340 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63 6c  Write && !isExcl
27350 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20 72  usive ){.      r
27360 65 74 75 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56  eturn winOpen(pV
27370 66 73 2c 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20  fs, zName, id,. 
27380 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 7c          ((flags|
27390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
273a0 4f 4e 4c 59 29 20 26 0a 20 20 20 20 20 20 20 20  ONLY) &.        
273b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7e 28 53               ~(S
273c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
273d0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  E|SQLITE_OPEN_RE
273e0 41 44 57 52 49 54 45 29 29 2c 0a 20 20 20 20 20  ADWRITE)),.     
273f0 20 20 20 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a      pOutFlags);.
27400 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
27420 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
27430 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
27440 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20  OutFlags ){.    
27450 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
27460 29 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74 46 6c  ){.      *pOutFl
27470 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
27480 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 20  N_READWRITE;.   
27490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
274a0 4f 75 74 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  OutFlags = SQLIT
274b0 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
274c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53  .    }.  }..  OS
274d0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 66 69 6c  TRACE(("OPEN fil
274e0 65 3d 25 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61  e=%p, name=%s, a
274f0 63 63 65 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46  ccess=%lx, pOutF
27500 6c 61 67 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c  lags=%p, *pOutFl
27510 61 67 73 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  ags=%d, ".      
27520 20 20 20 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20       "rc=%s\n", 
27530 68 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77  h, zUtf8Name, dw
27540 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 70  DesiredAccess, p
27550 4f 75 74 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c  OutFlags, pOutFl
27560 61 67 73 20 3f 0a 20 20 20 20 20 20 20 20 20 20  ags ?.          
27570 20 2a 70 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c   *pOutFlags : 0,
27580 20 28 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e   (h==INVALID_HAN
27590 44 4c 45 5f 56 41 4c 55 45 29 20 3f 20 22 66 61  DLE_VALUE) ? "fa
275a0 69 6c 65 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a  iled" : "ok"));.
275b0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
275c0 49 4e 43 45 0a 20 20 69 66 28 20 69 73 52 65 61  INCE.  if( isRea
275d0 64 57 72 69 74 65 20 26 26 20 65 54 79 70 65 3d  dWrite && eType=
275e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
275f0 4e 5f 44 42 0a 20 20 20 20 20 20 20 26 26 20 28  N_DB.       && (
27600 72 63 20 3d 20 77 69 6e 63 65 43 72 65 61 74 65  rc = winceCreate
27610 4c 6f 63 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c  Lock(zName, pFil
27620 65 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  e))!=SQLITE_OK. 
27630 20 29 7b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48   ){.    osCloseH
27640 61 6e 64 6c 65 28 68 29 3b 0a 20 20 20 20 73 71  andle(h);.    sq
27650 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
27660 65 72 74 65 64 29 3b 0a 20 20 20 20 73 71 6c 69  erted);.    sqli
27670 74 65 33 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d  te3_free(zTmpnam
27680 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  e);.    OSTRACE(
27690 28 22 4f 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e  ("OPEN-CE-LOCK n
276a0 61 6d 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22  ame=%s, rc=%s\n"
276b0 2c 20 7a 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33  , zName, sqlite3
276c0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
276d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
276e0 7d 0a 20 20 69 66 28 20 69 73 54 65 6d 70 20 29  }.  if( isTemp )
276f0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65  {.    pFile->zDe
27700 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43  leteOnClose = zC
27710 6f 6e 76 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73  onverted;.  }els
27720 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20  e.#endif.  {.   
27730 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
27740 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a  onverted);.  }..
27750 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27760 54 6d 70 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c  Tmpname);.  pFil
27770 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 77 69  e->pMethod = &wi
27780 6e 49 6f 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69  nIoMethod;.  pFi
27790 6c 65 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  le->pVfs = pVfs;
277a0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b  .  pFile->h = h;
277b0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
277c0 79 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  y ){.    pFile->
277d0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e  ctrlFlags |= WIN
277e0 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d  FILE_RDONLY;.  }
277f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75  .  if( sqlite3_u
27800 72 69 5f 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65  ri_boolean(zName
27810 2c 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45  , "psow", SQLITE
27820 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
27830 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 46 69  RITE) ){.    pFi
27840 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
27850 20 57 49 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20   WINFILE_PSOW;. 
27860 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74   }.  pFile->last
27870 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52  Errno = NO_ERROR
27880 3b 0a 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ;.  pFile->zPath
27890 20 3d 20 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51   = zName;.#if SQ
278a0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
278b0 5a 45 3e 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d  ZE>0.  pFile->hM
278c0 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69  ap = NULL;.  pFi
278d0 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  le->pMapRegion =
278e0 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61   0;.  pFile->mma
278f0 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69  pSize = 0;.  pFi
27900 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
27910 61 6c 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  al = 0;.  pFile-
27920 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
27930 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
27940 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
27950 66 0a 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  f..  OpenCounter
27960 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (+1);.  return r
27970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
27980 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
27990 65 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  e..**.** Note th
279a0 61 74 20 57 69 6e 64 6f 77 73 20 64 6f 65 73 20  at Windows does 
279b0 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65  not allow a file
279c0 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69   to be deleted i
279d0 66 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  f some other.** 
279e0 70 72 6f 63 65 73 73 20 68 61 73 20 69 74 20 6f  process has it o
279f0 70 65 6e 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20  pen.  Sometimes 
27a00 61 20 76 69 72 75 73 20 73 63 61 6e 6e 65 72 20  a virus scanner 
27a10 6f 72 20 69 6e 64 65 78 69 6e 67 20 70 72 6f 67  or indexing prog
27a20 72 61 6d 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e  ram.** will open
27a30 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
27a40 73 68 6f 72 74 6c 79 20 61 66 74 65 72 20 69 74  shortly after it
27a50 20 69 73 20 63 72 65 61 74 65 64 20 69 6e 20 6f   is created in o
27a60 72 64 65 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68  rder to do.** wh
27a70 61 74 65 76 65 72 20 69 74 20 64 6f 65 73 2e 20  atever it does. 
27a80 20 57 68 69 6c 65 20 74 68 69 73 20 6f 74 68 65   While this othe
27a90 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
27aa0 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65  ding the.** file
27ab0 20 6f 70 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62   open, we will b
27ac0 65 20 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65  e unable to dele
27ad0 74 65 20 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20  te it.  To work 
27ae0 61 72 6f 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70  around this.** p
27af0 72 6f 62 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79  roblem, we delay
27b00 20 31 30 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64   100 millisecond
27b10 73 20 61 6e 64 20 74 72 79 20 74 6f 20 64 65 6c  s and try to del
27b20 65 74 65 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a  ete again.  Up.*
27b30 2a 20 74 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e  * to MX_DELETION
27b40 5f 41 54 54 45 4d 50 54 73 20 64 65 6c 65 74 69  _ATTEMPTs deleti
27b50 6f 6e 20 61 74 74 65 6d 70 74 73 20 61 72 65 20  on attempts are 
27b60 72 75 6e 20 62 65 66 6f 72 65 20 67 69 76 69 6e  run before givin
27b70 67 0a 2a 2a 20 75 70 20 61 6e 64 20 72 65 74 75  g.** up and retu
27b80 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a  rning an error..
27b90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
27ba0 6e 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74  nDelete(.  sqlit
27bb0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
27bc0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
27bd0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
27be0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
27bf0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20  lename,      /* 
27c00 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
27c10 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20  delete */.  int 
27c20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20 20  syncDir         
27c30 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75          /* Not u
27c40 73 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a  sed on win32 */.
27c50 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
27c60 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  ;.  int rc;.  DW
27c70 4f 52 44 20 61 74 74 72 3b 0a 20 20 44 57 4f 52  ORD attr;.  DWOR
27c80 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b  D lastErrno = 0;
27c90 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  .  void *zConver
27ca0 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ted;.  UNUSED_PA
27cb0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
27cc0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27cd0 52 28 73 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53  R(syncDir);..  S
27ce0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
27cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27d00 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53  RR_DELETE);.  OS
27d10 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e  TRACE(("DELETE n
27d20 61 6d 65 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d  ame=%s, syncDir=
27d30 25 64 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %d\n", zFilename
27d40 2c 20 73 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20  , syncDir));..  
27d50 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
27d60 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
27d70 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
27d80 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
27d90 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
27da0 53 54 52 41 43 45 28 28 22 44 45 4c 45 54 45 20  STRACE(("DELETE 
27db0 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
27dc0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
27dd0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
27de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27df0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
27e00 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
27e10 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 64 6f  IsNT() ){.    do
27e20 20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53   {.#if SQLITE_OS
27e30 5f 57 49 4e 52 54 0a 20 20 20 20 20 20 57 49 4e  _WINRT.      WIN
27e40 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
27e50 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
27e60 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
27e70 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
27e80 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
27e90 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6f 73 47  ;.      if ( osG
27ea0 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
27eb0 45 78 57 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20  ExW(zConverted, 
27ec0 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
27ed0 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ef0 20 20 20 20 20 20 20 20 20 26 73 41 74 74 72 44           &sAttrD
27f00 61 74 61 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ata) ){.        
27f10 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
27f20 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
27f30 73 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  s;.      }else{.
27f40 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e          lastErrn
27f50 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
27f60 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  or();.        if
27f70 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  ( lastErrno==ERR
27f80 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e  OR_FILE_NOT_FOUN
27f90 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61  D.         || la
27fa0 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50  stErrno==ERROR_P
27fb0 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b  ATH_NOT_FOUND ){
27fc0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27fd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
27fe0 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c  ETE_NOENT; /* Al
27ff0 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20  ready gone? */. 
28000 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28010 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28020 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
28030 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
28040 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  ak;.      }.#els
28050 65 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f  e.      attr = o
28060 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74  sGetFileAttribut
28070 65 73 57 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b  esW(zConverted);
28080 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
28090 20 28 20 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44   ( attr==INVALID
280a0 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53  _FILE_ATTRIBUTES
280b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 61 73 74   ){.        last
280c0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
280d0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
280e0 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d    if( lastErrno=
280f0 3d 45 52 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f  =ERROR_FILE_NOT_
28100 46 4f 55 4e 44 0a 20 20 20 20 20 20 20 20 20 7c  FOUND.         |
28110 7c 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52  | lastErrno==ERR
28120 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e  OR_PATH_NOT_FOUN
28130 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
28140 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
28150 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f  _DELETE_NOENT; /
28160 2a 20 41 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20  * Already gone? 
28170 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
28180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28190 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
281a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
281b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
281c0 20 20 20 20 20 20 69 66 20 28 20 61 74 74 72 26        if ( attr&
281d0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
281e0 49 52 45 43 54 4f 52 59 20 29 7b 0a 20 20 20 20  IRECTORY ){.    
281f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28200 45 52 52 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20  ERROR; /* Files 
28210 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
28220 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28230 20 20 20 20 20 20 69 66 20 28 20 6f 73 44 65 6c        if ( osDel
28240 65 74 65 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72  eteFileW(zConver
28250 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
28260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
28270 2f 2a 20 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a  /* Deleted OK. *
28280 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
28290 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
282a0 66 20 28 20 21 77 69 6e 52 65 74 72 79 49 6f 65  f ( !winRetryIoe
282b0 72 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72  rr(&cnt, &lastEr
282c0 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  rno) ){.        
282d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
282e0 52 3b 20 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65  R; /* No more re
282f0 74 72 69 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  tries. */.      
28300 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
28310 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 31 29 3b  .    } while(1);
28320 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
28330 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
28340 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f  I.  else{.    do
28350 20 7b 0a 20 20 20 20 20 20 61 74 74 72 20 3d 20   {.      attr = 
28360 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69 62 75  osGetFileAttribu
28370 74 65 73 41 28 7a 43 6f 6e 76 65 72 74 65 64 29  tesA(zConverted)
28380 3b 0a 20 20 20 20 20 20 69 66 20 28 20 61 74 74  ;.      if ( att
28390 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f  r==INVALID_FILE_
283a0 41 54 54 52 49 42 55 54 45 53 20 29 7b 0a 20 20  ATTRIBUTES ){.  
283b0 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20        lastErrno 
283c0 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
283d0 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ();.        if( 
283e0 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52  lastErrno==ERROR
283f0 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a  _FILE_NOT_FOUND.
28400 20 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74           || last
28410 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54  Errno==ERROR_PAT
28420 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20  H_NOT_FOUND ){. 
28430 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
28440 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
28450 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65  E_NOENT; /* Alre
28460 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20  ady gone? */.   
28470 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28480 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28490 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
284a0 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
284b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
284c0 69 66 20 28 20 61 74 74 72 26 46 49 4c 45 5f 41  if ( attr&FILE_A
284d0 54 54 52 49 42 55 54 45 5f 44 49 52 45 43 54 4f  TTRIBUTE_DIRECTO
284e0 52 59 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  RY ){.        rc
284f0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
28500 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20   /* Files only. 
28510 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
28520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28530 69 66 20 28 20 6f 73 44 65 6c 65 74 65 46 69 6c  if ( osDeleteFil
28540 65 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  eA(zConverted) )
28550 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28560 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c  QLITE_OK; /* Del
28570 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20  eted OK. */.    
28580 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
28590 20 7d 0a 20 20 20 20 20 20 69 66 20 28 20 21 77   }.      if ( !w
285a0 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
285b0 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
285c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
285d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
285e0 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69 65 73 2e  No more retries.
285f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
28600 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
28610 20 77 68 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23   while(1);.  }.#
28620 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 20 26  endif.  if( rc &
28630 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
28640 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20  RR_DELETE_NOENT 
28650 29 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4c  ){.    rc = winL
28660 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
28670 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73  OERR_DELETE, las
28680 74 45 72 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65  tErrno, "winDele
28690 74 65 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  te", zFilename);
286a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69  .  }else{.    wi
286b0 6e 4c 6f 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f  nLogIoerr(cnt, _
286c0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20  _LINE__);.  }.  
286d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
286e0 6e 76 65 72 74 65 64 29 3b 0a 20 20 4f 53 54 52  nverted);.  OSTR
286f0 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
28700 65 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20  e=%s, rc=%s\n", 
28710 7a 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74  zFilename, sqlit
28720 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b  e3ErrName(rc)));
28730 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
28740 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
28750 20 65 78 69 73 74 65 6e 63 65 20 61 6e 64 20 73   existence and s
28760 74 61 74 75 73 20 6f 66 20 61 20 66 69 6c 65 2e  tatus of a file.
28770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
28780 69 6e 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  inAccess(.  sqli
28790 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
287a0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73         /* Not us
287b0 65 64 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20  ed on win32 */. 
287c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
287d0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e  lename,     /* N
287e0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 63  ame of file to c
287f0 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  heck */.  int fl
28800 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
28810 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
28820 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
28830 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
28840 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
28850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
28860 3a 20 52 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20  : Result */.){. 
28870 20 44 57 4f 52 44 20 61 74 74 72 3b 0a 20 20 69   DWORD attr;.  i
28880 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f  nt rc = 0;.  DWO
28890 52 44 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  RD lastErrno = 0
288a0 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  ;.  void *zConve
288b0 72 74 65 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50  rted;.  UNUSED_P
288c0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
288d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
288e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
288f0 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b 20  E_IOERR_ACCESS; 
28900 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41  );.  OSTRACE(("A
28910 43 43 45 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66  CCESS name=%s, f
28920 6c 61 67 73 3d 25 78 2c 20 70 52 65 73 4f 75 74  lags=%x, pResOut
28930 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%p\n",.        
28940 20 20 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c     zFilename, fl
28950 61 67 73 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a  ags, pResOut));.
28960 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20  .  zConverted = 
28970 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74  winConvertFromUt
28980 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65  f8Filename(zFile
28990 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f  name);.  if( zCo
289a0 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20  nverted==0 ){.  
289b0 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
289c0 53 53 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53  SS name=%s, rc=S
289d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
289e0 4d 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  M\n", zFilename)
289f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28a00 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
28a10 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
28a20 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20 20   osIsNT() ){.   
28a30 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
28a40 20 20 57 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54    WIN32_FILE_ATT
28a50 52 49 42 55 54 45 5f 44 41 54 41 20 73 41 74 74  RIBUTE_DATA sAtt
28a60 72 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65  rData;.    memse
28a70 74 28 26 73 41 74 74 72 44 61 74 61 2c 20 30 2c  t(&sAttrData, 0,
28a80 20 73 69 7a 65 6f 66 28 73 41 74 74 72 44 61 74   sizeof(sAttrDat
28a90 61 29 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  a));.    while( 
28aa0 21 28 72 63 20 3d 20 6f 73 47 65 74 46 69 6c 65  !(rc = osGetFile
28ab0 41 74 74 72 69 62 75 74 65 73 45 78 57 28 28 4c  AttributesExW((L
28ac0 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
28ad0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 47 65 74 46 69 6c 65 45 78 49 6e 66 6f 53 74 61  GetFileExInfoSta
28b00 6e 64 61 72 64 2c 0a 20 20 20 20 20 20 20 20 20  ndard,.         
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 20 20 26 73 41 74 74 72 44 61 74 61 29 29      &sAttrData))
28b30 20 26 26 20 77 69 6e 52 65 74 72 79 49 6f 65 72   && winRetryIoer
28b40 72 28 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72  r(&cnt, &lastErr
28b50 6e 6f 29 20 29 7b 7d 0a 20 20 20 20 69 66 28 20  no) ){}.    if( 
28b60 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  rc ){.      /* F
28b70 6f 72 20 61 6e 20 53 51 4c 49 54 45 5f 41 43 43  or an SQLITE_ACC
28b80 45 53 53 5f 45 58 49 53 54 53 20 71 75 65 72 79  ESS_EXISTS query
28b90 2c 20 74 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c  , treat a zero-l
28ba0 65 6e 67 74 68 20 66 69 6c 65 0a 20 20 20 20 20  ength file.     
28bb0 20 2a 2a 20 61 73 20 69 66 20 69 74 20 64 6f 65   ** as if it doe
28bc0 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 20 20 20  s not exist..   
28bd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
28be0 20 20 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45     flags==SQLITE
28bf0 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 0a 20  _ACCESS_EXISTS. 
28c00 20 20 20 20 20 20 20 20 20 26 26 20 73 41 74 74           && sAtt
28c10 72 44 61 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48  rData.nFileSizeH
28c20 69 67 68 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  igh==0.         
28c30 20 26 26 20 73 41 74 74 72 44 61 74 61 2e 6e 46   && sAttrData.nF
28c40 69 6c 65 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b  ileSizeLow==0 ){
28c50 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
28c60 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
28c70 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
28c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74  else{.        at
28c90 74 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64  tr = sAttrData.d
28ca0 77 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b  wFileAttributes;
28cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
28cc0 73 65 7b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  se{.      winLog
28cd0 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e  Ioerr(cnt, __LIN
28ce0 45 5f 5f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  E__);.      if( 
28cf0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
28d00 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _FILE_NOT_FOUND 
28d10 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
28d20 52 4f 52 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55  ROR_PATH_NOT_FOU
28d30 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ND ){.        sq
28d40 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
28d50 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20 20  erted);.        
28d60 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72  return winLogErr
28d70 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
28d80 41 43 43 45 53 53 2c 20 6c 61 73 74 45 72 72 6e  ACCESS, lastErrn
28d90 6f 2c 20 22 77 69 6e 41 63 63 65 73 73 22 2c 0a  o, "winAccess",.
28da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28db0 20 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65             zFile
28dc0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
28dd0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72  se{.        attr
28de0 20 3d 20 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f   = INVALID_FILE_
28df0 41 54 54 52 49 42 55 54 45 53 3b 0a 20 20 20 20  ATTRIBUTES;.    
28e00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69    }.    }.  }.#i
28e10 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
28e20 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
28e30 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
28e40 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
28e50 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
28e60 72 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rted);.  }.#endi
28e70 66 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  f.  sqlite3_free
28e80 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
28e90 73 77 69 74 63 68 28 20 66 6c 61 67 73 20 29 7b  switch( flags ){
28ea0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
28eb0 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20  _ACCESS_READ:.  
28ec0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28ed0 43 45 53 53 5f 45 58 49 53 54 53 3a 0a 20 20 20  CESS_EXISTS:.   
28ee0 20 20 20 72 63 20 3d 20 61 74 74 72 21 3d 49 4e     rc = attr!=IN
28ef0 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49  VALID_FILE_ATTRI
28f00 42 55 54 45 53 3b 0a 20 20 20 20 20 20 62 72 65  BUTES;.      bre
28f10 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
28f20 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
28f30 52 49 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d  RITE:.      rc =
28f40 20 61 74 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46   attr!=INVALID_F
28f50 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 26  ILE_ATTRIBUTES &
28f60 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
28f70 61 74 74 72 20 26 20 46 49 4c 45 5f 41 54 54 52  attr & FILE_ATTR
28f80 49 42 55 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d  IBUTE_READONLY)=
28f90 3d 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  =0;.      break;
28fa0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
28fb0 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
28fc0 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
28fd0 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
28fe0 65 73 4f 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53  esOut = rc;.  OS
28ff0 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20 6e  TRACE(("ACCESS n
29000 61 6d 65 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d  ame=%s, pResOut=
29010 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c  %p, *pResOut=%d,
29020 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
29030 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 46 69  ,.           zFi
29040 6c 65 6e 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c  lename, pResOut,
29050 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
29060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29070 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
29080 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
29090 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
290a0 20 6e 61 6d 65 20 73 74 61 72 74 73 20 77 69 74   name starts wit
290b0 68 20 61 20 64 72 69 76 65 20 6c 65 74 74 65 72  h a drive letter
290c0 0a 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  .** followed by 
290d0 61 20 63 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65  a colon characte
290e0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  r..*/.static BOO
290f0 4c 20 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74  L winIsDriveLett
29100 65 72 41 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f  erAndColon(.  co
29110 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 6e  nst char *zPathn
29120 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
29130 28 20 73 71 6c 69 74 65 33 49 73 61 6c 70 68 61  ( sqlite3Isalpha
29140 28 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26  (zPathname[0]) &
29150 26 20 7a 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d  & zPathname[1]==
29160 27 3a 27 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ':' );.}../*.** 
29170 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  Returns non-zero
29180 20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65   if the specifie
29190 64 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75  d path name shou
291a0 6c 64 20 62 65 20 75 73 65 64 20 76 65 72 62 61  ld be used verba
291b0 74 69 6d 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d  tim.  If.** non-
291c0 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  zero is returned
291d0 20 66 72 6f 6d 20 74 68 69 73 20 66 75 6e 63 74   from this funct
291e0 69 6f 6e 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  ion, the calling
291f0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73   function must s
29200 69 6d 70 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65  imply.** use the
29210 20 70 72 6f 76 69 64 65 64 20 70 61 74 68 20 6e   provided path n
29220 61 6d 65 20 76 65 72 62 61 74 69 6d 20 2d 4f 52  ame verbatim -OR
29230 2d 20 72 65 73 6f 6c 76 65 20 69 74 20 69 6e 74  - resolve it int
29240 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6e 61  o a full path na
29250 6d 65 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  me.** using the 
29260 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20  GetFullPathName 
29270 57 69 6e 33 32 20 41 50 49 20 66 75 6e 63 74 69  Win32 API functi
29280 6f 6e 20 28 69 66 20 61 76 61 69 6c 61 62 6c 65  on (if available
29290 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  )..*/.static BOO
292a0 4c 20 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50  L winIsVerbatimP
292b0 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
292c0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
292d0 0a 29 7b 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  .){.  /*.  ** If
292e0 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73   the path name s
292f0 74 61 72 74 73 20 77 69 74 68 20 61 20 66 6f 72  tarts with a for
29300 77 61 72 64 20 73 6c 61 73 68 20 6f 72 20 61 20  ward slash or a 
29310 62 61 63 6b 73 6c 61 73 68 2c 20 69 74 20 69 73  backslash, it is
29320 20 65 69 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c   either.  ** a l
29330 65 67 61 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61  egal UNC name, a
29340 20 76 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65   volume relative
29350 20 70 61 74 68 2c 20 6f 72 20 61 6e 20 61 62 73   path, or an abs
29360 6f 6c 75 74 65 20 70 61 74 68 20 6e 61 6d 65 20  olute path name 
29370 69 6e 20 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69  in the.  ** "Uni
29380 78 22 20 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e  x" format on Win
29390 64 6f 77 73 2e 20 20 54 68 65 72 65 20 69 73 20  dows.  There is 
293a0 6e 6f 20 65 61 73 79 20 77 61 79 20 74 6f 20 64  no easy way to d
293b0 69 66 66 65 72 65 6e 74 69 61 74 65 20 62 65 74  ifferentiate bet
293c0 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69  ween.  ** the fi
293d0 6e 61 6c 20 74 77 6f 20 63 61 73 65 73 3b 20 74  nal two cases; t
293e0 68 65 72 65 66 6f 72 65 2c 20 77 65 20 72 65 74  herefore, we ret
293f0 75 72 6e 20 74 68 65 20 73 61 66 65 72 20 72 65  urn the safer re
29400 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 54 52  turn value of TR
29410 55 45 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20  UE.  ** so that 
29420 63 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  callers of this 
29430 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69  function will si
29440 6d 70 6c 79 20 75 73 65 20 69 74 20 76 65 72 62  mply use it verb
29450 61 74 69 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20  atim..  */.  if 
29460 28 20 77 69 6e 49 73 44 69 72 53 65 70 28 7a 50  ( winIsDirSep(zP
29470 61 74 68 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20  athname[0]) ){. 
29480 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
29490 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
294a0 66 20 74 68 65 20 70 61 74 68 20 6e 61 6d 65 20  f the path name 
294b0 73 74 61 72 74 73 20 77 69 74 68 20 61 20 6c 65  starts with a le
294c0 74 74 65 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e  tter and a colon
294d0 20 69 74 20 69 73 20 65 69 74 68 65 72 20 61 20   it is either a 
294e0 76 6f 6c 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61  volume.  ** rela
294f0 74 69 76 65 20 70 61 74 68 20 6f 72 20 61 6e 20  tive path or an 
29500 61 62 73 6f 6c 75 74 65 20 70 61 74 68 2e 20 20  absolute path.  
29510 43 61 6c 6c 65 72 73 20 6f 66 20 74 68 69 73 20  Callers of this 
29520 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f  function must no
29530 74 0a 20 20 2a 2a 20 61 74 74 65 6d 70 74 20 74  t.  ** attempt t
29540 6f 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  o treat it as a 
29550 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
29560 6d 65 20 28 69 2e 65 2e 20 74 68 65 79 20 73 68  me (i.e. they sh
29570 6f 75 6c 64 20 73 69 6d 70 6c 79 20 75 73 65 0a  ould simply use.
29580 20 20 2a 2a 20 69 74 20 76 65 72 62 61 74 69 6d    ** it verbatim
29590 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  )..  */.  if ( w
295a0 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
295b0 6e 64 43 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d  ndColon(zPathnam
295c0 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
295d0 20 54 52 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   TRUE;.  }..  /*
295e0 0a 20 20 2a 2a 20 49 66 20 77 65 20 67 65 74 20  .  ** If we get 
295f0 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
29600 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 68 6f  he path name sho
29610 75 6c 64 20 61 6c 6d 6f 73 74 20 63 65 72 74 61  uld almost certa
29620 69 6e 6c 79 20 62 65 20 61 20 70 75 72 65 6c 79  inly be a purely
29630 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f  .  ** relative o
29640 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55  ne (i.e. not a U
29650 4e 43 20 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73  NC name, not abs
29660 6f 6c 75 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76  olute, and not v
29670 6f 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 29 2e  olume relative).
29680 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46  .  */.  return F
29690 41 4c 53 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ALSE;.}../*.** T
296a0 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
296b0 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
296c0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
296d0 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
296e0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
296f0 4f 75 74 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77  Out[].  zOut[] w
29700 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73 74 20  ill be at least 
29710 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29720 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a  .** bytes in siz
29730 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
29740 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65   winFullPathname
29750 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
29760 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
29770 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
29780 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
29790 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
297a0 61 74 69 76 65 2c 20 20 20 20 20 20 20 20 2f 2a  ative,        /*
297b0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
297c0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
297d0 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20  .  int nFull,   
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
29800 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
29810 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  es */.  char *zF
29820 75 6c 6c 20 20 20 20 20 20 20 20 20 20 20 20 20  ull             
29830 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
29840 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 0a 23 69  buffer */.){..#i
29850 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
29860 49 4e 5f 5f 29 0a 20 20 53 69 6d 75 6c 61 74 65  IN__).  Simulate
29870 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
29880 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a  SQLITE_ERROR );.
29890 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
298a0 45 52 28 6e 46 75 6c 6c 29 3b 0a 20 20 61 73 73  ER(nFull);.  ass
298b0 65 72 74 28 20 6e 46 75 6c 6c 3e 3d 70 56 66 73  ert( nFull>=pVfs
298c0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
298d0 20 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64    if ( sqlite3_d
298e0 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26  ata_directory &&
298f0 20 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50   !winIsVerbatimP
29900 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76  athname(zRelativ
29910 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  e) ){.    /*.   
29920 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65   ** NOTE: We are
29930 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
29940 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
29950 6d 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a  me and the data.
29960 20 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72      **       dir
29970 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20  ectory has been 
29980 73 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  set.  Therefore,
29990 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62   use it as the b
299a0 61 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20  asis.    **     
299b0 20 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67    for converting
299c0 20 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61   the relative pa
299d0 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62  th name to an ab
299e0 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20  solute.    **   
299f0 20 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65      one by prepe
29a00 6e 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64  nding the data d
29a10 69 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 73  irectory and a s
29a20 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lash..    */.   
29a30 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20 73 71   char *zOut = sq
29a40 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
29a50 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
29a60 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21  e+1 );.    if( !
29a70 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 65  zOut ){.      re
29a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
29a90 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
29aa0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79 67 77    }.    if( cygw
29ab0 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a 20 20  in_conv_path(.  
29ac0 20 20 20 20 20 20 20 20 20 20 28 6f 73 49 73 4e            (osIsN
29ad0 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49 58 5f  T() ? CCP_POSIX_
29ae0 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50 5f 50  TO_WIN_W : CCP_P
29af0 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29 20 7c  OSIX_TO_WIN_A) |
29b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 43 50  .            CCP
29b10 5f 52 45 4c 41 54 49 56 45 2c 20 7a 52 65 6c 61  _RELATIVE, zRela
29b20 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73  tive, zOut, pVfs
29b30 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c  ->mxPathname+1)<
29b40 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
29b50 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20  e3_free(zOut);. 
29b60 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
29b70 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
29b80 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
29b90 2c 20 28 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a  , (DWORD)errno,.
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 20 20 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c           "winFul
29bc0 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20 7a 52 65  lPathname1", zRe
29bd0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c  lative);.    }el
29be0 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
29bf0 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65  zUtf8 = winConve
29c00 72 74 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65  rtToUtf8Filename
29c10 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 69 66  (zOut);.      if
29c20 28 20 21 7a 55 74 66 38 20 29 7b 0a 20 20 20 20  ( !zUtf8 ){.    
29c30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29c40 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20 20 20 20  (zOut);.        
29c50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
29c60 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
29c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
29c80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
29c90 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
29ca0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
29cb0 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
29cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
29ce0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
29cf0 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 55 74  GetDirSep(), zUt
29d00 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
29d10 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
29d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
29d30 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
29d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
29d50 72 20 2a 7a 4f 75 74 20 3d 20 73 71 6c 69 74 65  r *zOut = sqlite
29d60 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 56 66  3MallocZero( pVf
29d70 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  s->mxPathname+1 
29d80 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4f 75 74  );.    if( !zOut
29d90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
29da0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
29db0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  MEM_BKPT;.    }.
29dc0 20 20 20 20 69 66 28 20 63 79 67 77 69 6e 5f 63      if( cygwin_c
29dd0 6f 6e 76 5f 70 61 74 68 28 0a 20 20 20 20 20 20  onv_path(.      
29de0 20 20 20 20 20 20 28 6f 73 49 73 4e 54 28 29 20        (osIsNT() 
29df0 3f 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57  ? CCP_POSIX_TO_W
29e00 49 4e 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58  IN_W : CCP_POSIX
29e10 5f 54 4f 5f 57 49 4e 5f 41 29 2c 0a 20 20 20 20  _TO_WIN_A),.    
29e20 20 20 20 20 20 20 20 20 7a 52 65 6c 61 74 69 76          zRelativ
29e30 65 2c 20 7a 4f 75 74 2c 20 70 56 66 73 2d 3e 6d  e, zOut, pVfs->m
29e40 78 50 61 74 68 6e 61 6d 65 2b 31 29 3c 30 20 29  xPathname+1)<0 )
29e50 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29e60 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20  free(zOut);.    
29e70 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45    return winLogE
29e80 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
29e90 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OPEN_CONVPATH, (
29ea0 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50 61        "winFullPa
29ed0 74 68 6e 61 6d 65 32 22 2c 20 7a 52 65 6c 61 74  thname2", zRelat
29ee0 69 76 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ive);.    }else{
29ef0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74  .      char *zUt
29f00 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
29f10 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 4f  oUtf8Filename(zO
29f20 75 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ut);.      if( !
29f30 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20 20 20  zUtf8 ){.       
29f40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
29f50 75 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ut);.        ret
29f60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
29f70 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
29f80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
29f90 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
29fa0 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
29fb0 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
29fc0 20 22 25 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20   "%s", zUtf8);. 
29fd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
29fe0 65 28 7a 55 74 66 38 29 3b 0a 20 20 20 20 20 20  e(zUtf8);.      
29ff0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75  sqlite3_free(zOu
2a000 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
2a010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a020 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
2a030 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c  QLITE_OS_WINCE |
2a040 7c 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  | SQLITE_OS_WINR
2a050 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  T) && !defined(_
2a060 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69 6d  _CYGWIN__).  Sim
2a070 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2a080 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2a090 52 20 29 3b 0a 20 20 2f 2a 20 57 69 6e 43 45 20  R );.  /* WinCE 
2a0a0 68 61 73 20 6e 6f 20 63 6f 6e 63 65 70 74 20 6f  has no concept o
2a0b0 66 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  f a relative pat
2a0c0 68 6e 61 6d 65 2c 20 6f 72 20 73 6f 20 49 20 61  hname, or so I a
2a0d0 6d 20 74 6f 6c 64 2e 20 2a 2f 0a 20 20 2f 2a 20  m told. */.  /* 
2a0e0 57 69 6e 52 54 20 68 61 73 20 6e 6f 20 77 61 79  WinRT has no way
2a0f0 20 74 6f 20 63 6f 6e 76 65 72 74 20 61 20 72 65   to convert a re
2a100 6c 61 74 69 76 65 20 70 61 74 68 20 74 6f 20 61  lative path to a
2a110 6e 20 61 62 73 6f 6c 75 74 65 20 6f 6e 65 2e 20  n absolute one. 
2a120 2a 2f 0a 20 20 69 66 20 28 20 73 71 6c 69 74 65  */.  if ( sqlite
2a130 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  3_data_directory
2a140 20 26 26 20 21 77 69 6e 49 73 56 65 72 62 61 74   && !winIsVerbat
2a150 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52 65 6c 61  imPathname(zRela
2a160 74 69 76 65 29 20 29 7b 0a 20 20 20 20 2f 2a 0a  tive) ){.    /*.
2a170 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20 57 65 20      ** NOTE: We 
2a180 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a190 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2a1a0 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20 64 61   name and the da
2a1b0 74 61 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ta.    **       
2a1c0 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65  directory has be
2a1d0 65 6e 20 73 65 74 2e 20 20 54 68 65 72 65 66 6f  en set.  Therefo
2a1e0 72 65 2c 20 75 73 65 20 69 74 20 61 73 20 74 68  re, use it as th
2a1f0 65 20 62 61 73 69 73 0a 20 20 20 20 2a 2a 20 20  e basis.    **  
2a200 20 20 20 20 20 66 6f 72 20 63 6f 6e 76 65 72 74       for convert
2a210 69 6e 67 20 74 68 65 20 72 65 6c 61 74 69 76 65  ing the relative
2a220 20 70 61 74 68 20 6e 61 6d 65 20 74 6f 20 61 6e   path name to an
2a230 20 61 62 73 6f 6c 75 74 65 0a 20 20 20 20 2a 2a   absolute.    **
2a240 20 20 20 20 20 20 20 6f 6e 65 20 62 79 20 70 72         one by pr
2a250 65 70 65 6e 64 69 6e 67 20 74 68 65 20 64 61 74  epending the dat
2a260 61 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  a directory and 
2a270 61 20 62 61 63 6b 73 6c 61 73 68 2e 0a 20 20 20  a backslash..   
2a280 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2a290 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75  snprintf(MIN(nFu
2a2a0 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  ll, pVfs->mxPath
2a2b0 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25  name), zFull, "%
2a2c0 73 25 63 25 73 22 2c 0a 20 20 20 20 20 20 20 20  s%c%s",.        
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a2e0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
2a2f0 6f 72 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65  ory, winGetDirSe
2a300 70 28 29 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b  p(), zRelative);
2a310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2a320 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2a330 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2a340 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2a350 6c 6c 2c 20 22 25 73 22 2c 20 7a 52 65 6c 61 74  ll, "%s", zRelat
2a360 69 76 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ive);.  }.  retu
2a370 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
2a380 6e 64 69 66 0a 0a 23 69 66 20 21 53 51 4c 49 54  ndif..#if !SQLIT
2a390 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53  E_OS_WINCE && !S
2a3a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
2a3b0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
2a3c0 57 49 4e 5f 5f 29 0a 20 20 44 57 4f 52 44 20 6e  WIN__).  DWORD n
2a3d0 42 79 74 65 3b 0a 20 20 76 6f 69 64 20 2a 7a 43  Byte;.  void *zC
2a3e0 6f 6e 76 65 72 74 65 64 3b 0a 20 20 63 68 61 72  onverted;.  char
2a3f0 20 2a 7a 4f 75 74 3b 0a 0a 20 20 2f 2a 20 49 66   *zOut;..  /* If
2a400 20 74 68 69 73 20 70 61 74 68 20 6e 61 6d 65 20   this path name 
2a410 62 65 67 69 6e 73 20 77 69 74 68 20 22 2f 58 3a  begins with "/X:
2a420 22 2c 20 77 68 65 72 65 20 22 58 22 20 69 73 20  ", where "X" is 
2a430 61 6e 79 20 61 6c 70 68 61 62 65 74 69 63 0a 20  any alphabetic. 
2a440 20 2a 2a 20 63 68 61 72 61 63 74 65 72 2c 20 64   ** character, d
2a450 69 73 63 61 72 64 20 74 68 65 20 69 6e 69 74 69  iscard the initi
2a460 61 6c 20 22 2f 22 20 66 72 6f 6d 20 74 68 65 20  al "/" from the 
2a470 70 61 74 68 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20  pathname..  */. 
2a480 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30   if( zRelative[0
2a490 5d 3d 3d 27 2f 27 20 26 26 20 77 69 6e 49 73 44  ]=='/' && winIsD
2a4a0 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c  riveLetterAndCol
2a4b0 6f 6e 28 7a 52 65 6c 61 74 69 76 65 2b 31 29 20  on(zRelative+1) 
2a4c0 29 7b 0a 20 20 20 20 7a 52 65 6c 61 74 69 76 65  ){.    zRelative
2a4d0 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 74  ++;.  }..  /* It
2a4e0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
2a4f0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
2a500 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
2a510 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
2a520 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
2a530 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
2a540 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
2a550 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
2a560 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
2a570 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
2a580 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
2a590 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
2a5a0 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
2a5b0 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
2a5c0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
2a5d0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
2a5e0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2a5f0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2a600 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 69 66 20  E_ERROR );.  if 
2a610 28 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  ( sqlite3_data_d
2a620 69 72 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e  irectory && !win
2a630 49 73 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61  IsVerbatimPathna
2a640 6d 65 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b  me(zRelative) ){
2a650 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e  .    /*.    ** N
2a660 4f 54 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c  OTE: We are deal
2a670 69 6e 67 20 77 69 74 68 20 61 20 72 65 6c 61 74  ing with a relat
2a680 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e  ive path name an
2a690 64 20 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a  d the data.    *
2a6a0 2a 20 20 20 20 20 20 20 64 69 72 65 63 74 6f 72  *       director
2a6b0 79 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20  y has been set. 
2a6c0 20 54 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20   Therefore, use 
2a6d0 69 74 20 61 73 20 74 68 65 20 62 61 73 69 73 0a  it as the basis.
2a6e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72      **       for
2a6f0 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20   converting the 
2a700 72 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61  relative path na
2a710 6d 65 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74  me to an absolut
2a720 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f  e.    **       o
2a730 6e 65 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67  ne by prepending
2a740 20 74 68 65 20 64 61 74 61 20 64 69 72 65 63 74   the data direct
2a750 6f 72 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c  ory and a backsl
2a760 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
2a770 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2a780 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73  (MIN(nFull, pVfs
2a790 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a  ->mxPathname), z
2a7a0 46 75 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a  Full, "%s%c%s",.
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74       sqlite3_dat
2a7d0 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e  a_directory, win
2a7e0 47 65 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65  GetDirSep(), zRe
2a7f0 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 72 65 74  lative);.    ret
2a800 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a810 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
2a820 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2a830 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 52 65  Utf8Filename(zRe
2a840 6c 61 74 69 76 65 29 3b 0a 20 20 69 66 28 20 7a  lative);.  if( z
2a850 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29 7b 0a  Converted==0 ){.
2a860 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a870 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2a880 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
2a890 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4c 50  IsNT() ){.    LP
2a8a0 57 53 54 52 20 7a 54 65 6d 70 3b 0a 20 20 20 20  WSTR zTemp;.    
2a8b0 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c  nByte = osGetFul
2a8c0 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57  lPathNameW((LPCW
2a8d0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2a8e0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
2a8f0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2a900 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2a910 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2a920 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
2a930 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
2a940 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c  NTOPEN_FULLPATH,
2a950 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2a960 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2a970 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a980 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31 22 2c 20  FullPathname1", 
2a990 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a9a0 7d 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33  }.    nByte += 3
2a9b0 3b 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71  ;.    zTemp = sq
2a9c0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
2a9d0 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54   nByte*sizeof(zT
2a9e0 65 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69  emp[0]) );.    i
2a9f0 66 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20  f( zTemp==0 ){. 
2aa00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2aa10 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2aa20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2aa30 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2aa40 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  KPT;.    }.    n
2aa50 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c  Byte = osGetFull
2aa60 50 61 74 68 4e 61 6d 65 57 28 28 4c 50 43 57 53  PathNameW((LPCWS
2aa70 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e  TR)zConverted, n
2aa80 42 79 74 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b  Byte, zTemp, 0);
2aa90 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 3d 3d  .    if( nByte==
2aaa0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
2aab0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
2aac0 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
2aad0 65 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a  e3_free(zTemp);.
2aae0 20 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e        return win
2aaf0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2ab00 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
2ab10 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  H, osGetLastErro
2ab20 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
2ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
2ab40 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22  inFullPathname2"
2ab50 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20  , zRelative);.  
2ab60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2ab70 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2ab80 3b 0a 20 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e  ;.    zOut = win
2ab90 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28 7a 54  UnicodeToUtf8(zT
2aba0 65 6d 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  emp);.    sqlite
2abb0 33 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20  3_free(zTemp);. 
2abc0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
2abd0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
2abe0 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72    else{.    char
2abf0 20 2a 7a 54 65 6d 70 3b 0a 20 20 20 20 6e 42 79   *zTemp;.    nBy
2ac00 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61  te = osGetFullPa
2ac10 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29 7a  thNameA((char*)z
2ac20 43 6f 6e 76 65 72 74 65 64 2c 20 30 2c 20 30 2c  Converted, 0, 0,
2ac30 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
2ac40 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
2ac50 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2ac60 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 72  verted);.      r
2ac70 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2ac80 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2ac90 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2aca0 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2acd0 61 74 68 6e 61 6d 65 33 22 2c 20 7a 52 65 6c 61  athname3", zRela
2ace0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2acf0 20 6e 42 79 74 65 20 2b 3d 20 33 3b 0a 20 20 20   nByte += 3;.   
2ad00 20 7a 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 33   zTemp = sqlite3
2ad10 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74  MallocZero( nByt
2ad20 65 2a 73 69 7a 65 6f 66 28 7a 54 65 6d 70 5b 30  e*sizeof(zTemp[0
2ad30 5d 29 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  ]) );.    if( zT
2ad40 65 6d 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  emp==0 ){.      
2ad50 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2ad60 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20  nverted);.      
2ad70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2ad80 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
2ad90 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2ada0 3d 20 6f 73 47 65 74 46 75 6c 6c 50 61 74 68 4e  = osGetFullPathN
2adb0 61 6d 65 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e  ameA((char*)zCon
2adc0 76 65 72 74 65 64 2c 20 6e 42 79 74 65 2c 20 7a  verted, nByte, z
2add0 54 65 6d 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  Temp, 0);.    if
2ade0 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
2adf0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ae00 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2ae10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ae20 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 72  (zTemp);.      r
2ae30 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f  eturn winLogErro
2ae40 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
2ae50 4e 5f 46 55 4c 4c 50 41 54 48 2c 20 6f 73 47 65  N_FULLPATH, osGe
2ae60 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20  tLastError(),.  
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae80 20 20 20 20 20 20 20 22 77 69 6e 46 75 6c 6c 50         "winFullP
2ae90 61 74 68 6e 61 6d 65 34 22 2c 20 7a 52 65 6c 61  athname4", zRela
2aea0 74 69 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  tive);.    }.   
2aeb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
2aec0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 7a  onverted);.    z
2aed0 4f 75 74 20 3d 20 77 69 6e 4d 62 63 73 54 6f 55  Out = winMbcsToU
2aee0 74 66 38 28 7a 54 65 6d 70 2c 20 6f 73 41 72 65  tf8(zTemp, osAre
2aef0 46 69 6c 65 41 70 69 73 41 4e 53 49 28 29 29 3b  FileApisANSI());
2af00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2af10 65 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 0a 23 65  e(zTemp);.  }.#e
2af20 6e 64 69 66 0a 20 20 69 66 28 20 7a 4f 75 74 20  ndif.  if( zOut 
2af30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2af40 6e 70 72 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c  nprintf(MIN(nFul
2af50 6c 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  l, pVfs->mxPathn
2af60 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73  ame), zFull, "%s
2af70 22 2c 20 7a 4f 75 74 29 3b 0a 20 20 20 20 73 71  ", zOut);.    sq
2af80 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2af90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2afa0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2afb0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2afc0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
2afd0 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  KPT;.  }.#endif.
2afe0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
2aff0 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
2b000 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65  NSION./*.** Inte
2b010 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69  rfaces for openi
2b020 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62 72  ng a shared libr
2b030 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74  ary, finding ent
2b040 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74  ry points.** wit
2b050 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  hin the shared l
2b060 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73  ibrary, and clos
2b070 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
2b080 69 62 72 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  ibrary..*/.stati
2b090 63 20 76 6f 69 64 20 2a 77 69 6e 44 6c 4f 70 65  c void *winDlOpe
2b0a0 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  n(sqlite3_vfs *p
2b0b0 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Vfs, const char 
2b0c0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 48  *zFilename){.  H
2b0d0 41 4e 44 4c 45 20 68 3b 0a 23 69 66 20 64 65 66  ANDLE h;.#if def
2b0e0 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
2b0f0 0a 20 20 69 6e 74 20 6e 46 75 6c 6c 20 3d 20 70  .  int nFull = p
2b100 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2b110 31 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  1;.  char *zFull
2b120 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
2b130 5a 65 72 6f 28 20 6e 46 75 6c 6c 20 29 3b 0a 20  Zero( nFull );. 
2b140 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
2b150 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 46 75  d = 0;.  if( zFu
2b160 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54  ll==0 ){.    OST
2b170 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61  RACE(("DLOPEN na
2b180 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70  me=%s, handle=%p
2b190 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  \n", zFilename, 
2b1a0 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20 20  (void*)0));.    
2b1b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2b1c0 69 66 28 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e  if( winFullPathn
2b1d0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
2b1e0 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c  ame, nFull, zFul
2b1f0 6c 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  l)!=SQLITE_OK ){
2b200 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2b210 65 28 7a 46 75 6c 6c 29 3b 0a 20 20 20 20 4f 53  e(zFull);.    OS
2b220 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20 6e  TRACE(("DLOPEN n
2b230 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d 25  ame=%s, handle=%
2b240 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  p\n", zFilename,
2b250 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a 20 20 20   (void*)0));.   
2b260 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
2b270 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69   zConverted = wi
2b280 6e 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38  nConvertFromUtf8
2b290 46 69 6c 65 6e 61 6d 65 28 7a 46 75 6c 6c 29 3b  Filename(zFull);
2b2a0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2b2b0 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73 65 0a 20 20  zFull);.#else.  
2b2c0 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
2b2d0 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f   = winConvertFro
2b2e0 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46  mUtf8Filename(zF
2b2f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 55 4e 55 53  ilename);.  UNUS
2b300 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2b310 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  s);.#endif.  if(
2b320 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20 29   zConverted==0 )
2b330 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
2b340 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20  DLOPEN name=%s, 
2b350 68 61 6e 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46  handle=%p\n", zF
2b360 69 6c 65 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  ilename, (void*)
2b370 30 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0));.    return 
2b380 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49  0;.  }.  if( osI
2b390 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51 4c  sNT() ){.#if SQL
2b3a0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 20  ITE_OS_WINRT.   
2b3b0 20 68 20 3d 20 6f 73 4c 6f 61 64 50 61 63 6b 61   h = osLoadPacka
2b3c0 67 65 64 4c 69 62 72 61 72 79 28 28 4c 50 43 57  gedLibrary((LPCW
2b3d0 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20  STR)zConverted, 
2b3e0 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 68 20  0);.#else.    h 
2b3f0 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79 57  = osLoadLibraryW
2b400 28 28 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65  ((LPCWSTR)zConve
2b410 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
2b420 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
2b430 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
2b440 20 65 6c 73 65 7b 0a 20 20 20 20 68 20 3d 20 6f   else{.    h = o
2b450 73 4c 6f 61 64 4c 69 62 72 61 72 79 41 28 28 63  sLoadLibraryA((c
2b460 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 29  har*)zConverted)
2b470 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
2b480 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45 4e 20  STRACE(("DLOPEN 
2b490 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c 65 3d  name=%s, handle=
2b4a0 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65  %p\n", zFilename
2b4b0 2c 20 28 76 6f 69 64 2a 29 68 29 29 3b 0a 20 20  , (void*)h));.  
2b4c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
2b4d0 6e 76 65 72 74 65 64 29 3b 0a 20 20 72 65 74 75  nverted);.  retu
2b4e0 72 6e 20 28 76 6f 69 64 2a 29 68 3b 0a 7d 0a 73  rn (void*)h;.}.s
2b4f0 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44 6c  tatic void winDl
2b500 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2b510 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2b520 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74  f, char *zBufOut
2b530 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
2b540 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 77  METER(pVfs);.  w
2b550 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d 73  inGetLastErrorMs
2b560 67 28 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  g(osGetLastError
2b570 28 29 2c 20 6e 42 75 66 2c 20 7a 42 75 66 4f 75  (), nBuf, zBufOu
2b580 74 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  t);.}.static voi
2b590 64 20 28 2a 77 69 6e 44 6c 53 79 6d 28 73 71 6c  d (*winDlSym(sql
2b5a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 76  ite3_vfs *pVfs,v
2b5b0 6f 69 64 20 2a 70 48 2c 63 6f 6e 73 74 20 63 68  oid *pH,const ch
2b5c0 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
2b5d0 7b 0a 20 20 46 41 52 50 52 4f 43 20 70 72 6f 63  {.  FARPROC proc
2b5e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
2b5f0 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 70 72  ETER(pVfs);.  pr
2b600 6f 63 20 3d 20 6f 73 47 65 74 50 72 6f 63 41 64  oc = osGetProcAd
2b610 64 72 65 73 73 41 28 28 48 41 4e 44 4c 45 29 70  dressA((HANDLE)p
2b620 48 2c 20 7a 53 79 6d 29 3b 0a 20 20 4f 53 54 52  H, zSym);.  OSTR
2b630 41 43 45 28 28 22 44 4c 53 59 4d 20 68 61 6e 64  ACE(("DLSYM hand
2b640 6c 65 3d 25 70 2c 20 73 79 6d 62 6f 6c 3d 25 73  le=%p, symbol=%s
2b650 2c 20 61 64 64 72 65 73 73 3d 25 70 5c 6e 22 2c  , address=%p\n",
2b660 0a 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69  .           (voi
2b670 64 2a 29 70 48 2c 20 7a 53 79 6d 2c 20 28 76 6f  d*)pH, zSym, (vo
2b680 69 64 2a 29 70 72 6f 63 29 29 3b 0a 20 20 72 65  id*)proc));.  re
2b690 74 75 72 6e 20 28 76 6f 69 64 28 2a 29 28 76 6f  turn (void(*)(vo
2b6a0 69 64 29 29 70 72 6f 63 3b 0a 7d 0a 73 74 61 74  id))proc;.}.stat
2b6b0 69 63 20 76 6f 69 64 20 77 69 6e 44 6c 43 6c 6f  ic void winDlClo
2b6c0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
2b6d0 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61 6e  pVfs, void *pHan
2b6e0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
2b6f0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2b700 20 20 6f 73 46 72 65 65 4c 69 62 72 61 72 79 28    osFreeLibrary(
2b710 28 48 41 4e 44 4c 45 29 70 48 61 6e 64 6c 65 29  (HANDLE)pHandle)
2b720 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c  ;.  OSTRACE(("DL
2b730 43 4c 4f 53 45 20 68 61 6e 64 6c 65 3d 25 70 5c  CLOSE handle=%p\
2b740 6e 22 2c 20 28 76 6f 69 64 2a 29 70 48 61 6e 64  n", (void*)pHand
2b750 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  le));.}.#else /*
2b760 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
2b770 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
2b780 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
2b790 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 4f 70 65  #define winDlOpe
2b7a0 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77  n  0.  #define w
2b7b0 69 6e 44 6c 45 72 72 6f 72 20 30 0a 20 20 23 64  inDlError 0.  #d
2b7c0 65 66 69 6e 65 20 77 69 6e 44 6c 53 79 6d 20 20  efine winDlSym  
2b7d0 20 30 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e   0.  #define win
2b7e0 44 6c 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66  DlClose 0.#endif
2b7f0 0a 0a 2f 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  ../* State infor
2b800 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72  mation for the r
2b810 61 6e 64 6f 6d 6e 65 73 73 20 67 61 74 68 65 72  andomness gather
2b820 65 72 2e 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  er. */.typedef s
2b830 74 72 75 63 74 20 45 6e 74 72 6f 70 79 47 61 74  truct EntropyGat
2b840 68 65 72 65 72 20 45 6e 74 72 6f 70 79 47 61 74  herer EntropyGat
2b850 68 65 72 65 72 3b 0a 73 74 72 75 63 74 20 45 6e  herer;.struct En
2b860 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 7b 0a  tropyGatherer {.
2b870 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2b880 2a 61 3b 20 20 20 2f 2a 20 47 61 74 68 65 72 20  *a;   /* Gather 
2b890 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 74 68 69  entropy into thi
2b8a0 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  s buffer */.  in
2b8b0 74 20 6e 61 3b 20 20 20 20 20 20 20 20 20 20 20  t na;           
2b8c0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 5b 5d    /* Size of a[]
2b8d0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
2b8e0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2b8f0 20 20 20 2f 2a 20 58 4f 52 20 6e 65 78 74 20 69     /* XOR next i
2b900 6e 70 75 74 20 69 6e 74 6f 20 61 5b 69 5d 20 2a  nput into a[i] *
2b910 2f 0a 20 20 69 6e 74 20 6e 58 6f 72 3b 20 20 20  /.  int nXor;   
2b920 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b930 72 20 6f 66 20 58 4f 52 20 6f 70 65 72 61 74 69  r of XOR operati
2b940 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a 7d 3b 0a 0a  ons done */.};..
2b950 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
2b960 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
2b970 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b980 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 2f 2a  T_RANDOMNESS)./*
2b990 20 4d 69 78 20 73 7a 20 62 79 74 65 73 20 6f 66   Mix sz bytes of
2b9a0 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f 20 70 2e   entropy into p.
2b9b0 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
2b9c0 78 6f 72 4d 65 6d 6f 72 79 28 45 6e 74 72 6f 70  xorMemory(Entrop
2b9d0 79 47 61 74 68 65 72 65 72 20 2a 70 2c 20 75 6e  yGatherer *p, un
2b9e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 78 2c 20  signed char *x, 
2b9f0 69 6e 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 6a  int sz){.  int j
2ba00 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a 3d 30 2c 20  , k;.  for(j=0, 
2ba10 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a 3b 20 6a 2b  k=p->i; j<sz; j+
2ba20 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 5b 6b 2b 2b  +){.    p->a[k++
2ba30 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20 20 20 20 69  ] ^= x[j];.    i
2ba40 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20 29 20 6b 20  f( k>=p->na ) k 
2ba50 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 20  = 0;.  }.  p->i 
2ba60 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58 6f 72 20 2b  = k;.  p->nXor +
2ba70 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  = sz;.}.#endif /
2ba80 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
2ba90 45 5f 54 45 53 54 29 20 26 26 20 21 64 65 66 69  E_TEST) && !defi
2baa0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2bab0 52 41 4e 44 4f 4d 4e 45 53 53 29 20 2a 2f 0a 0a  RANDOMNESS) */..
2bac0 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 75 70 20 74  /*.** Write up t
2bad0 6f 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  o nBuf bytes of 
2bae0 72 61 6e 64 6f 6d 6e 65 73 73 20 69 6e 74 6f 20  randomness into 
2baf0 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
2bb00 69 6e 74 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73  int winRandomnes
2bb10 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
2bb20 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  Vfs, int nBuf, c
2bb30 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66 20  har *zBuf){.#if 
2bb40 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
2bb50 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
2bb60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
2bb70 4f 4d 4e 45 53 53 29 0a 20 20 55 4e 55 53 45 44  OMNESS).  UNUSED
2bb80 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
2bb90 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c  ;.  memset(zBuf,
2bba0 20 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 65 74   0, nBuf);.  ret
2bbb0 75 72 6e 20 6e 42 75 66 3b 0a 23 65 6c 73 65 0a  urn nBuf;.#else.
2bbc0 20 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65    EntropyGathere
2bbd0 72 20 65 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  r e;.  UNUSED_PA
2bbe0 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20  RAMETER(pVfs);. 
2bbf0 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c   memset(zBuf, 0,
2bc00 20 6e 42 75 66 29 3b 0a 23 69 66 20 64 65 66 69   nBuf);.#if defi
2bc10 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
2bc20 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 34 30 30 20   _MSC_VER>=1400 
2bc30 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  && !SQLITE_OS_WI
2bc40 4e 43 45 0a 20 20 72 61 6e 64 5f 73 28 28 75 6e  NCE.  rand_s((un
2bc50 73 69 67 6e 65 64 20 69 6e 74 2a 29 7a 42 75 66  signed int*)zBuf
2bc60 29 3b 20 2f 2a 20 72 61 6e 64 5f 73 28 29 20 69  ); /* rand_s() i
2bc70 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
2bc80 77 69 74 68 20 4d 69 6e 47 57 20 2a 2f 0a 23 65  with MinGW */.#e
2bc90 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
2bca0 5f 4d 53 43 5f 56 45 52 29 20 26 26 20 5f 4d 53  _MSC_VER) && _MS
2bcb0 43 5f 56 45 52 3e 3d 31 34 30 30 20 2a 2f 0a 20  C_VER>=1400 */. 
2bcc0 20 65 2e 61 20 3d 20 28 75 6e 73 69 67 6e 65 64   e.a = (unsigned
2bcd0 20 63 68 61 72 2a 29 7a 42 75 66 3b 0a 20 20 65   char*)zBuf;.  e
2bce0 2e 6e 61 20 3d 20 6e 42 75 66 3b 0a 20 20 65 2e  .na = nBuf;.  e.
2bcf0 6e 58 6f 72 20 3d 20 30 3b 0a 20 20 65 2e 69 20  nXor = 0;.  e.i 
2bd00 3d 20 30 3b 0a 20 20 7b 0a 20 20 20 20 53 59 53  = 0;.  {.    SYS
2bd10 54 45 4d 54 49 4d 45 20 78 3b 0a 20 20 20 20 6f  TEMTIME x;.    o
2bd20 73 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26  sGetSystemTime(&
2bd30 78 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  x);.    xorMemor
2bd40 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2bd50 63 68 61 72 2a 29 26 78 2c 20 73 69 7a 65 6f 66  char*)&x, sizeof
2bd60 28 53 59 53 54 45 4d 54 49 4d 45 29 29 3b 0a 20  (SYSTEMTIME));. 
2bd70 20 7d 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44   }.  {.    DWORD
2bd80 20 70 69 64 20 3d 20 6f 73 47 65 74 43 75 72 72   pid = osGetCurr
2bd90 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 3b 0a  entProcessId();.
2bda0 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2bdb0 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2bdc0 2a 29 26 70 69 64 2c 20 73 69 7a 65 6f 66 28 44  *)&pid, sizeof(D
2bdd0 57 4f 52 44 29 29 3b 0a 20 20 7d 0a 23 69 66 20  WORD));.  }.#if 
2bde0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2bdf0 20 20 7b 0a 20 20 20 20 55 4c 4f 4e 47 4c 4f 4e    {.    ULONGLON
2be00 47 20 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63  G cnt = osGetTic
2be10 6b 43 6f 75 6e 74 36 34 28 29 3b 0a 20 20 20 20  kCount64();.    
2be20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2be30 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63  nsigned char*)&c
2be40 6e 74 2c 20 73 69 7a 65 6f 66 28 55 4c 4f 4e 47  nt, sizeof(ULONG
2be50 4c 4f 4e 47 29 29 3b 0a 20 20 7d 0a 23 65 6c 73  LONG));.  }.#els
2be60 65 0a 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20  e.  {.    DWORD 
2be70 63 6e 74 20 3d 20 6f 73 47 65 74 54 69 63 6b 43  cnt = osGetTickC
2be80 6f 75 6e 74 28 29 3b 0a 20 20 20 20 78 6f 72 4d  ount();.    xorM
2be90 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2bea0 6e 65 64 20 63 68 61 72 2a 29 26 63 6e 74 2c 20  ned char*)&cnt, 
2beb0 73 69 7a 65 6f 66 28 44 57 4f 52 44 29 29 3b 0a  sizeof(DWORD));.
2bec0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
2bed0 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 2a 2f  LITE_OS_WINRT */
2bee0 0a 20 20 7b 0a 20 20 20 20 4c 41 52 47 45 5f 49  .  {.    LARGE_I
2bef0 4e 54 45 47 45 52 20 69 3b 0a 20 20 20 20 6f 73  NTEGER i;.    os
2bf00 51 75 65 72 79 50 65 72 66 6f 72 6d 61 6e 63 65  QueryPerformance
2bf10 43 6f 75 6e 74 65 72 28 26 69 29 3b 0a 20 20 20  Counter(&i);.   
2bf20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28   xorMemory(&e, (
2bf30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26  unsigned char*)&
2bf40 69 2c 20 73 69 7a 65 6f 66 28 4c 41 52 47 45 5f  i, sizeof(LARGE_
2bf50 49 4e 54 45 47 45 52 29 29 3b 0a 20 20 7d 0a 23  INTEGER));.  }.#
2bf60 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  if !SQLITE_OS_WI
2bf70 4e 43 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  NCE && !SQLITE_O
2bf80 53 5f 57 49 4e 52 54 20 26 26 20 53 51 4c 49 54  S_WINRT && SQLIT
2bf90 45 5f 57 49 4e 33 32 5f 55 53 45 5f 55 55 49 44  E_WIN32_USE_UUID
2bfa0 0a 20 20 7b 0a 20 20 20 20 55 55 49 44 20 69 64  .  {.    UUID id
2bfb0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64  ;.    memset(&id
2bfc0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44  , 0, sizeof(UUID
2bfd0 29 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72  ));.    osUuidCr
2bfe0 65 61 74 65 28 26 69 64 29 3b 0a 20 20 20 20 78  eate(&id);.    x
2bff0 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e  orMemory(&e, (un
2c000 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 69 64  signed char*)&id
2c010 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29 29 3b  , sizeof(UUID));
2c020 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 64 2c  .    memset(&id,
2c030 20 30 2c 20 73 69 7a 65 6f 66 28 55 55 49 44 29   0, sizeof(UUID)
2c040 29 3b 0a 20 20 20 20 6f 73 55 75 69 64 43 72 65  );.    osUuidCre
2c050 61 74 65 53 65 71 75 65 6e 74 69 61 6c 28 26 69  ateSequential(&i
2c060 64 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  d);.    xorMemor
2c070 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2c080 63 68 61 72 2a 29 26 69 64 2c 20 73 69 7a 65 6f  char*)&id, sizeo
2c090 66 28 55 55 49 44 29 29 3b 0a 20 20 7d 0a 23 65  f(UUID));.  }.#e
2c0a0 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2c0b0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c  OS_WINCE && !SQL
2c0c0 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20  ITE_OS_WINRT && 
2c0d0 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45  SQLITE_WIN32_USE
2c0e0 5f 55 55 49 44 20 2a 2f 0a 20 20 72 65 74 75 72  _UUID */.  retur
2c0f0 6e 20 65 2e 6e 58 6f 72 3e 6e 42 75 66 20 3f 20  n e.nXor>nBuf ? 
2c100 6e 42 75 66 20 3a 20 65 2e 6e 58 6f 72 3b 0a 23  nBuf : e.nXor;.#
2c110 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
2c120 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
2c130 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2c140 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
2c150 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c   */.}.../*.** Sl
2c160 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65  eep for a little
2c170 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20   while.  Return 
2c180 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69  the amount of ti
2c190 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  me slept..*/.sta
2c1a0 74 69 63 20 69 6e 74 20 77 69 6e 53 6c 65 65 70  tic int winSleep
2c1b0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2c1c0 66 73 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63  fs, int microsec
2c1d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 77 69 6e  ){.  sqlite3_win
2c1e0 33 32 5f 73 6c 65 65 70 28 28 6d 69 63 72 6f 73  32_sleep((micros
2c1f0 65 63 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20  ec+999)/1000);. 
2c200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c210 52 28 70 56 66 73 29 3b 0a 20 20 72 65 74 75 72  R(pVfs);.  retur
2c220 6e 20 28 28 6d 69 63 72 6f 73 65 63 2b 39 39 39  n ((microsec+999
2c230 29 2f 31 30 30 30 29 2a 31 30 30 30 3b 0a 7d 0a  )/1000)*1000;.}.
2c240 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2c250 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69  wing variable, i
2c260 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a  f set to a non-z
2c270 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20 69 6e  ero value, is in
2c280 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a 2a 20  terpreted as.** 
2c290 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2c2a0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
2c2b0 20 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20   and is used to 
2c2c0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f  set the result o
2c2d0 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 43 75  f.** sqlite3OsCu
2c2e0 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75 72 69  rrentTime() duri
2c2f0 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  ng testing..*/.#
2c300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2c310 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  T.int sqlite3_cu
2c320 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 20  rrent_time = 0; 
2c330 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65 6d 20   /* Fake system 
2c340 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64 73 20  time in seconds 
2c350 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f 0a 23  since 1970. */.#
2c360 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
2c370 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
2c380 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
2c390 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
2c3a0 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  e).  Write into 
2c3b0 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20 63 75  *piNow.** the cu
2c3c0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
2c3d0 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
2c3e0 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d 65 73  Day number times
2c3f0 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20 49 6e   86_400_000.  In
2c400 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  .** other words,
2c410 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e   write into *piN
2c420 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ow the number of
2c430 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73 69   milliseconds si
2c440 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e 0a 2a  nce the Julian.*
2c450 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f 6e 20  * epoch of noon 
2c460 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f 6e 20  in Greenwich on 
2c470 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34 37 31  November 24, 471
2c480 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e 67 20  4 B.C according 
2c490 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c 65 70  to the.** prolep
2c4a0 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20 63 61  tic Gregorian ca
2c4b0 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  lendar..**.** On
2c4c0 20 73 75 63 63 65 73 73 2c 20 72 65 74 75 72 6e   success, return
2c4d0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 52 65 74   SQLITE_OK.  Ret
2c4e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2c4f0 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64   if the time and
2c500 20 64 61 74 65 0a 2a 2a 20 63 61 6e 6e 6f 74 20   date.** cannot 
2c510 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
2c520 74 69 63 20 69 6e 74 20 77 69 6e 43 75 72 72 65  tic int winCurre
2c530 6e 74 54 69 6d 65 49 6e 74 36 34 28 73 71 6c 69  ntTimeInt64(sqli
2c540 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 73  te3_vfs *pVfs, s
2c550 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
2c560 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46 49 4c 45 54  Now){.  /* FILET
2c570 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69 73  IME structure is
2c580 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65 20   a 64-bit value 
2c590 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65  representing the
2c5a0 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20   number of.     
2c5b0 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64 20 69  100-nanosecond i
2c5c0 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65 20 4a  ntervals since J
2c5d0 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31 20 28  anuary 1, 1601 (
2c5e0 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35 29 2e  = JD 2305813.5).
2c5f0 0a 20 20 2a 2f 0a 20 20 46 49 4c 45 54 49 4d 45  .  */.  FILETIME
2c600 20 66 74 3b 0a 20 20 73 74 61 74 69 63 20 63 6f   ft;.  static co
2c610 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
2c620 34 20 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f  4 winFiletimeEpo
2c630 63 68 20 3d 20 32 33 30 35 38 31 33 35 2a 28 73  ch = 23058135*(s
2c640 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36 34  qlite3_int64)864
2c650 30 30 30 30 3b 0a 23 69 66 64 65 66 20 53 51 4c  0000;.#ifdef SQL
2c660 49 54 45 5f 54 45 53 54 0a 20 20 73 74 61 74 69  ITE_TEST.  stati
2c670 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2c680 69 6e 74 36 34 20 75 6e 69 78 45 70 6f 63 68 20  int64 unixEpoch 
2c690 3d 20 32 34 34 30 35 38 37 35 2a 28 73 71 6c 69  = 24405875*(sqli
2c6a0 74 65 33 5f 69 6e 74 36 34 29 38 36 34 30 30 30  te3_int64)864000
2c6b0 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 32  0;.#endif.  /* 2
2c6c0 5e 33 32 20 2d 20 74 6f 20 61 76 6f 69 64 20 75  ^32 - to avoid u
2c6d0 73 65 20 6f 66 20 4c 4c 20 61 6e 64 20 77 61 72  se of LL and war
2c6e0 6e 69 6e 67 73 20 69 6e 20 67 63 63 20 2a 2f 0a  nings in gcc */.
2c6f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2c700 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 61 78  qlite3_int64 max
2c710 33 32 42 69 74 56 61 6c 75 65 20 3d 0a 20 20 20  32BitValue =.   
2c720 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36     (sqlite3_int6
2c730 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 20 28  4)2000000000 + (
2c740 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 32 30  sqlite3_int64)20
2c750 30 30 30 30 30 30 30 30 20 2b 0a 20 20 20 20 20  00000000 +.     
2c760 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29   (sqlite3_int64)
2c770 32 39 34 39 36 37 32 39 36 3b 0a 0a 23 69 66 20  294967296;..#if 
2c780 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a  SQLITE_OS_WINCE.
2c790 20 20 53 59 53 54 45 4d 54 49 4d 45 20 74 69 6d    SYSTEMTIME tim
2c7a0 65 3b 0a 20 20 6f 73 47 65 74 53 79 73 74 65 6d  e;.  osGetSystem
2c7b0 54 69 6d 65 28 26 74 69 6d 65 29 3b 0a 20 20 2f  Time(&time);.  /
2c7c0 2a 20 69 66 20 53 79 73 74 65 6d 54 69 6d 65 54  * if SystemTimeT
2c7d0 6f 46 69 6c 65 54 69 6d 65 28 29 20 66 61 69 6c  oFileTime() fail
2c7e0 73 2c 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  s, it returns ze
2c7f0 72 6f 2e 20 2a 2f 0a 20 20 69 66 20 28 21 6f 73  ro. */.  if (!os
2c800 53 79 73 74 65 6d 54 69 6d 65 54 6f 46 69 6c 65  SystemTimeToFile
2c810 54 69 6d 65 28 26 74 69 6d 65 2c 26 66 74 29 29  Time(&time,&ft))
2c820 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c830 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 23  ITE_ERROR;.  }.#
2c840 65 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74  else.  osGetSyst
2c850 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
2c860 28 20 26 66 74 20 29 3b 0a 23 65 6e 64 69 66 0a  ( &ft );.#endif.
2c870 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 77 69 6e 46  .  *piNow = winF
2c880 69 6c 65 74 69 6d 65 45 70 6f 63 68 20 2b 0a 20  iletimeEpoch +. 
2c890 20 20 20 20 20 20 20 20 20 20 20 28 28 28 28 73             ((((s
2c8a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66 74 2e  qlite3_int64)ft.
2c8b0 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29 2a  dwHighDateTime)*
2c8c0 6d 61 78 33 32 42 69 74 56 61 6c 75 65 29 20 2b  max32BitValue) +
2c8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c8e0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 66  (sqlite3_int64)f
2c8f0 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29  t.dwLowDateTime)
2c900 2f 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  /(sqlite3_int64)
2c910 31 30 30 30 30 3b 0a 0a 23 69 66 64 65 66 20 53  10000;..#ifdef S
2c920 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
2c930 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
2c940 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
2c950 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
2c960 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
2c970 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
2c980 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
2c990 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
2c9a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2c9b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2c9c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  _OK;.}../*.** Fi
2c9d0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
2c9e0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
2c9f0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
2ca00 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
2ca10 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
2ca20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
2ca30 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
2ca40 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
2ca50 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
2ca60 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
2ca70 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
2ca80 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
2ca90 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43 75  static int winCu
2caa0 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65  rrentTime(sqlite
2cab0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f 75  3_vfs *pVfs, dou
2cac0 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 69  ble *prNow){.  i
2cad0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2cae0 5f 69 6e 74 36 34 20 69 3b 0a 20 20 72 63 20 3d  _int64 i;.  rc =
2caf0 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2cb00 6e 74 36 34 28 70 56 66 73 2c 20 26 69 29 3b 0a  nt64(pVfs, &i);.
2cb10 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20    if( !rc ){.   
2cb20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
2cb30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a 20 20 72 65  0000.0;.  }.  re
2cb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2cb50 2a 20 54 68 65 20 69 64 65 61 20 69 73 20 74 68  * The idea is th
2cb60 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  at this function
2cb70 20 77 6f 72 6b 73 20 6c 69 6b 65 20 61 20 63 6f   works like a co
2cb80 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20  mbination of.** 
2cb90 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 61  GetLastError() a
2cba0 6e 64 20 46 6f 72 6d 61 74 4d 65 73 73 61 67 65  nd FormatMessage
2cbb0 28 29 20 6f 6e 20 57 69 6e 64 6f 77 73 20 28 6f  () on Windows (o
2cbc0 72 20 65 72 72 6e 6f 20 61 6e 64 0a 2a 2a 20 73  r errno and.** s
2cbd0 74 72 65 72 72 6f 72 5f 72 28 29 20 6f 6e 20 55  trerror_r() on U
2cbe0 6e 69 78 29 2e 20 41 66 74 65 72 20 61 6e 20 65  nix). After an e
2cbf0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
2cc00 20 62 79 20 61 6e 20 4f 53 0a 2a 2a 20 66 75 6e   by an OS.** fun
2cc10 63 74 69 6f 6e 2c 20 53 51 4c 69 74 65 20 63 61  ction, SQLite ca
2cc20 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
2cc30 6e 20 77 69 74 68 20 7a 42 75 66 20 70 6f 69 6e  n with zBuf poin
2cc40 74 69 6e 67 20 74 6f 0a 2a 2a 20 61 20 62 75 66  ting to.** a buf
2cc50 66 65 72 20 6f 66 20 6e 42 75 66 20 62 79 74 65  fer of nBuf byte
2cc60 73 2e 20 54 68 65 20 4f 53 20 6c 61 79 65 72 20  s. The OS layer 
2cc70 73 68 6f 75 6c 64 20 70 6f 70 75 6c 61 74 65 20  should populate 
2cc80 74 68 65 0a 2a 2a 20 62 75 66 66 65 72 20 77 69  the.** buffer wi
2cc90 74 68 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  th a nul-termina
2cca0 74 65 64 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  ted UTF-8 encode
2ccb0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  d error message.
2ccc0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ** describing th
2ccd0 65 20 6c 61 73 74 20 49 4f 20 65 72 72 6f 72 20  e last IO error 
2cce0 74 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  to have occurred
2ccf0 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c 6c   within the call
2cd00 69 6e 67 0a 2a 2a 20 74 68 72 65 61 64 2e 0a 2a  ing.** thread..*
2cd10 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f  *.** If the erro
2cd20 72 20 6d 65 73 73 61 67 65 20 69 73 20 74 6f 6f  r message is too
2cd30 20 6c 61 72 67 65 20 66 6f 72 20 74 68 65 20 73   large for the s
2cd40 75 70 70 6c 69 65 64 20 62 75 66 66 65 72 2c 0a  upplied buffer,.
2cd50 2a 2a 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20  ** it should be 
2cd60 74 72 75 6e 63 61 74 65 64 2e 20 54 68 65 20 72  truncated. The r
2cd70 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 78  eturn value of x
2cd80 47 65 74 4c 61 73 74 45 72 72 6f 72 0a 2a 2a 20  GetLastError.** 
2cd90 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 20 65  is zero if the e
2cda0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 69 74  rror message fit
2cdb0 73 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 2c  s in the buffer,
2cdc0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20   or non-zero.** 
2cdd0 6f 74 68 65 72 77 69 73 65 20 28 69 66 20 74 68  otherwise (if th
2cde0 65 20 6d 65 73 73 61 67 65 20 77 61 73 20 74 72  e message was tr
2cdf0 75 6e 63 61 74 65 64 29 2e 20 49 66 20 6e 6f 6e  uncated). If non
2ce00 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
2ce10 64 2c 0a 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  d,.** then it is
2ce20 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
2ce30 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 6e 75  o include the nu
2ce40 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20 63 68 61  l-terminator cha
2ce50 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 74 68 65  racter.** in the
2ce60 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2e 0a   output buffer..
2ce70 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75 70 70 6c 79  **.** Not supply
2ce80 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ing an error mes
2ce90 73 61 67 65 20 77 69 6c 6c 20 68 61 76 65 20 6e  sage will have n
2cea0 6f 20 61 64 76 65 72 73 65 20 65 66 66 65 63 74  o adverse effect
2ceb0 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74 65 2e 20 49  .** on SQLite. I
2cec0 74 20 69 73 20 66 69 6e 65 20 74 6f 20 68 61 76  t is fine to hav
2ced0 65 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e an implementat
2cee0 69 6f 6e 20 74 68 61 74 20 6e 65 76 65 72 0a 2a  ion that never.*
2cef0 2a 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  * returns an err
2cf00 6f 72 20 6d 65 73 73 61 67 65 3a 0a 2a 2a 0a 2a  or message:.**.*
2cf10 2a 20 20 20 69 6e 74 20 78 47 65 74 4c 61 73 74  *   int xGetLast
2cf20 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
2cf30 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2cf40 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2cf50 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 7a 42  **     assert(zB
2cf60 75 66 5b 30 5d 3d 3d 27 5c 30 27 29 3b 0a 2a 2a  uf[0]=='\0');.**
2cf70 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 2a       return 0;.*
2cf80 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 48 6f 77 65  *   }.**.** Howe
2cf90 76 65 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ver if an error 
2cfa0 6d 65 73 73 61 67 65 20 69 73 20 73 75 70 70 6c  message is suppl
2cfb0 69 65 64 2c 20 69 74 20 77 69 6c 6c 20 62 65 20  ied, it will be 
2cfc0 69 6e 63 6f 72 70 6f 72 61 74 65 64 0a 2a 2a 20  incorporated.** 
2cfd0 62 79 20 73 71 6c 69 74 65 20 69 6e 74 6f 20 74  by sqlite into t
2cfe0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2cff0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68   available to th
2d000 65 20 75 73 65 72 20 75 73 69 6e 67 0a 2a 2a 20  e user using.** 
2d010 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
2d020 2c 20 70 6f 73 73 69 62 6c 79 20 6d 61 6b 69 6e  , possibly makin
2d030 67 20 49 4f 20 65 72 72 6f 72 73 20 65 61 73 69  g IO errors easi
2d040 65 72 20 74 6f 20 64 65 62 75 67 2e 0a 2a 2f 0a  er to debug..*/.
2d050 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 47 65  static int winGe
2d060 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74  tLastError(sqlit
2d070 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
2d080 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
2d090 75 66 29 7b 0a 20 20 44 57 4f 52 44 20 65 20 3d  uf){.  DWORD e =
2d0a0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
2d0b0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2d0c0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 69  METER(pVfs);.  i
2d0d0 66 28 20 6e 42 75 66 3e 30 20 29 20 77 69 6e 47  f( nBuf>0 ) winG
2d0e0 65 74 4c 61 73 74 45 72 72 6f 72 4d 73 67 28 65  etLastErrorMsg(e
2d0f0 2c 20 6e 42 75 66 2c 20 7a 42 75 66 29 3b 0a 20  , nBuf, zBuf);. 
2d100 20 72 65 74 75 72 6e 20 65 3b 0a 7d 0a 0a 2f 2a   return e;.}../*
2d110 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
2d120 6e 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20  nd deinitialize 
2d130 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
2d140 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a  stem interface..
2d150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f  */.int sqlite3_o
2d160 73 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20  s_init(void){.  
2d170 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76  static sqlite3_v
2d180 66 73 20 77 69 6e 56 66 73 20 3d 20 7b 0a 20 20  fs winVfs = {.  
2d190 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
2d1a0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2d1b0 6f 6e 20 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66  on */.    sizeof
2d1c0 28 77 69 6e 46 69 6c 65 29 2c 20 20 20 20 20 2f  (winFile),     /
2d1d0 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20  * szOsFile */.  
2d1e0 20 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d    SQLITE_WIN32_M
2d1f0 41 58 5f 50 41 54 48 5f 42 59 54 45 53 2c 20 2f  AX_PATH_BYTES, /
2d200 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  * mxPathname */.
2d210 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20 20      0,          
2d220 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
2d230 74 20 2a 2f 0a 20 20 20 20 22 77 69 6e 33 32 22  t */.    "win32"
2d240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2d250 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c   zName */.    0,
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
2d280 2f 0a 20 20 20 20 77 69 6e 4f 70 65 6e 2c 20 20  /.    winOpen,  
2d290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f             /* xO
2d2a0 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e 44 65  pen */.    winDe
2d2b0 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
2d2c0 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
2d2d0 20 20 77 69 6e 41 63 63 65 73 73 2c 20 20 20 20    winAccess,    
2d2e0 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73         /* xAcces
2d2f0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 46 75 6c 6c  s */.    winFull
2d300 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 2f 2a  Pathname,     /*
2d310 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
2d320 2f 0a 20 20 20 20 77 69 6e 44 6c 4f 70 65 6e 2c  /.    winDlOpen,
2d330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2d340 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77 69 6e  lOpen */.    win
2d350 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
2d360 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
2d370 0a 20 20 20 20 77 69 6e 44 6c 53 79 6d 2c 20 20  .    winDlSym,  
2d380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
2d390 53 79 6d 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c  Sym */.    winDl
2d3a0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2d3b0 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
2d3c0 20 20 20 77 69 6e 52 61 6e 64 6f 6d 6e 65 73 73     winRandomness
2d3d0 2c 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64  ,       /* xRand
2d3e0 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 20 20 77 69  omness */.    wi
2d3f0 6e 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  nSleep,         
2d400 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
2d410 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2d420 6d 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72  me,      /* xCur
2d430 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20 20 20 20  rentTime */.    
2d440 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 2c  winGetLastError,
2d450 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
2d460 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e  Error */.    win
2d470 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
2d480 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
2d490 65 49 6e 74 36 34 20 2a 2f 0a 20 20 20 20 77 69  eInt64 */.    wi
2d4a0 6e 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20  nSetSystemCall, 
2d4b0 20 20 20 2f 2a 20 78 53 65 74 53 79 73 74 65 6d     /* xSetSystem
2d4c0 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 47  Call */.    winG
2d4d0 65 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20  etSystemCall,   
2d4e0 20 2f 2a 20 78 47 65 74 53 79 73 74 65 6d 43 61   /* xGetSystemCa
2d4f0 6c 6c 20 2a 2f 0a 20 20 20 20 77 69 6e 4e 65 78  ll */.    winNex
2d500 74 53 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 2f  tSystemCall,   /
2d510 2a 20 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  * xNextSystemCal
2d520 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69 66 20 64 65  l */.  };.#if de
2d530 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
2d540 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73  32_HAS_WIDE).  s
2d550 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
2d560 73 20 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73  s winLongPathVfs
2d570 20 3d 20 7b 0a 20 20 20 20 33 2c 20 20 20 20 20   = {.    3,     
2d580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d590 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20   iVersion */.   
2d5a0 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
2d5b0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
2d5c0 65 20 2a 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f  e */.    SQLITE_
2d5d0 57 49 4e 4e 54 5f 4d 41 58 5f 50 41 54 48 5f 42  WINNT_MAX_PATH_B
2d5e0 59 54 45 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e  YTES, /* mxPathn
2d5f0 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d610 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20  /* pNext */.    
2d620 22 77 69 6e 33 32 2d 6c 6f 6e 67 70 61 74 68 22  "win32-longpath"
2d630 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f  ,    /* zName */
2d640 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
2d650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
2d660 70 44 61 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e  pData */.    win
2d670 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  Open,           
2d680 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
2d690 20 20 77 69 6e 44 65 6c 65 74 65 2c 20 20 20 20    winDelete,    
2d6a0 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
2d6b0 65 20 2a 2f 0a 20 20 20 20 77 69 6e 41 63 63 65  e */.    winAcce
2d6c0 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ss,           /*
2d6d0 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20   xAccess */.    
2d6e0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  winFullPathname,
2d6f0 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
2d700 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e  hname */.    win
2d710 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20  DlOpen,         
2d720 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
2d730 20 20 20 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20      winDlError, 
2d740 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
2d750 72 72 6f 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44  rror */.    winD
2d760 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20  lSym,           
2d770 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
2d780 20 20 77 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20    winDlClose,   
2d790 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
2d7a0 73 65 20 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e  se */.    winRan
2d7b0 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 2f  domness,       /
2d7c0 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
2d7d0 0a 20 20 20 20 77 69 6e 53 6c 65 65 70 2c 20 20  .    winSleep,  
2d7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
2d7f0 65 65 70 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75  eep */.    winCu
2d800 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20 20  rrentTime,      
2d810 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
2d820 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 4c 61 73  */.    winGetLas
2d830 74 45 72 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78  tError,     /* x
2d840 47 65 74 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a  GetLastError */.
2d850 20 20 20 20 77 69 6e 43 75 72 72 65 6e 74 54 69      winCurrentTi
2d860 6d 65 49 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72  meInt64, /* xCur
2d870 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
2d880 0a 20 20 20 20 77 69 6e 53 65 74 53 79 73 74 65  .    winSetSyste
2d890 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65  mCall,    /* xSe
2d8a0 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20  tSystemCall */. 
2d8b0 20 20 20 77 69 6e 47 65 74 53 79 73 74 65 6d 43     winGetSystemC
2d8c0 61 6c 6c 2c 20 20 20 20 2f 2a 20 78 47 65 74 53  all,    /* xGetS
2d8d0 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20  ystemCall */.   
2d8e0 20 77 69 6e 4e 65 78 74 53 79 73 74 65 6d 43 61   winNextSystemCa
2d8f0 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65 78 74 53 79  ll,   /* xNextSy
2d900 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b  stemCall */.  };
2d910 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2d920 75 62 6c 65 2d 63 68 65 63 6b 20 74 68 61 74 20  uble-check that 
2d930 74 68 65 20 61 53 79 73 63 61 6c 6c 5b 5d 20 61  the aSyscall[] a
2d940 72 72 61 79 20 68 61 73 20 62 65 65 6e 20 63 6f  rray has been co
2d950 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 63  nstructed.  ** c
2d960 6f 72 72 65 63 74 6c 79 2e 20 20 53 65 65 20 74  orrectly.  See t
2d970 69 63 6b 65 74 20 5b 62 62 33 61 38 36 65 38 39  icket [bb3a86e89
2d980 30 63 38 65 39 36 61 62 5d 20 2a 2f 0a 20 20 61  0c8e96ab] */.  a
2d990 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
2d9a0 28 61 53 79 73 63 61 6c 6c 29 3d 3d 38 30 20 29  (aSyscall)==80 )
2d9b0 3b 0a 0a 20 20 2f 2a 20 67 65 74 20 6d 65 6d 6f  ;..  /* get memo
2d9c0 72 79 20 6d 61 70 20 61 6c 6c 6f 63 61 74 69 6f  ry map allocatio
2d9d0 6e 20 67 72 61 6e 75 6c 61 72 69 74 79 20 2a 2f  n granularity */
2d9e0 0a 20 20 6d 65 6d 73 65 74 28 26 77 69 6e 53 79  .  memset(&winSy
2d9f0 73 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  sInfo, 0, sizeof
2da00 28 53 59 53 54 45 4d 5f 49 4e 46 4f 29 29 3b 0a  (SYSTEM_INFO));.
2da10 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2da20 4e 52 54 0a 20 20 6f 73 47 65 74 4e 61 74 69 76  NRT.  osGetNativ
2da30 65 53 79 73 74 65 6d 49 6e 66 6f 28 26 77 69 6e  eSystemInfo(&win
2da40 53 79 73 49 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  SysInfo);.#else.
2da50 20 20 6f 73 47 65 74 53 79 73 74 65 6d 49 6e 66    osGetSystemInf
2da60 6f 28 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a  o(&winSysInfo);.
2da70 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
2da80 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77 41 6c   winSysInfo.dwAl
2da90 6c 6f 63 61 74 69 6f 6e 47 72 61 6e 75 6c 61 72  locationGranular
2daa0 69 74 79 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  ity>0 );.  asser
2dab0 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  t( winSysInfo.dw
2dac0 50 61 67 65 53 69 7a 65 3e 30 20 29 3b 0a 0a 20  PageSize>0 );.. 
2dad0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
2dae0 69 73 74 65 72 28 26 77 69 6e 56 66 73 2c 20 31  ister(&winVfs, 1
2daf0 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
2db00 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
2db10 5f 57 49 44 45 29 0a 20 20 73 71 6c 69 74 65 33  _WIDE).  sqlite3
2db20 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 77  _vfs_register(&w
2db30 69 6e 4c 6f 6e 67 50 61 74 68 56 66 73 2c 20 30  inLongPathVfs, 0
2db40 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74  );.#endif..  ret
2db50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2db60 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  ..int sqlite3_os
2db70 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 23 69 66 20  _end(void){.#if 
2db80 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
2db90 20 20 69 66 28 20 73 6c 65 65 70 4f 62 6a 21 3d    if( sleepObj!=
2dba0 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 6f 73 43 6c  NULL ){.    osCl
2dbb0 6f 73 65 48 61 6e 64 6c 65 28 73 6c 65 65 70 4f  oseHandle(sleepO
2dbc0 62 6a 29 3b 0a 20 20 20 20 73 6c 65 65 70 4f 62  bj);.    sleepOb
2dbd0 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 23 65  j = NULL;.  }.#e
2dbe0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
2dbf0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
2dc00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f  if /* SQLITE_OS_
2dc10 57 49 4e 20 2a 2f 0a                             WIN */.