/ Hex Artifact Content
Login

Artifact d4b8faf8896b65818e67070711fdd00d8e620bd6:


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 4d 75 74 65 78 41   = sqlite3MutexA
a290: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
a2a0: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
a2b0: 3b 20 29 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49  ; ).  MUTEX_LOGI
a2c0: 43 28 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65  C( pMem = sqlite
a2d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a2e0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a2f0: 4d 45 4d 29 3b 20 29 0a 20 20 73 71 6c 69 74 65  MEM); ).  sqlite
a300: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a310: 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65  aster);.  sqlite
a320: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
a330: 65 6d 29 3b 0a 20 20 77 69 6e 4d 65 6d 41 73 73  em);.  winMemAss
a340: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 69 66  ertMagic();.  if
a350: 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28  ( winMemGetHeap(
a360: 29 21 3d 4e 55 4c 4c 20 26 26 20 77 69 6e 4d 65  )!=NULL && winMe
a370: 6d 47 65 74 4f 77 6e 65 64 28 29 20 26 26 20 73  mGetOwned() && s
a380: 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79 5f 75 73  qlite3_memory_us
a390: 65 64 28 29 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ed()==0 ){.    /
a3a0: 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 73  *.    ** At this
a3b0: 20 70 6f 69 6e 74 2c 20 74 68 65 72 65 20 73 68   point, there sh
a3c0: 6f 75 6c 64 20 62 65 20 6e 6f 20 6f 75 74 73 74  ould be no outst
a3d0: 61 6e 64 69 6e 67 20 6d 65 6d 6f 72 79 20 61 6c  anding memory al
a3e0: 6c 6f 63 61 74 69 6f 6e 73 20 6f 6e 0a 20 20 20  locations on.   
a3f0: 20 2a 2a 20 74 68 65 20 68 65 61 70 2e 20 20 41   ** the heap.  A
a400: 6c 73 6f 2c 20 73 69 6e 63 65 20 62 6f 74 68 20  lso, since both 
a410: 74 68 65 20 6d 61 73 74 65 72 20 61 6e 64 20 6d  the master and m
a420: 65 6d 73 79 73 20 6c 6f 63 6b 73 20 61 72 65 20  emsys locks are 
a430: 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a  currently.    **
a440: 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20 75   being held by u
a450: 73 2c 20 6e 6f 20 6f 74 68 65 72 20 66 75 6e 63  s, no other func
a460: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 72 6f 6d 20  tion (i.e. from 
a470: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 29 20  another thread) 
a480: 73 68 6f 75 6c 64 0a 20 20 20 20 2a 2a 20 62 65  should.    ** be
a490: 20 61 62 6c 65 20 74 6f 20 65 76 65 6e 20 61 63   able to even ac
a4a0: 63 65 73 73 20 74 68 65 20 68 65 61 70 2e 20 20  cess the heap.  
a4b0: 41 74 74 65 6d 70 74 20 74 6f 20 64 65 73 74 72  Attempt to destr
a4c0: 6f 79 20 61 6e 64 20 72 65 63 72 65 61 74 65 20  oy and recreate 
a4d0: 6f 75 72 0a 20 20 20 20 2a 2a 20 69 73 6f 6c 61  our.    ** isola
a4e0: 74 65 64 20 57 69 6e 33 32 20 6e 61 74 69 76 65  ted Win32 native
a4f0: 20 68 65 61 70 20 6e 6f 77 2e 0a 20 20 20 20 2a   heap now..    *
a500: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 77 69  /.    assert( wi
a510: 6e 4d 65 6d 47 65 74 48 65 61 70 28 29 21 3d 4e  nMemGetHeap()!=N
a520: 55 4c 4c 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ULL );.    asser
a530: 74 28 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65  t( winMemGetOwne
a540: 64 28 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d() );.    asser
a550: 74 28 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72  t( sqlite3_memor
a560: 79 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20  y_used()==0 );. 
a570: 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f 77     winMemShutdow
a580: 6e 28 77 69 6e 4d 65 6d 47 65 74 44 61 74 61 50  n(winMemGetDataP
a590: 74 72 28 29 29 3b 0a 20 20 20 20 61 73 73 65 72  tr());.    asser
a5a0: 74 28 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70  t( winMemGetHeap
a5b0: 28 29 3d 3d 4e 55 4c 4c 20 29 3b 0a 20 20 20 20  ()==NULL );.    
a5c0: 61 73 73 65 72 74 28 20 21 77 69 6e 4d 65 6d 47  assert( !winMemG
a5d0: 65 74 4f 77 6e 65 64 28 29 20 29 3b 0a 20 20 20  etOwned() );.   
a5e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a5f0: 5f 6d 65 6d 6f 72 79 5f 75 73 65 64 28 29 3d 3d  _memory_used()==
a600: 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  0 );.    rc = wi
a610: 6e 4d 65 6d 49 6e 69 74 28 77 69 6e 4d 65 6d 47  nMemInit(winMemG
a620: 65 74 44 61 74 61 50 74 72 28 29 29 3b 0a 20 20  etDataPtr());.  
a630: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
a640: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 77 69 6e 4d 65  LITE_OK || winMe
a650: 6d 47 65 74 48 65 61 70 28 29 21 3d 4e 55 4c 4c  mGetHeap()!=NULL
a660: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
a670: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
a680: 20 77 69 6e 4d 65 6d 47 65 74 4f 77 6e 65 64 28   winMemGetOwned(
a690: 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
a6a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
a6b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 6f 72 79  | sqlite3_memory
a6c0: 5f 75 73 65 64 28 29 3d 3d 30 20 29 3b 0a 20 20  _used()==0 );.  
a6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 0a 20 20  }else{.    /*.  
a6e0: 20 20 2a 2a 20 54 68 65 20 57 69 6e 33 32 20 6e    ** The Win32 n
a6f0: 61 74 69 76 65 20 68 65 61 70 20 63 61 6e 6e 6f  ative heap canno
a700: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 62 65  t be modified be
a710: 63 61 75 73 65 20 69 74 20 6d 61 79 20 62 65 20  cause it may be 
a720: 69 6e 20 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  in use..    */. 
a730: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
a740: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
a750: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
a760: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Mem);.  sqlite3_
a770: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
a780: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
a790: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
a7a0: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c  QLITE_WIN32_MALL
a7b0: 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OC */../*.** Thi
a7c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 75 74 70 75  s function outpu
a7d0: 74 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ts the specified
a7e0: 20 28 41 4e 53 49 29 20 73 74 72 69 6e 67 20 74   (ANSI) string t
a7f0: 6f 20 74 68 65 20 57 69 6e 33 32 20 64 65 62 75  o the Win32 debu
a800: 67 67 65 72 0a 2a 2a 20 28 69 66 20 61 76 61 69  gger.** (if avai
a810: 6c 61 62 6c 65 29 2e 0a 2a 2f 0a 0a 76 6f 69 64  lable)..*/..void
a820: 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 77   sqlite3_win32_w
a830: 72 69 74 65 5f 64 65 62 75 67 28 63 6f 6e 73 74  rite_debug(const
a840: 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 69 6e 74   char *zBuf, int
a850: 20 6e 42 75 66 29 7b 0a 20 20 63 68 61 72 20 7a   nBuf){.  char z
a860: 44 62 67 42 75 66 5b 53 51 4c 49 54 45 5f 57 49  DbgBuf[SQLITE_WI
a870: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
a880: 5d 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  ];.  int nMin = 
a890: 4d 49 4e 28 6e 42 75 66 2c 20 28 53 51 4c 49 54  MIN(nBuf, (SQLIT
a8a0: 45 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f  E_WIN32_DBG_BUF_
a8b0: 53 49 5a 45 20 2d 20 31 29 29 3b 20 2f 2a 20 6d  SIZE - 1)); /* m
a8c0: 61 79 20 62 65 20 6e 65 67 61 74 69 76 65 2e 20  ay be negative. 
a8d0: 2a 2f 0a 20 20 69 66 28 20 6e 4d 69 6e 3c 2d 31  */.  if( nMin<-1
a8e0: 20 29 20 6e 4d 69 6e 20 3d 20 2d 31 3b 20 2f 2a   ) nMin = -1; /*
a8f0: 20 61 6c 6c 20 6e 65 67 61 74 69 76 65 20 76 61   all negative va
a900: 6c 75 65 73 20 62 65 63 6f 6d 65 20 2d 31 2e 20  lues become -1. 
a910: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 69  */.  assert( nMi
a920: 6e 3d 3d 2d 31 20 7c 7c 20 6e 4d 69 6e 3d 3d 30  n==-1 || nMin==0
a930: 20 7c 7c 20 6e 4d 69 6e 3c 53 51 4c 49 54 45 5f   || nMin<SQLITE_
a940: 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49  WIN32_DBG_BUF_SI
a950: 5a 45 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  ZE );.#ifdef SQL
a960: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
a970: 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 42 75 66  RMOR.  if( !zBuf
a980: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
a990: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
a9a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
a9b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
a9c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
a9d0: 32 5f 48 41 53 5f 41 4e 53 49 29 0a 20 20 69 66  2_HAS_ANSI).  if
a9e0: 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a 20 20 20 20  ( nMin>0 ){.    
a9f0: 6d 65 6d 73 65 74 28 7a 44 62 67 42 75 66 2c 20  memset(zDbgBuf, 
aa00: 30 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  0, SQLITE_WIN32_
aa10: 44 42 47 5f 42 55 46 5f 53 49 5a 45 29 3b 0a 20  DBG_BUF_SIZE);. 
aa20: 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 67 42 75     memcpy(zDbgBu
aa30: 66 2c 20 7a 42 75 66 2c 20 6e 4d 69 6e 29 3b 0a  f, zBuf, nMin);.
aa40: 20 20 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75      osOutputDebu
aa50: 67 53 74 72 69 6e 67 41 28 7a 44 62 67 42 75 66  gStringA(zDbgBuf
aa60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aa70: 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53 74 72  osOutputDebugStr
aa80: 69 6e 67 41 28 7a 42 75 66 29 3b 0a 20 20 7d 0a  ingA(zBuf);.  }.
aa90: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
aaa0: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 57  LITE_WIN32_HAS_W
aab0: 49 44 45 29 0a 20 20 6d 65 6d 73 65 74 28 7a 44  IDE).  memset(zD
aac0: 62 67 42 75 66 2c 20 30 2c 20 53 51 4c 49 54 45  bgBuf, 0, SQLITE
aad0: 5f 57 49 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53  _WIN32_DBG_BUF_S
aae0: 49 5a 45 29 3b 0a 20 20 69 66 20 28 20 6f 73 4d  IZE);.  if ( osM
aaf0: 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65 43 68  ultiByteToWideCh
ab00: 61 72 28 0a 20 20 20 20 20 20 20 20 20 20 6f 73  ar(.          os
ab10: 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49 28  AreFileApisANSI(
ab20: 29 20 3f 20 43 50 5f 41 43 50 20 3a 20 43 50 5f  ) ? CP_ACP : CP_
ab30: 4f 45 4d 43 50 2c 20 30 2c 20 7a 42 75 66 2c 0a  OEMCP, 0, zBuf,.
ab40: 20 20 20 20 20 20 20 20 20 20 6e 4d 69 6e 2c 20            nMin, 
ab50: 28 4c 50 57 53 54 52 29 7a 44 62 67 42 75 66 2c  (LPWSTR)zDbgBuf,
ab60: 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 44 42   SQLITE_WIN32_DB
ab70: 47 5f 42 55 46 5f 53 49 5a 45 2f 73 69 7a 65 6f  G_BUF_SIZE/sizeo
ab80: 66 28 57 43 48 41 52 29 29 3c 3d 30 20 29 7b 0a  f(WCHAR))<=0 ){.
ab90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
aba0: 20 20 6f 73 4f 75 74 70 75 74 44 65 62 75 67 53    osOutputDebugS
abb0: 74 72 69 6e 67 57 28 28 4c 50 43 57 53 54 52 29  tringW((LPCWSTR)
abc0: 7a 44 62 67 42 75 66 29 3b 0a 23 65 6c 73 65 0a  zDbgBuf);.#else.
abd0: 20 20 69 66 28 20 6e 4d 69 6e 3e 30 20 29 7b 0a    if( nMin>0 ){.
abe0: 20 20 20 20 6d 65 6d 73 65 74 28 7a 44 62 67 42      memset(zDbgB
abf0: 75 66 2c 20 30 2c 20 53 51 4c 49 54 45 5f 57 49  uf, 0, SQLITE_WI
ac00: 4e 33 32 5f 44 42 47 5f 42 55 46 5f 53 49 5a 45  N32_DBG_BUF_SIZE
ac10: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44  );.    memcpy(zD
ac20: 62 67 42 75 66 2c 20 7a 42 75 66 2c 20 6e 4d 69  bgBuf, zBuf, nMi
ac30: 6e 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  n);.    fprintf(
ac40: 73 74 64 65 72 72 2c 20 22 25 73 22 2c 20 7a 44  stderr, "%s", zD
ac50: 62 67 42 75 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  bgBuf);.  }else{
ac60: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
ac70: 65 72 72 2c 20 22 25 73 22 2c 20 7a 42 75 66 29  err, "%s", zBuf)
ac80: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
ac90: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
aca0: 69 6e 67 20 72 6f 75 74 69 6e 65 20 73 75 73 70  ing routine susp
acb0: 65 6e 64 73 20 74 68 65 20 63 75 72 72 65 6e 74  ends the current
acc0: 20 74 68 72 65 61 64 20 66 6f 72 20 61 74 20 6c   thread for at l
acd0: 65 61 73 74 20 6d 73 0a 2a 2a 20 6d 69 6c 6c 69  east ms.** milli
ace0: 73 65 63 6f 6e 64 73 2e 20 20 54 68 69 73 20 69  seconds.  This i
acf0: 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  s equivalent to 
ad00: 74 68 65 20 57 69 6e 33 32 20 53 6c 65 65 70 28  the Win32 Sleep(
ad10: 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  ) interface..*/.
ad20: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
ad30: 4e 52 54 0a 73 74 61 74 69 63 20 48 41 4e 44 4c  NRT.static HANDL
ad40: 45 20 73 6c 65 65 70 4f 62 6a 20 3d 20 4e 55 4c  E sleepObj = NUL
ad50: 4c 3b 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 20  L;.#endif..void 
ad60: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c  sqlite3_win32_sl
ad70: 65 65 70 28 44 57 4f 52 44 20 6d 69 6c 6c 69 73  eep(DWORD millis
ad80: 65 63 6f 6e 64 73 29 7b 0a 23 69 66 20 53 51 4c  econds){.#if SQL
ad90: 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69  ITE_OS_WINRT.  i
ada0: 66 20 28 20 73 6c 65 65 70 4f 62 6a 3d 3d 4e 55  f ( sleepObj==NU
adb0: 4c 4c 20 29 7b 0a 20 20 20 20 73 6c 65 65 70 4f  LL ){.    sleepO
adc0: 62 6a 20 3d 20 6f 73 43 72 65 61 74 65 45 76 65  bj = osCreateEve
add0: 6e 74 45 78 57 28 4e 55 4c 4c 2c 20 4e 55 4c 4c  ntExW(NULL, NULL
ade0: 2c 20 43 52 45 41 54 45 5f 45 56 45 4e 54 5f 4d  , CREATE_EVENT_M
adf0: 41 4e 55 41 4c 5f 52 45 53 45 54 2c 0a 20 20 20  ANUAL_RESET,.   
ae00: 20 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 53 59 4e               SYN
ae20: 43 48 52 4f 4e 49 5a 45 29 3b 0a 20 20 7d 0a 20  CHRONIZE);.  }. 
ae30: 20 61 73 73 65 72 74 28 20 73 6c 65 65 70 4f 62   assert( sleepOb
ae40: 6a 21 3d 4e 55 4c 4c 20 29 3b 0a 20 20 6f 73 57  j!=NULL );.  osW
ae50: 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65  aitForSingleObje
ae60: 63 74 45 78 28 73 6c 65 65 70 4f 62 6a 2c 20 6d  ctEx(sleepObj, m
ae70: 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 46 41 4c  illiseconds, FAL
ae80: 53 45 29 3b 0a 23 65 6c 73 65 0a 20 20 6f 73 53  SE);.#else.  osS
ae90: 6c 65 65 70 28 6d 69 6c 6c 69 73 65 63 6f 6e 64  leep(millisecond
aea0: 73 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69  s);.#endif.}..#i
aeb0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  f SQLITE_MAX_WOR
aec0: 4b 45 52 5f 54 48 52 45 41 44 53 3e 30 20 26 26  KER_THREADS>0 &&
aed0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43   !SQLITE_OS_WINC
aee0: 45 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f  E && !SQLITE_OS_
aef0: 57 49 4e 52 54 20 26 26 20 5c 0a 20 20 20 20 20  WINRT && \.     
af00: 20 20 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44     SQLITE_THREAD
af10: 53 41 46 45 3e 30 0a 44 57 4f 52 44 20 73 71 6c  SAFE>0.DWORD sql
af20: 69 74 65 33 57 69 6e 33 32 57 61 69 74 28 48 41  ite3Win32Wait(HA
af30: 4e 44 4c 45 20 68 4f 62 6a 65 63 74 29 7b 0a 20  NDLE hObject){. 
af40: 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 77 68 69   DWORD rc;.  whi
af50: 6c 65 28 20 28 72 63 20 3d 20 6f 73 57 61 69 74  le( (rc = osWait
af60: 46 6f 72 53 69 6e 67 6c 65 4f 62 6a 65 63 74 45  ForSingleObjectE
af70: 78 28 68 4f 62 6a 65 63 74 2c 20 49 4e 46 49 4e  x(hObject, INFIN
af80: 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ITE,.           
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 54 52 55 45              TRUE
afb0: 29 29 3d 3d 57 41 49 54 5f 49 4f 5f 43 4f 4d 50  ))==WAIT_IO_COMP
afc0: 4c 45 54 49 4f 4e 20 29 7b 7d 0a 20 20 72 65 74  LETION ){}.  ret
afd0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
afe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
aff0: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
b000: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
b010: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
b020: 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a 2a 2a 20 6f  n2K, WinXP,.** o
b030: 72 20 57 69 6e 43 45 2e 20 20 52 65 74 75 72 6e  r WinCE.  Return
b040: 20 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f   false (zero) fo
b050: 72 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20  r Win95, Win98, 
b060: 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20  or WinME..**.** 
b070: 48 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72  Here is an inter
b080: 65 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69  esting observati
b090: 6f 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39  on:  Win95, Win9
b0a0: 38 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63  8, and WinME lac
b0b0: 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c  k.** the LockFil
b0c0: 65 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20  eEx() API.  But 
b0d0: 77 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61  we can still sta
b0e0: 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61  tically link aga
b0f0: 69 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49  inst that.** API
b100: 20 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64   as long as we d
b110: 6f 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 68 65  on't call it whe
b120: 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f  n running Win95/
b130: 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74  98/ME.  A call t
b140: 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
b150: 65 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 74  e is used to det
b160: 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f  ermine if the ho
b170: 73 74 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d  st is Win95/98/M
b180: 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b  E or.** WinNT/2K
b190: 2f 58 50 20 73 6f 20 74 68 61 74 20 77 65 20 77  /XP so that we w
b1a0: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72  ill know whether
b1b0: 20 6f 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73   or not we can s
b1c0: 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68  afely call.** th
b1d0: 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41  e LockFileEx() A
b1e0: 50 49 2e 0a 2a 2f 0a 0a 23 69 66 20 21 53 51 4c  PI..*/..#if !SQL
b1f0: 49 54 45 5f 57 49 4e 33 32 5f 47 45 54 56 45 52  ITE_WIN32_GETVER
b200: 53 49 4f 4e 45 58 0a 23 20 64 65 66 69 6e 65 20  SIONEX.# define 
b210: 6f 73 49 73 4e 54 28 29 20 20 28 31 29 0a 23 65  osIsNT()  (1).#e
b220: 6c 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  lif SQLITE_OS_WI
b230: 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 53  NCE || SQLITE_OS
b240: 5f 57 49 4e 52 54 20 7c 7c 20 21 64 65 66 69 6e  _WINRT || !defin
b250: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
b260: 48 41 53 5f 41 4e 53 49 29 0a 23 20 64 65 66 69  HAS_ANSI).# defi
b270: 6e 65 20 6f 73 49 73 4e 54 28 29 20 20 28 31 29  ne osIsNT()  (1)
b280: 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65 64 28  .#elif !defined(
b290: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
b2a0: 5f 57 49 44 45 29 0a 23 20 64 65 66 69 6e 65 20  _WIDE).# define 
b2b0: 6f 73 49 73 4e 54 28 29 20 20 28 30 29 0a 23 65  osIsNT()  (0).#e
b2c0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 6f 73 49  lse.# define osI
b2d0: 73 4e 54 28 29 20 20 28 28 73 71 6c 69 74 65 33  sNT()  ((sqlite3
b2e0: 5f 6f 73 5f 74 79 70 65 3d 3d 32 29 20 7c 7c 20  _os_type==2) || 
b2f0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73  sqlite3_win32_is
b300: 5f 6e 74 28 29 29 0a 23 65 6e 64 69 66 0a 0a 2f  _nt()).#endif../
b310: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
b320: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
b330: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 69 73 20   the machine is 
b340: 72 75 6e 6e 69 6e 67 20 61 20 76 65 72 73 69 6f  running a versio
b350: 6e 20 6f 66 20 57 69 6e 64 6f 77 73 0a 2a 2a 20  n of Windows.** 
b360: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 4e 54 20  based on the NT 
b370: 6b 65 72 6e 65 6c 2e 0a 2a 2f 0a 69 6e 74 20 73  kernel..*/.int s
b380: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 69 73 5f  qlite3_win32_is_
b390: 6e 74 28 76 6f 69 64 29 7b 0a 23 69 66 20 53 51  nt(void){.#if SQ
b3a0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20  LITE_OS_WINRT.  
b3b0: 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45 3a 20 54 68  /*.  ** NOTE: Th
b3c0: 65 20 57 69 6e 52 54 20 73 75 62 2d 70 6c 61 74  e WinRT sub-plat
b3d0: 66 6f 72 6d 20 69 73 20 61 6c 77 61 79 73 20 61  form is always a
b3e0: 73 73 75 6d 65 64 20 74 6f 20 62 65 20 62 61 73  ssumed to be bas
b3f0: 65 64 20 6f 6e 20 74 68 65 20 4e 54 0a 20 20 2a  ed on the NT.  *
b400: 2a 20 20 20 20 20 20 20 6b 65 72 6e 65 6c 2e 0a  *       kernel..
b410: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b    */.  return 1;
b420: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 57 49  .#elif SQLITE_WI
b430: 4e 33 32 5f 47 45 54 56 45 52 53 49 4f 4e 45 58  N32_GETVERSIONEX
b440: 0a 20 20 69 66 28 20 6f 73 49 6e 74 65 72 6c 6f  .  if( osInterlo
b450: 63 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61  ckedCompareExcha
b460: 6e 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f  nge(&sqlite3_os_
b470: 74 79 70 65 2c 20 30 2c 20 30 29 3d 3d 30 20 29  type, 0, 0)==0 )
b480: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
b490: 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
b4a0: 4e 53 49 29 0a 20 20 20 20 4f 53 56 45 52 53 49  NSI).    OSVERSI
b4b0: 4f 4e 49 4e 46 4f 41 20 73 49 6e 66 6f 3b 0a 20  ONINFOA sInfo;. 
b4c0: 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72     sInfo.dwOSVer
b4d0: 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73  sionInfoSize = s
b4e0: 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20  izeof(sInfo);.  
b4f0: 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45 78    osGetVersionEx
b500: 41 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20 6f  A(&sInfo);.    o
b510: 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d 70  sInterlockedComp
b520: 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71 6c  areExchange(&sql
b530: 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20 20  ite3_os_type,.  
b540: 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77 50        (sInfo.dwP
b550: 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45 52  latformId == VER
b560: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
b570: 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29 3b  NT) ? 2 : 1, 0);
b580: 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
b590: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f  QLITE_WIN32_HAS_
b5a0: 57 49 44 45 29 0a 20 20 20 20 4f 53 56 45 52 53  WIDE).    OSVERS
b5b0: 49 4f 4e 49 4e 46 4f 57 20 73 49 6e 66 6f 3b 0a  IONINFOW sInfo;.
b5c0: 20 20 20 20 73 49 6e 66 6f 2e 64 77 4f 53 56 65      sInfo.dwOSVe
b5d0: 72 73 69 6f 6e 49 6e 66 6f 53 69 7a 65 20 3d 20  rsionInfoSize = 
b5e0: 73 69 7a 65 6f 66 28 73 49 6e 66 6f 29 3b 0a 20  sizeof(sInfo);. 
b5f0: 20 20 20 6f 73 47 65 74 56 65 72 73 69 6f 6e 45     osGetVersionE
b600: 78 57 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20 20  xW(&sInfo);.    
b610: 6f 73 49 6e 74 65 72 6c 6f 63 6b 65 64 43 6f 6d  osInterlockedCom
b620: 70 61 72 65 45 78 63 68 61 6e 67 65 28 26 73 71  pareExchange(&sq
b630: 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 2c 0a 20  lite3_os_type,. 
b640: 20 20 20 20 20 20 20 28 73 49 6e 66 6f 2e 64 77         (sInfo.dw
b650: 50 6c 61 74 66 6f 72 6d 49 64 20 3d 3d 20 56 45  PlatformId == VE
b660: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
b670: 5f 4e 54 29 20 3f 20 32 20 3a 20 31 2c 20 30 29  _NT) ? 2 : 1, 0)
b680: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
b690: 65 74 75 72 6e 20 6f 73 49 6e 74 65 72 6c 6f 63  eturn osInterloc
b6a0: 6b 65 64 43 6f 6d 70 61 72 65 45 78 63 68 61 6e  kedCompareExchan
b6b0: 67 65 28 26 73 71 6c 69 74 65 33 5f 6f 73 5f 74  ge(&sqlite3_os_t
b6c0: 79 70 65 2c 20 32 2c 20 32 29 3d 3d 32 3b 0a 23  ype, 2, 2)==2;.#
b6d0: 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 45 53 54  elif SQLITE_TEST
b6e0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 49 6e 74 65  .  return osInte
b6f0: 72 6c 6f 63 6b 65 64 43 6f 6d 70 61 72 65 45 78  rlockedCompareEx
b700: 63 68 61 6e 67 65 28 26 73 71 6c 69 74 65 33 5f  change(&sqlite3_
b710: 6f 73 5f 74 79 70 65 2c 20 32 2c 20 32 29 3d 3d  os_type, 2, 2)==
b720: 32 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20 20  2;.#else.  /*.  
b730: 2a 2a 20 4e 4f 54 45 3a 20 41 6c 6c 20 73 75 62  ** NOTE: All sub
b740: 2d 70 6c 61 74 66 6f 72 6d 73 20 77 68 65 72 65  -platforms where
b750: 20 74 68 65 20 47 65 74 56 65 72 73 69 6f 6e 45   the GetVersionE
b760: 78 5b 41 57 5d 20 66 75 6e 63 74 69 6f 6e 73 20  x[AW] functions 
b770: 61 72 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 64  are.  **       d
b780: 65 70 72 65 63 61 74 65 64 20 61 72 65 20 61 6c  eprecated are al
b790: 77 61 79 73 20 61 73 73 75 6d 65 64 20 74 6f 20  ways assumed to 
b7a0: 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  be based on the 
b7b0: 4e 54 20 6b 65 72 6e 65 6c 2e 0a 20 20 2a 2f 0a  NT kernel..  */.
b7c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
b7d0: 69 66 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  if.}..#ifdef SQL
b7e0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
b7f0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
b800: 6e 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79  nBytes of memory
b810: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b820: 20 2a 77 69 6e 4d 65 6d 4d 61 6c 6c 6f 63 28 69   *winMemMalloc(i
b830: 6e 74 20 6e 42 79 74 65 73 29 7b 0a 20 20 48 41  nt nBytes){.  HA
b840: 4e 44 4c 45 20 68 48 65 61 70 3b 0a 20 20 76 6f  NDLE hHeap;.  vo
b850: 69 64 20 2a 70 3b 0a 0a 20 20 77 69 6e 4d 65 6d  id *p;..  winMem
b860: 41 73 73 65 72 74 4d 61 67 69 63 28 29 3b 0a 20  AssertMagic();. 
b870: 20 68 48 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47   hHeap = winMemG
b880: 65 74 48 65 61 70 28 29 3b 0a 20 20 61 73 73 65  etHeap();.  asse
b890: 72 74 28 20 68 48 65 61 70 21 3d 30 20 29 3b 0a  rt( hHeap!=0 );.
b8a0: 20 20 61 73 73 65 72 74 28 20 68 48 65 61 70 21    assert( hHeap!
b8b0: 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
b8c0: 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21 53 51  VALUE );.#if !SQ
b8d0: 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26  LITE_OS_WINRT &&
b8e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
b8f0: 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c  WIN32_MALLOC_VAL
b900: 49 44 41 54 45 29 0a 20 20 61 73 73 65 72 74 28  IDATE).  assert(
b910: 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74 65 28   osHeapValidate(
b920: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
b930: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
b940: 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a  NULL) );.#endif.
b950: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 73    assert( nBytes
b960: 3e 3d 30 20 29 3b 0a 20 20 70 20 3d 20 6f 73 48  >=0 );.  p = osH
b970: 65 61 70 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20  eapAlloc(hHeap, 
b980: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
b990: 50 5f 46 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54  P_FLAGS, (SIZE_T
b9a0: 29 6e 42 79 74 65 73 29 3b 0a 20 20 69 66 28 20  )nBytes);.  if( 
b9b0: 21 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  !p ){.    sqlite
b9c0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d  3_log(SQLITE_NOM
b9d0: 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48  EM, "failed to H
b9e0: 65 61 70 41 6c 6c 6f 63 20 25 75 20 62 79 74 65  eapAlloc %u byte
b9f0: 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25 70  s (%lu), heap=%p
ba00: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ba10: 20 20 20 6e 42 79 74 65 73 2c 20 6f 73 47 65 74     nBytes, osGet
ba20: 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f  LastError(), (vo
ba30: 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d 0a  id*)hHeap);.  }.
ba40: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
ba50: 2a 0a 2a 2a 20 46 72 65 65 20 6d 65 6d 6f 72 79  *.** Free memory
ba60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ba70: 20 77 69 6e 4d 65 6d 46 72 65 65 28 76 6f 69 64   winMemFree(void
ba80: 20 2a 70 50 72 69 6f 72 29 7b 0a 20 20 48 41 4e   *pPrior){.  HAN
ba90: 44 4c 45 20 68 48 65 61 70 3b 0a 0a 20 20 77 69  DLE hHeap;..  wi
baa0: 6e 4d 65 6d 41 73 73 65 72 74 4d 61 67 69 63 28  nMemAssertMagic(
bab0: 29 3b 0a 20 20 68 48 65 61 70 20 3d 20 77 69 6e  );.  hHeap = win
bac0: 4d 65 6d 47 65 74 48 65 61 70 28 29 3b 0a 20 20  MemGetHeap();.  
bad0: 61 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 30  assert( hHeap!=0
bae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48   );.  assert( hH
baf0: 65 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  eap!=INVALID_HAN
bb00: 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66  DLE_VALUE );.#if
bb10: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
bb20: 54 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  T && defined(SQL
bb30: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43  ITE_WIN32_MALLOC
bb40: 5f 56 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73  _VALIDATE).  ass
bb50: 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64  ert( osHeapValid
bb60: 61 74 65 28 68 48 65 61 70 2c 20 53 51 4c 49 54  ate(hHeap, SQLIT
bb70: 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41  E_WIN32_HEAP_FLA
bb80: 47 53 2c 20 70 50 72 69 6f 72 29 20 29 3b 0a 23  GS, pPrior) );.#
bb90: 65 6e 64 69 66 0a 20 20 69 66 28 20 21 70 50 72  endif.  if( !pPr
bba0: 69 6f 72 20 29 20 72 65 74 75 72 6e 3b 20 2f 2a  ior ) return; /*
bbb0: 20 50 61 73 73 69 6e 67 20 4e 55 4c 4c 20 74 6f   Passing NULL to
bbc0: 20 48 65 61 70 46 72 65 65 20 69 73 20 75 6e 64   HeapFree is und
bbd0: 65 66 69 6e 65 64 2e 20 2a 2f 0a 20 20 69 66 28  efined. */.  if(
bbe0: 20 21 6f 73 48 65 61 70 46 72 65 65 28 68 48 65   !osHeapFree(hHe
bbf0: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
bc00: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 50 72  _HEAP_FLAGS, pPr
bc10: 69 6f 72 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ior) ){.    sqli
bc20: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e  te3_log(SQLITE_N
bc30: 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f  OMEM, "failed to
bc40: 20 48 65 61 70 46 72 65 65 20 62 6c 6f 63 6b 20   HeapFree block 
bc50: 25 70 20 28 25 6c 75 29 2c 20 68 65 61 70 3d 25  %p (%lu), heap=%
bc60: 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  p",.            
bc70: 20 20 20 20 70 50 72 69 6f 72 2c 20 6f 73 47 65      pPrior, osGe
bc80: 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76  tLastError(), (v
bc90: 6f 69 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 7d  oid*)hHeap);.  }
bca0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
bcb0: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61 6e 20   the size of an 
bcc0: 65 78 69 73 74 69 6e 67 20 6d 65 6d 6f 72 79 20  existing memory 
bcd0: 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74  allocation.*/.st
bce0: 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 4d 65  atic void *winMe
bcf0: 6d 52 65 61 6c 6c 6f 63 28 76 6f 69 64 20 2a 70  mRealloc(void *p
bd00: 50 72 69 6f 72 2c 20 69 6e 74 20 6e 42 79 74 65  Prior, int nByte
bd10: 73 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 48 65  s){.  HANDLE hHe
bd20: 61 70 3b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 0a  ap;.  void *p;..
bd30: 20 20 77 69 6e 4d 65 6d 41 73 73 65 72 74 4d 61    winMemAssertMa
bd40: 67 69 63 28 29 3b 0a 20 20 68 48 65 61 70 20 3d  gic();.  hHeap =
bd50: 20 77 69 6e 4d 65 6d 47 65 74 48 65 61 70 28 29   winMemGetHeap()
bd60: 3b 0a 20 20 61 73 73 65 72 74 28 20 68 48 65 61  ;.  assert( hHea
bd70: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
bd80: 28 20 68 48 65 61 70 21 3d 49 4e 56 41 4c 49 44  ( hHeap!=INVALID
bd90: 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b  _HANDLE_VALUE );
bda0: 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f  .#if !SQLITE_OS_
bdb0: 57 49 4e 52 54 20 26 26 20 64 65 66 69 6e 65 64  WINRT && defined
bdc0: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
bdd0: 4c 4c 4f 43 5f 56 41 4c 49 44 41 54 45 29 0a 20  LLOC_VALIDATE). 
bde0: 20 61 73 73 65 72 74 28 20 6f 73 48 65 61 70 56   assert( osHeapV
bdf0: 61 6c 69 64 61 74 65 28 68 48 65 61 70 2c 20 53  alidate(hHeap, S
be00: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50  QLITE_WIN32_HEAP
be10: 5f 46 4c 41 47 53 2c 20 70 50 72 69 6f 72 29 20  _FLAGS, pPrior) 
be20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  );.#endif.  asse
be30: 72 74 28 20 6e 42 79 74 65 73 3e 3d 30 20 29 3b  rt( nBytes>=0 );
be40: 0a 20 20 69 66 28 20 21 70 50 72 69 6f 72 20 29  .  if( !pPrior )
be50: 7b 0a 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70  {.    p = osHeap
be60: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
be70: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
be80: 4c 41 47 53 2c 20 28 53 49 5a 45 5f 54 29 6e 42  LAGS, (SIZE_T)nB
be90: 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ytes);.  }else{.
bea0: 20 20 20 20 70 20 3d 20 6f 73 48 65 61 70 52 65      p = osHeapRe
beb0: 41 6c 6c 6f 63 28 68 48 65 61 70 2c 20 53 51 4c  Alloc(hHeap, SQL
bec0: 49 54 45 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46  ITE_WIN32_HEAP_F
bed0: 4c 41 47 53 2c 20 70 50 72 69 6f 72 2c 20 28 53  LAGS, pPrior, (S
bee0: 49 5a 45 5f 54 29 6e 42 79 74 65 73 29 3b 0a 20  IZE_T)nBytes);. 
bef0: 20 7d 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20   }.  if( !p ){. 
bf00: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
bf10: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61  QLITE_NOMEM, "fa
bf20: 69 6c 65 64 20 74 6f 20 25 73 20 25 75 20 62 79  iled to %s %u by
bf30: 74 65 73 20 28 25 6c 75 29 2c 20 68 65 61 70 3d  tes (%lu), heap=
bf40: 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %p",.           
bf50: 20 20 20 20 20 70 50 72 69 6f 72 20 3f 20 22 48       pPrior ? "H
bf60: 65 61 70 52 65 41 6c 6c 6f 63 22 20 3a 20 22 48  eapReAlloc" : "H
bf70: 65 61 70 41 6c 6c 6f 63 22 2c 20 6e 42 79 74 65  eapAlloc", nByte
bf80: 73 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  s, osGetLastErro
bf90: 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
bfa0: 20 20 20 20 20 28 76 6f 69 64 2a 29 68 48 65 61       (void*)hHea
bfb0: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
bfc0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   p;.}../*.** Ret
bfd0: 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
bfe0: 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 61  an outstanding a
bff0: 6c 6c 6f 63 61 74 69 6f 6e 2c 20 69 6e 20 62 79  llocation, in by
c000: 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tes..*/.static i
c010: 6e 74 20 77 69 6e 4d 65 6d 53 69 7a 65 28 76 6f  nt winMemSize(vo
c020: 69 64 20 2a 70 29 7b 0a 20 20 48 41 4e 44 4c 45  id *p){.  HANDLE
c030: 20 68 48 65 61 70 3b 0a 20 20 53 49 5a 45 5f 54   hHeap;.  SIZE_T
c040: 20 6e 3b 0a 0a 20 20 77 69 6e 4d 65 6d 41 73 73   n;..  winMemAss
c050: 65 72 74 4d 61 67 69 63 28 29 3b 0a 20 20 68 48  ertMagic();.  hH
c060: 65 61 70 20 3d 20 77 69 6e 4d 65 6d 47 65 74 48  eap = winMemGetH
c070: 65 61 70 28 29 3b 0a 20 20 61 73 73 65 72 74 28  eap();.  assert(
c080: 20 68 48 65 61 70 21 3d 30 20 29 3b 0a 20 20 61   hHeap!=0 );.  a
c090: 73 73 65 72 74 28 20 68 48 65 61 70 21 3d 49 4e  ssert( hHeap!=IN
c0a0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
c0b0: 55 45 20 29 3b 0a 23 69 66 20 21 53 51 4c 49 54  UE );.#if !SQLIT
c0c0: 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 64 65  E_OS_WINRT && de
c0d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
c0e0: 33 32 5f 4d 41 4c 4c 4f 43 5f 56 41 4c 49 44 41  32_MALLOC_VALIDA
c0f0: 54 45 29 0a 20 20 61 73 73 65 72 74 28 20 6f 73  TE).  assert( os
c100: 48 65 61 70 56 61 6c 69 64 61 74 65 28 68 48 65  HeapValidate(hHe
c110: 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ap, SQLITE_WIN32
c120: 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 70 29 20  _HEAP_FLAGS, p) 
c130: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
c140: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
c150: 20 6e 20 3d 20 6f 73 48 65 61 70 53 69 7a 65 28   n = osHeapSize(
c160: 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49  hHeap, SQLITE_WI
c170: 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20  N32_HEAP_FLAGS, 
c180: 70 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 28 53 49  p);.  if( n==(SI
c190: 5a 45 5f 54 29 2d 31 20 29 7b 0a 20 20 20 20 73  ZE_T)-1 ){.    s
c1a0: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
c1b0: 45 5f 4e 4f 4d 45 4d 2c 20 22 66 61 69 6c 65 64  E_NOMEM, "failed
c1c0: 20 74 6f 20 48 65 61 70 53 69 7a 65 20 62 6c 6f   to HeapSize blo
c1d0: 63 6b 20 25 70 20 28 25 6c 75 29 2c 20 68 65 61  ck %p (%lu), hea
c1e0: 70 3d 25 70 22 2c 0a 20 20 20 20 20 20 20 20 20  p=%p",.         
c1f0: 20 20 20 20 20 20 20 70 2c 20 6f 73 47 65 74 4c         p, osGetL
c200: 61 73 74 45 72 72 6f 72 28 29 2c 20 28 76 6f 69  astError(), (voi
c210: 64 2a 29 68 48 65 61 70 29 3b 0a 20 20 20 20 72  d*)hHeap);.    r
c220: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
c230: 65 74 75 72 6e 20 28 69 6e 74 29 6e 3b 0a 7d 0a  eturn (int)n;.}.
c240: 0a 2f 2a 0a 2a 2a 20 52 6f 75 6e 64 20 75 70 20  ./*.** Round up 
c250: 61 20 72 65 71 75 65 73 74 20 73 69 7a 65 20 74  a request size t
c260: 6f 20 74 68 65 20 6e 65 78 74 20 76 61 6c 69 64  o the next valid
c270: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 69 7a 65   allocation size
c280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c290: 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 28 69 6e  winMemRoundup(in
c2a0: 74 20 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 6e  t n){.  return n
c2b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
c2c0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
c2d0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
c2e0: 20 77 69 6e 4d 65 6d 49 6e 69 74 28 76 6f 69 64   winMemInit(void
c2f0: 20 2a 70 41 70 70 44 61 74 61 29 7b 0a 20 20 77   *pAppData){.  w
c300: 69 6e 4d 65 6d 44 61 74 61 20 2a 70 57 69 6e 4d  inMemData *pWinM
c310: 65 6d 44 61 74 61 20 3d 20 28 77 69 6e 4d 65 6d  emData = (winMem
c320: 44 61 74 61 20 2a 29 70 41 70 70 44 61 74 61 3b  Data *)pAppData;
c330: 0a 0a 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d  ..  if( !pWinMem
c340: 44 61 74 61 20 29 20 72 65 74 75 72 6e 20 53 51  Data ) return SQ
c350: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 61 73  LITE_ERROR;.  as
c360: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c370: 61 2d 3e 6d 61 67 69 63 31 3d 3d 57 49 4e 4d 45  a->magic1==WINME
c380: 4d 5f 4d 41 47 49 43 31 20 29 3b 0a 20 20 61 73  M_MAGIC1 );.  as
c390: 73 65 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74  sert( pWinMemDat
c3a0: 61 2d 3e 6d 61 67 69 63 32 3d 3d 57 49 4e 4d 45  a->magic2==WINME
c3b0: 4d 5f 4d 41 47 49 43 32 20 29 3b 0a 0a 23 69 66  M_MAGIC2 );..#if
c3c0: 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52   !SQLITE_OS_WINR
c3d0: 54 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33  T && SQLITE_WIN3
c3e0: 32 5f 48 45 41 50 5f 43 52 45 41 54 45 0a 20 20  2_HEAP_CREATE.  
c3f0: 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61  if( !pWinMemData
c400: 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20 20 44  ->hHeap ){.    D
c410: 57 4f 52 44 20 64 77 49 6e 69 74 69 61 6c 53 69  WORD dwInitialSi
c420: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ze = SQLITE_WIN3
c430: 32 5f 48 45 41 50 5f 49 4e 49 54 5f 53 49 5a 45  2_HEAP_INIT_SIZE
c440: 3b 0a 20 20 20 20 44 57 4f 52 44 20 64 77 4d 61  ;.    DWORD dwMa
c450: 78 69 6d 75 6d 53 69 7a 65 20 3d 20 28 44 57 4f  ximumSize = (DWO
c460: 52 44 29 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  RD)sqlite3Global
c470: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 3b 0a 20 20  Config.nHeap;.  
c480: 20 20 69 66 28 20 64 77 4d 61 78 69 6d 75 6d 53    if( dwMaximumS
c490: 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
c4a0: 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  dwMaximumSize = 
c4b0: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c4c0: 50 5f 4d 41 58 5f 53 49 5a 45 3b 0a 20 20 20 20  P_MAX_SIZE;.    
c4d0: 7d 65 6c 73 65 20 69 66 28 20 64 77 49 6e 69 74  }else if( dwInit
c4e0: 69 61 6c 53 69 7a 65 3e 64 77 4d 61 78 69 6d 75  ialSize>dwMaximu
c4f0: 6d 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 64  mSize ){.      d
c500: 77 49 6e 69 74 69 61 6c 53 69 7a 65 20 3d 20 64  wInitialSize = d
c510: 77 4d 61 78 69 6d 75 6d 53 69 7a 65 3b 0a 20 20  wMaximumSize;.  
c520: 20 20 7d 0a 20 20 20 20 70 57 69 6e 4d 65 6d 44    }.    pWinMemD
c530: 61 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 48  ata->hHeap = osH
c540: 65 61 70 43 72 65 61 74 65 28 53 51 4c 49 54 45  eapCreate(SQLITE
c550: 5f 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47  _WIN32_HEAP_FLAG
c560: 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
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 64 77 49 6e 69 74 69           dwIniti
c590: 61 6c 53 69 7a 65 2c 20 64 77 4d 61 78 69 6d 75  alSize, dwMaximu
c5a0: 6d 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  mSize);.    if( 
c5b0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48  !pWinMemData->hH
c5c0: 65 61 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  eap ){.      sql
c5d0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c5e0: 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20 20 20 20 20  NOMEM,.         
c5f0: 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65 61 70   "failed to Heap
c600: 43 72 65 61 74 65 20 28 25 6c 75 29 2c 20 66 6c  Create (%lu), fl
c610: 61 67 73 3d 25 75 2c 20 69 6e 69 74 53 69 7a 65  ags=%u, initSize
c620: 3d 25 6c 75 2c 20 6d 61 78 53 69 7a 65 3d 25 6c  =%lu, maxSize=%l
c630: 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6f 73  u",.          os
c640: 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 20  GetLastError(), 
c650: 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 45 41  SQLITE_WIN32_HEA
c660: 50 5f 46 4c 41 47 53 2c 20 64 77 49 6e 69 74 69  P_FLAGS, dwIniti
c670: 61 6c 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  alSize,.        
c680: 20 20 64 77 4d 61 78 69 6d 75 6d 53 69 7a 65 29    dwMaximumSize)
c690: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
c6a0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
c6b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 69 6e  ;.    }.    pWin
c6c0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c6d0: 3d 20 54 52 55 45 3b 0a 20 20 20 20 61 73 73 65  = TRUE;.    asse
c6e0: 72 74 28 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d  rt( pWinMemData-
c6f0: 3e 62 4f 77 6e 65 64 20 29 3b 0a 20 20 7d 0a 23  >bOwned );.  }.#
c700: 65 6c 73 65 0a 20 20 70 57 69 6e 4d 65 6d 44 61  else.  pWinMemDa
c710: 74 61 2d 3e 68 48 65 61 70 20 3d 20 6f 73 47 65  ta->hHeap = osGe
c720: 74 50 72 6f 63 65 73 73 48 65 61 70 28 29 3b 0a  tProcessHeap();.
c730: 20 20 69 66 28 20 21 70 57 69 6e 4d 65 6d 44 61    if( !pWinMemDa
c740: 74 61 2d 3e 68 48 65 61 70 20 29 7b 0a 20 20 20  ta->hHeap ){.   
c750: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c760: 49 54 45 5f 4e 4f 4d 45 4d 2c 0a 20 20 20 20 20  ITE_NOMEM,.     
c770: 20 20 20 22 66 61 69 6c 65 64 20 74 6f 20 47 65     "failed to Ge
c780: 74 50 72 6f 63 65 73 73 48 65 61 70 20 28 25 6c  tProcessHeap (%l
c790: 75 29 22 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  u)", osGetLastEr
c7a0: 72 6f 72 28 29 29 3b 0a 20 20 20 20 72 65 74 75  ror());.    retu
c7b0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
c7c0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 57 69 6e  BKPT;.  }.  pWin
c7d0: 4d 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20  MemData->bOwned 
c7e0: 3d 20 46 41 4c 53 45 3b 0a 20 20 61 73 73 65 72  = FALSE;.  asser
c7f0: 74 28 20 21 70 57 69 6e 4d 65 6d 44 61 74 61 2d  t( !pWinMemData-
c800: 3e 62 4f 77 6e 65 64 20 29 3b 0a 23 65 6e 64 69  >bOwned );.#endi
c810: 66 0a 20 20 61 73 73 65 72 74 28 20 70 57 69 6e  f.  assert( pWin
c820: 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70 21 3d  MemData->hHeap!=
c830: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
c840: 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61  WinMemData->hHea
c850: 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  p!=INVALID_HANDL
c860: 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20 21  E_VALUE );.#if !
c870: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20  SQLITE_OS_WINRT 
c880: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c890: 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f 56  E_WIN32_MALLOC_V
c8a0: 41 4c 49 44 41 54 45 29 0a 20 20 61 73 73 65 72  ALIDATE).  asser
c8b0: 74 28 20 6f 73 48 65 61 70 56 61 6c 69 64 61 74  t( osHeapValidat
c8c0: 65 28 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68  e(pWinMemData->h
c8d0: 48 65 61 70 2c 20 53 51 4c 49 54 45 5f 57 49 4e  Heap, SQLITE_WIN
c8e0: 33 32 5f 48 45 41 50 5f 46 4c 41 47 53 2c 20 4e  32_HEAP_FLAGS, N
c8f0: 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ULL) );.#endif. 
c900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c910: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 69 6e  K;.}../*.** Dein
c920: 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f  itialize this mo
c930: 64 75 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dule..*/.static 
c940: 76 6f 69 64 20 77 69 6e 4d 65 6d 53 68 75 74 64  void winMemShutd
c950: 6f 77 6e 28 76 6f 69 64 20 2a 70 41 70 70 44 61  own(void *pAppDa
c960: 74 61 29 7b 0a 20 20 77 69 6e 4d 65 6d 44 61 74  ta){.  winMemDat
c970: 61 20 2a 70 57 69 6e 4d 65 6d 44 61 74 61 20 3d  a *pWinMemData =
c980: 20 28 77 69 6e 4d 65 6d 44 61 74 61 20 2a 29 70   (winMemData *)p
c990: 41 70 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  AppData;..  if( 
c9a0: 21 70 57 69 6e 4d 65 6d 44 61 74 61 20 29 20 72  !pWinMemData ) r
c9b0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
c9c0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
c9d0: 67 69 63 31 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic1==WINMEM_MAG
c9e0: 49 43 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  IC1 );.  assert(
c9f0: 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 6d 61   pWinMemData->ma
ca00: 67 69 63 32 3d 3d 57 49 4e 4d 45 4d 5f 4d 41 47  gic2==WINMEM_MAG
ca10: 49 43 32 20 29 3b 0a 0a 20 20 69 66 28 20 70 57  IC2 );..  if( pW
ca20: 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65 61 70  inMemData->hHeap
ca30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
ca40: 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68 48 65  pWinMemData->hHe
ca50: 61 70 21 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  ap!=INVALID_HAND
ca60: 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 23 69 66 20  LE_VALUE );.#if 
ca70: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
ca80: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
ca90: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 5f  TE_WIN32_MALLOC_
caa0: 56 41 4c 49 44 41 54 45 29 0a 20 20 20 20 61 73  VALIDATE).    as
cab0: 73 65 72 74 28 20 6f 73 48 65 61 70 56 61 6c 69  sert( osHeapVali
cac0: 64 61 74 65 28 70 57 69 6e 4d 65 6d 44 61 74 61  date(pWinMemData
cad0: 2d 3e 68 48 65 61 70 2c 20 53 51 4c 49 54 45 5f  ->hHeap, SQLITE_
cae0: 57 49 4e 33 32 5f 48 45 41 50 5f 46 4c 41 47 53  WIN32_HEAP_FLAGS
caf0: 2c 20 4e 55 4c 4c 29 20 29 3b 0a 23 65 6e 64 69  , NULL) );.#endi
cb00: 66 0a 20 20 20 20 69 66 28 20 70 57 69 6e 4d 65  f.    if( pWinMe
cb10: 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 29 7b  mData->bOwned ){
cb20: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 73 48 65  .      if( !osHe
cb30: 61 70 44 65 73 74 72 6f 79 28 70 57 69 6e 4d 65  apDestroy(pWinMe
cb40: 6d 44 61 74 61 2d 3e 68 48 65 61 70 29 20 29 7b  mData->hHeap) ){
cb50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb60: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 4d 45  _log(SQLITE_NOME
cb70: 4d 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 48 65  M, "failed to He
cb80: 61 70 44 65 73 74 72 6f 79 20 28 25 6c 75 29 2c  apDestroy (%lu),
cb90: 20 68 65 61 70 3d 25 70 22 2c 0a 20 20 20 20 20   heap=%p",.     
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
cbb0: 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c  sGetLastError(),
cbc0: 20 28 76 6f 69 64 2a 29 70 57 69 6e 4d 65 6d 44   (void*)pWinMemD
cbd0: 61 74 61 2d 3e 68 48 65 61 70 29 3b 0a 20 20 20  ata->hHeap);.   
cbe0: 20 20 20 7d 0a 20 20 20 20 20 20 70 57 69 6e 4d     }.      pWinM
cbf0: 65 6d 44 61 74 61 2d 3e 62 4f 77 6e 65 64 20 3d  emData->bOwned =
cc00: 20 46 41 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20   FALSE;.    }.  
cc10: 20 20 70 57 69 6e 4d 65 6d 44 61 74 61 2d 3e 68    pWinMemData->h
cc20: 48 65 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  Heap = NULL;.  }
cc30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
cc40: 74 65 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  te the low-level
cc50: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
cc60: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  on function poin
cc70: 74 65 72 73 20 69 6e 0a 2a 2a 20 73 71 6c 69 74  ters in.** sqlit
cc80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
cc90: 20 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74   with pointers t
cca0: 6f 20 74 68 65 20 72 6f 75 74 69 6e 65 73 20 69  o the routines i
ccb0: 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 54 68 65  n this file. The
ccc0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 73 70  .** arguments sp
ccd0: 65 63 69 66 79 20 74 68 65 20 62 6c 6f 63 6b 20  ecify the block 
cce0: 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6d 61 6e  of memory to man
ccf0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
cd00: 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
cd10: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
cd20: 33 5f 63 6f 6e 66 69 67 28 29 2c 20 61 6e 64 20  3_config(), and 
cd30: 74 68 65 72 65 66 6f 72 65 0a 2a 2a 20 69 73 20  therefore.** is 
cd40: 6e 6f 74 20 72 65 71 75 69 72 65 64 20 74 6f 20  not required to 
cd50: 62 65 20 74 68 72 65 61 64 73 61 66 65 20 28 69  be threadsafe (i
cd60: 74 20 69 73 20 6e 6f 74 29 2e 0a 2a 2f 0a 63 6f  t is not)..*/.co
cd70: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  nst sqlite3_mem_
cd80: 6d 65 74 68 6f 64 73 20 2a 73 71 6c 69 74 65 33  methods *sqlite3
cd90: 4d 65 6d 47 65 74 57 69 6e 33 32 28 76 6f 69 64  MemGetWin32(void
cda0: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
cdb0: 74 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  t sqlite3_mem_me
cdc0: 74 68 6f 64 73 20 77 69 6e 4d 65 6d 4d 65 74 68  thods winMemMeth
cdd0: 6f 64 73 20 3d 20 7b 0a 20 20 20 20 77 69 6e 4d  ods = {.    winM
cde0: 65 6d 4d 61 6c 6c 6f 63 2c 0a 20 20 20 20 77 69  emMalloc,.    wi
cdf0: 6e 4d 65 6d 46 72 65 65 2c 0a 20 20 20 20 77 69  nMemFree,.    wi
ce00: 6e 4d 65 6d 52 65 61 6c 6c 6f 63 2c 0a 20 20 20  nMemRealloc,.   
ce10: 20 77 69 6e 4d 65 6d 53 69 7a 65 2c 0a 20 20 20   winMemSize,.   
ce20: 20 77 69 6e 4d 65 6d 52 6f 75 6e 64 75 70 2c 0a   winMemRoundup,.
ce30: 20 20 20 20 77 69 6e 4d 65 6d 49 6e 69 74 2c 0a      winMemInit,.
ce40: 20 20 20 20 77 69 6e 4d 65 6d 53 68 75 74 64 6f      winMemShutdo
ce50: 77 6e 2c 0a 20 20 20 20 26 77 69 6e 5f 6d 65 6d  wn,.    &win_mem
ce60: 5f 64 61 74 61 0a 20 20 7d 3b 0a 20 20 72 65 74  _data.  };.  ret
ce70: 75 72 6e 20 26 77 69 6e 4d 65 6d 4d 65 74 68 6f  urn &winMemMetho
ce80: 64 73 3b 0a 7d 0a 0a 76 6f 69 64 20 73 71 6c 69  ds;.}..void sqli
ce90: 74 65 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74  te3MemSetDefault
cea0: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
ceb0: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
cec0: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 2c 20 73  CONFIG_MALLOC, s
ced0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 57 69 6e 33  qlite3MemGetWin3
cee0: 32 28 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  2());.}.#endif /
cef0: 2a 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d  * SQLITE_WIN32_M
cf00: 41 4c 4c 4f 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ALLOC */../*.** 
cf10: 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38 20  Convert a UTF-8 
cf20: 73 74 72 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73  string to Micros
cf30: 6f 66 74 20 55 6e 69 63 6f 64 65 2e 0a 2a 2a 0a  oft Unicode..**.
cf40: 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  ** Space to hold
cf50: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73 74   the returned st
cf60: 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65 64  ring is obtained
cf70: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
cf80: 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lloc()..*/.stati
cf90: 63 20 4c 50 57 53 54 52 20 77 69 6e 55 74 66 38  c LPWSTR winUtf8
cfa0: 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20  ToUnicode(const 
cfb0: 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20  char *zText){.  
cfc0: 69 6e 74 20 6e 43 68 61 72 3b 0a 20 20 4c 50 57  int nChar;.  LPW
cfd0: 53 54 52 20 7a 57 69 64 65 54 65 78 74 3b 0a 0a  STR zWideText;..
cfe0: 20 20 6e 43 68 61 72 20 3d 20 6f 73 4d 75 6c 74    nChar = osMult
cff0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d000: 43 50 5f 55 54 46 38 2c 20 30 2c 20 7a 54 65 78  CP_UTF8, 0, zTex
d010: 74 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20 30 29 3b  t, -1, NULL, 0);
d020: 0a 20 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20  .  if( nChar==0 
d030: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d040: 0a 20 20 7d 0a 20 20 7a 57 69 64 65 54 65 78 74  .  }.  zWideText
d050: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
d060: 5a 65 72 6f 28 20 6e 43 68 61 72 2a 73 69 7a 65  Zero( nChar*size
d070: 6f 66 28 57 43 48 41 52 29 20 29 3b 0a 20 20 69  of(WCHAR) );.  i
d080: 66 28 20 7a 57 69 64 65 54 65 78 74 3d 3d 30 20  f( zWideText==0 
d090: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
d0a0: 0a 20 20 7d 0a 20 20 6e 43 68 61 72 20 3d 20 6f  .  }.  nChar = o
d0b0: 73 4d 75 6c 74 69 42 79 74 65 54 6f 57 69 64 65  sMultiByteToWide
d0c0: 43 68 61 72 28 43 50 5f 55 54 46 38 2c 20 30 2c  Char(CP_UTF8, 0,
d0d0: 20 7a 54 65 78 74 2c 20 2d 31 2c 20 7a 57 69 64   zText, -1, zWid
d0e0: 65 54 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  eText,.         
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 6e 43 68 61 72 29 3b 0a 20         nChar);. 
d110: 20 69 66 28 20 6e 43 68 61 72 3d 3d 30 20 29 7b   if( nChar==0 ){
d120: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
d130: 65 28 7a 57 69 64 65 54 65 78 74 29 3b 0a 20 20  e(zWideText);.  
d140: 20 20 7a 57 69 64 65 54 65 78 74 20 3d 20 30 3b    zWideText = 0;
d150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 57  .  }.  return zW
d160: 69 64 65 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  ideText;.}../*.*
d170: 2a 20 43 6f 6e 76 65 72 74 20 61 20 4d 69 63 72  * Convert a Micr
d180: 6f 73 6f 66 74 20 55 6e 69 63 6f 64 65 20 73 74  osoft Unicode st
d190: 72 69 6e 67 20 74 6f 20 55 54 46 2d 38 2e 0a 2a  ring to UTF-8..*
d1a0: 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
d1b0: 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  ld the returned 
d1c0: 73 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e  string is obtain
d1d0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
d1e0: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61  malloc()..*/.sta
d1f0: 74 69 63 20 63 68 61 72 20 2a 77 69 6e 55 6e 69  tic char *winUni
d200: 63 6f 64 65 54 6f 55 74 66 38 28 4c 50 43 57 53  codeToUtf8(LPCWS
d210: 54 52 20 7a 57 69 64 65 54 65 78 74 29 7b 0a 20  TR zWideText){. 
d220: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 63 68   int nByte;.  ch
d230: 61 72 20 2a 7a 54 65 78 74 3b 0a 0a 20 20 6e 42  ar *zText;..  nB
d240: 79 74 65 20 3d 20 6f 73 57 69 64 65 43 68 61 72  yte = osWideChar
d250: 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50 5f 55  ToMultiByte(CP_U
d260: 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 54 65 78  TF8, 0, zWideTex
d270: 74 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20  t, -1, 0, 0, 0, 
d280: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d290: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 72 65 74 75  == 0 ){.    retu
d2a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78  rn 0;.  }.  zTex
d2b0: 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
d2c0: 63 5a 65 72 6f 28 20 6e 42 79 74 65 20 29 3b 0a  cZero( nByte );.
d2d0: 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20 29    if( zText==0 )
d2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d2f0: 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20 6f 73    }.  nByte = os
d300: 57 69 64 65 43 68 61 72 54 6f 4d 75 6c 74 69 42  WideCharToMultiB
d310: 79 74 65 28 43 50 5f 55 54 46 38 2c 20 30 2c 20  yte(CP_UTF8, 0, 
d320: 7a 57 69 64 65 54 65 78 74 2c 20 2d 31 2c 20 7a  zWideText, -1, z
d330: 54 65 78 74 2c 20 6e 42 79 74 65 2c 0a 20 20 20  Text, nByte,.   
d340: 20 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 30 2c 20               0, 
d360: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
d370: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
d380: 74 65 33 5f 66 72 65 65 28 7a 54 65 78 74 29 3b  te3_free(zText);
d390: 0a 20 20 20 20 7a 54 65 78 74 20 3d 20 30 3b 0a  .    zText = 0;.
d3a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 54 65    }.  return zTe
d3b0: 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  xt;.}../*.** Con
d3c0: 76 65 72 74 20 61 6e 20 41 4e 53 49 20 73 74 72  vert an ANSI str
d3d0: 69 6e 67 20 74 6f 20 4d 69 63 72 6f 73 6f 66 74  ing to Microsoft
d3e0: 20 55 6e 69 63 6f 64 65 2c 20 75 73 69 6e 67 20   Unicode, using 
d3f0: 74 68 65 20 41 4e 53 49 20 6f 72 20 4f 45 4d 0a  the ANSI or OEM.
d400: 2a 2a 20 63 6f 64 65 20 70 61 67 65 2e 0a 2a 2a  ** code page..**
d410: 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
d420: 64 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 73  d the returned s
d430: 74 72 69 6e 67 20 69 73 20 6f 62 74 61 69 6e 65  tring is obtaine
d440: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
d450: 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a 73 74 61 74  alloc()..*/.stat
d460: 69 63 20 4c 50 57 53 54 52 20 77 69 6e 4d 62 63  ic LPWSTR winMbc
d470: 73 54 6f 55 6e 69 63 6f 64 65 28 63 6f 6e 73 74  sToUnicode(const
d480: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
d490: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 69 6e  t useAnsi){.  in
d4a0: 74 20 6e 42 79 74 65 3b 0a 20 20 4c 50 57 53 54  t nByte;.  LPWST
d4b0: 52 20 7a 4d 62 63 73 54 65 78 74 3b 0a 20 20 69  R zMbcsText;.  i
d4c0: 6e 74 20 63 6f 64 65 70 61 67 65 20 3d 20 75 73  nt codepage = us
d4d0: 65 41 6e 73 69 20 3f 20 43 50 5f 41 43 50 20 3a  eAnsi ? CP_ACP :
d4e0: 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20 20 6e 42   CP_OEMCP;..  nB
d4f0: 79 74 65 20 3d 20 6f 73 4d 75 6c 74 69 42 79 74  yte = osMultiByt
d500: 65 54 6f 57 69 64 65 43 68 61 72 28 63 6f 64 65  eToWideChar(code
d510: 70 61 67 65 2c 20 30 2c 20 7a 54 65 78 74 2c 20  page, 0, zText, 
d520: 2d 31 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20  -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 30 29 2a 73 69 7a            0)*siz
d550: 65 6f 66 28 57 43 48 41 52 29 3b 0a 20 20 69 66  eof(WCHAR);.  if
d560: 28 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  ( nByte==0 ){.  
d570: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d580: 20 20 7a 4d 62 63 73 54 65 78 74 20 3d 20 73 71    zMbcsText = sq
d590: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
d5a0: 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 57 43   nByte*sizeof(WC
d5b0: 48 41 52 29 20 29 3b 0a 20 20 69 66 28 20 7a 4d  HAR) );.  if( zM
d5c0: 62 63 73 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  bcsText==0 ){.  
d5d0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
d5e0: 20 20 6e 42 79 74 65 20 3d 20 6f 73 4d 75 6c 74    nByte = osMult
d5f0: 69 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28  iByteToWideChar(
d600: 63 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 54 65  codepage, 0, zTe
d610: 78 74 2c 20 2d 31 2c 20 7a 4d 62 63 73 54 65 78  xt, -1, zMbcsTex
d620: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28     nByte);.  if(
d650: 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
d660: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d   sqlite3_free(zM
d670: 62 63 73 54 65 78 74 29 3b 0a 20 20 20 20 7a 4d  bcsText);.    zM
d680: 62 63 73 54 65 78 74 20 3d 20 30 3b 0a 20 20 7d  bcsText = 0;.  }
d690: 0a 20 20 72 65 74 75 72 6e 20 7a 4d 62 63 73 54  .  return zMbcsT
d6a0: 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ext;.}../*.** Co
d6b0: 6e 76 65 72 74 20 61 20 4d 69 63 72 6f 73 6f 66  nvert a Microsof
d6c0: 74 20 55 6e 69 63 6f 64 65 20 73 74 72 69 6e 67  t Unicode string
d6d0: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
d6e0: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
d6f0: 67 2c 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  g,.** using the 
d700: 41 4e 53 49 20 6f 72 20 4f 45 4d 20 63 6f 64 65  ANSI or OEM code
d710: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 53 70 61   page..**.** Spa
d720: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
d730: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
d740: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
d750: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
d760: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
d770: 20 2a 77 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62   *winUnicodeToMb
d780: 63 73 28 4c 50 43 57 53 54 52 20 7a 57 69 64 65  cs(LPCWSTR zWide
d790: 54 65 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73  Text, int useAns
d7a0: 69 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  i){.  int nByte;
d7b0: 0a 20 20 63 68 61 72 20 2a 7a 54 65 78 74 3b 0a  .  char *zText;.
d7c0: 20 20 69 6e 74 20 63 6f 64 65 70 61 67 65 20 3d    int codepage =
d7d0: 20 75 73 65 41 6e 73 69 20 3f 20 43 50 5f 41 43   useAnsi ? CP_AC
d7e0: 50 20 3a 20 43 50 5f 4f 45 4d 43 50 3b 0a 0a 20  P : CP_OEMCP;.. 
d7f0: 20 6e 42 79 74 65 20 3d 20 6f 73 57 69 64 65 43   nByte = osWideC
d800: 68 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 63  harToMultiByte(c
d810: 6f 64 65 70 61 67 65 2c 20 30 2c 20 7a 57 69 64  odepage, 0, zWid
d820: 65 54 65 78 74 2c 20 2d 31 2c 20 30 2c 20 30 2c  eText, -1, 0, 0,
d830: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e 42   0, 0);.  if( nB
d840: 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  yte == 0 ){.    
d850: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
d860: 7a 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 4d  zText = sqlite3M
d870: 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 79 74 65  allocZero( nByte
d880: 20 29 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d   );.  if( zText=
d890: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
d8a0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20   0;.  }.  nByte 
d8b0: 3d 20 6f 73 57 69 64 65 43 68 61 72 54 6f 4d 75  = osWideCharToMu
d8c0: 6c 74 69 42 79 74 65 28 63 6f 64 65 70 61 67 65  ltiByte(codepage
d8d0: 2c 20 30 2c 20 7a 57 69 64 65 54 65 78 74 2c 20  , 0, zWideText, 
d8e0: 2d 31 2c 20 7a 54 65 78 74 2c 0a 20 20 20 20 20  -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 6e 42 79 74 65             nByte
d910: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 6e  , 0, 0);.  if( n
d920: 42 79 74 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Byte == 0 ){.   
d930: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
d940: 65 78 74 29 3b 0a 20 20 20 20 7a 54 65 78 74 20  ext);.    zText 
d950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
d960: 6e 20 7a 54 65 78 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zText;.}../*.*
d970: 2a 20 43 6f 6e 76 65 72 74 20 61 20 6d 75 6c 74  * Convert a mult
d980: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
d990: 20 73 74 72 69 6e 67 20 74 6f 20 55 54 46 2d 38   string to UTF-8
d9a0: 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
d9b0: 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e   hold the return
d9c0: 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62 74  ed string is obt
d9d0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
d9e0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  e3_malloc()..*/.
d9f0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69 6e  static char *win
da00: 4d 62 63 73 54 6f 55 74 66 38 28 63 6f 6e 73 74  MbcsToUtf8(const
da10: 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e   char *zText, in
da20: 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63 68  t useAnsi){.  ch
da30: 61 72 20 2a 7a 54 65 78 74 55 74 66 38 3b 0a 20  ar *zTextUtf8;. 
da40: 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64 65   LPWSTR zTmpWide
da50: 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d 20  ;..  zTmpWide = 
da60: 77 69 6e 4d 62 63 73 54 6f 55 6e 69 63 6f 64 65  winMbcsToUnicode
da70: 28 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29  (zText, useAnsi)
da80: 3b 0a 20 20 69 66 28 20 7a 54 6d 70 57 69 64 65  ;.  if( zTmpWide
da90: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
daa0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 54 65 78 74  n 0;.  }.  zText
dab0: 55 74 66 38 20 3d 20 77 69 6e 55 6e 69 63 6f 64  Utf8 = winUnicod
dac0: 65 54 6f 55 74 66 38 28 7a 54 6d 70 57 69 64 65  eToUtf8(zTmpWide
dad0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
dae0: 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20 72  e(zTmpWide);.  r
daf0: 65 74 75 72 6e 20 7a 54 65 78 74 55 74 66 38 3b  eturn zTextUtf8;
db00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  .}../*.** Conver
db10: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
db20: 20 74 6f 20 61 20 6d 75 6c 74 69 2d 62 79 74 65   to a multi-byte
db30: 20 63 68 61 72 61 63 74 65 72 20 73 74 72 69 6e   character strin
db40: 67 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  g..**.** Space t
db50: 6f 20 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72  o hold the retur
db60: 6e 65 64 20 73 74 72 69 6e 67 20 69 73 20 6f 62  ned string is ob
db70: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
db80: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f  te3_malloc()..*/
db90: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 77 69  .static char *wi
dba0: 6e 55 74 66 38 54 6f 4d 62 63 73 28 63 6f 6e 73  nUtf8ToMbcs(cons
dbb0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
dbc0: 6e 74 20 75 73 65 41 6e 73 69 29 7b 0a 20 20 63  nt useAnsi){.  c
dbd0: 68 61 72 20 2a 7a 54 65 78 74 4d 62 63 73 3b 0a  har *zTextMbcs;.
dbe0: 20 20 4c 50 57 53 54 52 20 7a 54 6d 70 57 69 64    LPWSTR zTmpWid
dbf0: 65 3b 0a 0a 20 20 7a 54 6d 70 57 69 64 65 20 3d  e;..  zTmpWide =
dc00: 20 77 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64   winUtf8ToUnicod
dc10: 65 28 7a 54 65 78 74 29 3b 0a 20 20 69 66 28 20  e(zText);.  if( 
dc20: 7a 54 6d 70 57 69 64 65 3d 3d 30 20 29 7b 0a 20  zTmpWide==0 ){. 
dc30: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
dc40: 0a 20 20 7a 54 65 78 74 4d 62 63 73 20 3d 20 77  .  zTextMbcs = w
dc50: 69 6e 55 6e 69 63 6f 64 65 54 6f 4d 62 63 73 28  inUnicodeToMbcs(
dc60: 7a 54 6d 70 57 69 64 65 2c 20 75 73 65 41 6e 73  zTmpWide, useAns
dc70: 69 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  i);.  sqlite3_fr
dc80: 65 65 28 7a 54 6d 70 57 69 64 65 29 3b 0a 20 20  ee(zTmpWide);.  
dc90: 72 65 74 75 72 6e 20 7a 54 65 78 74 4d 62 63 73  return zTextMbcs
dca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
dcb0: 69 73 20 61 20 70 75 62 6c 69 63 20 77 72 61 70  is a public wrap
dcc0: 70 65 72 20 66 6f 72 20 74 68 65 20 77 69 6e 55  per for the winU
dcd0: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 29 20 66  tf8ToUnicode() f
dce0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 4c 50 57 53  unction..*/.LPWS
dcf0: 54 52 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  TR sqlite3_win32
dd00: 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65  _utf8_to_unicode
dd10: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
dd20: 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  xt){.#ifdef SQLI
dd30: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
dd40: 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65 78 74  MOR.  if( !zText
dd50: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
dd60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
dd70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
dd80: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64    }.#endif.#ifnd
dd90: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
dda0: 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20 73 71  UTOINIT.  if( sq
ddb0: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
ddc0: 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23  () ) return 0;.#
ddd0: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 77  endif.  return w
dde0: 69 6e 55 74 66 38 54 6f 55 6e 69 63 6f 64 65 28  inUtf8ToUnicode(
ddf0: 7a 54 65 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zText);.}../*.**
de00: 20 54 68 69 73 20 69 73 20 61 20 70 75 62 6c 69   This is a publi
de10: 63 20 77 72 61 70 70 65 72 20 66 6f 72 20 74 68  c wrapper for th
de20: 65 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  e winUnicodeToUt
de30: 66 38 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  f8() function..*
de40: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
de50: 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f  win32_unicode_to
de60: 5f 75 74 66 38 28 4c 50 43 57 53 54 52 20 7a 57  _utf8(LPCWSTR zW
de70: 69 64 65 54 65 78 74 29 7b 0a 23 69 66 64 65 66  ideText){.#ifdef
de80: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
de90: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
dea0: 7a 57 69 64 65 54 65 78 74 20 29 7b 0a 20 20 20  zWideText ){.   
deb0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
dec0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
ded0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
dee0: 64 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  dif.#ifndef SQLI
def0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
df00: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69  .  if( sqlite3_i
df10: 6e 69 74 69 61 6c 69 7a 65 28 29 20 29 20 72 65  nitialize() ) re
df20: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 20  turn 0;.#endif. 
df30: 20 72 65 74 75 72 6e 20 77 69 6e 55 6e 69 63 6f   return winUnico
df40: 64 65 54 6f 55 74 66 38 28 7a 57 69 64 65 54 65  deToUtf8(zWideTe
df50: 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  xt);.}../*.** Th
df60: 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20 77  is is a public w
df70: 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20 77  rapper for the w
df80: 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20 66  inMbcsToUtf8() f
df90: 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61 72  unction..*/.char
dfa0: 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f   *sqlite3_win32_
dfb0: 6d 62 63 73 5f 74 6f 5f 75 74 66 38 28 63 6f 6e  mbcs_to_utf8(con
dfc0: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b  st char *zText){
dfd0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dfe0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
dff0: 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b 0a    if( !zText ){.
e000: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e010: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e020: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e030: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
e040: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
e050: 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65  NIT.  if( sqlite
e060: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 29  3_initialize() )
e070: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
e080: 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d 62  f.  return winMb
e090: 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c 20  csToUtf8(zText, 
e0a0: 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53  osAreFileApisANS
e0b0: 49 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  I());.}../*.** T
e0c0: 68 69 73 20 69 73 20 61 20 70 75 62 6c 69 63 20  his is a public 
e0d0: 77 72 61 70 70 65 72 20 66 6f 72 20 74 68 65 20  wrapper for the 
e0e0: 77 69 6e 4d 62 63 73 54 6f 55 74 66 38 28 29 20  winMbcsToUtf8() 
e0f0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 68 61  function..*/.cha
e100: 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  r *sqlite3_win32
e110: 5f 6d 62 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32  _mbcs_to_utf8_v2
e120: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
e130: 78 74 2c 20 69 6e 74 20 75 73 65 41 6e 73 69 29  xt, int useAnsi)
e140: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
e150: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
e160: 0a 20 20 69 66 28 20 21 7a 54 65 78 74 20 29 7b  .  if( !zText ){
e170: 0a 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54  .    (void)SQLIT
e180: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
e190: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
e1a0: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
e1b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
e1c0: 49 4e 49 54 0a 20 20 69 66 28 20 73 71 6c 69 74  INIT.  if( sqlit
e1d0: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
e1e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
e1f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 4d  if.  return winM
e200: 62 63 73 54 6f 55 74 66 38 28 7a 54 65 78 74 2c  bcsToUtf8(zText,
e210: 20 75 73 65 41 6e 73 69 29 3b 0a 7d 0a 0a 2f 2a   useAnsi);.}../*
e220: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70 75  .** This is a pu
e230: 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f 72  blic wrapper for
e240: 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d 62   the winUtf8ToMb
e250: 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  cs() function..*
e260: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  /.char *sqlite3_
e270: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
e280: 63 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  cs(const char *z
e290: 54 65 78 74 29 7b 0a 23 69 66 64 65 66 20 53 51  Text){.#ifdef SQ
e2a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
e2b0: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54 65  ARMOR.  if( !zTe
e2c0: 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  xt ){.    (void)
e2d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
e2e0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
e2f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
e300: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e310: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28 20  _AUTOINIT.  if( 
e320: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
e330: 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ze() ) return 0;
e340: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e350: 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28 7a   winUtf8ToMbcs(z
e360: 54 65 78 74 2c 20 6f 73 41 72 65 46 69 6c 65 41  Text, osAreFileA
e370: 70 69 73 41 4e 53 49 28 29 29 3b 0a 7d 0a 0a 2f  pisANSI());.}../
e380: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 70  *.** This is a p
e390: 75 62 6c 69 63 20 77 72 61 70 70 65 72 20 66 6f  ublic wrapper fo
e3a0: 72 20 74 68 65 20 77 69 6e 55 74 66 38 54 6f 4d  r the winUtf8ToM
e3b0: 62 63 73 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  bcs() function..
e3c0: 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33  */.char *sqlite3
e3d0: 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d  _win32_utf8_to_m
e3e0: 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  bcs_v2(const cha
e3f0: 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 75 73  r *zText, int us
e400: 65 41 6e 73 69 29 7b 0a 23 69 66 64 65 66 20 53  eAnsi){.#ifdef S
e410: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
e420: 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 7a 54  _ARMOR.  if( !zT
e430: 65 78 74 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  ext ){.    (void
e440: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
e450: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
e460: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
e470: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e480: 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 66 28  T_AUTOINIT.  if(
e490: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
e4a0: 69 7a 65 28 29 20 29 20 72 65 74 75 72 6e 20 30  ize() ) return 0
e4b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
e4c0: 6e 20 77 69 6e 55 74 66 38 54 6f 4d 62 63 73 28  n winUtf8ToMbcs(
e4d0: 7a 54 65 78 74 2c 20 75 73 65 41 6e 73 69 29 3b  zText, useAnsi);
e4e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
e4f0: 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
e500: 20 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20   data directory 
e510: 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  or the temporary
e520: 20 64 69 72 65 63 74 6f 72 79 20 62 61 73 65 64   directory based
e530: 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 72 6f 76 69   on.** the provi
e540: 64 65 64 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ded arguments.  
e550: 54 68 65 20 74 79 70 65 20 61 72 67 75 6d 65 6e  The type argumen
e560: 74 20 6d 75 73 74 20 62 65 20 31 20 69 6e 20 6f  t must be 1 in o
e570: 72 64 65 72 20 74 6f 20 73 65 74 20 74 68 65 0a  rder to set the.
e580: 2a 2a 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  ** data director
e590: 79 20 6f 72 20 32 20 69 6e 20 6f 72 64 65 72 20  y or 2 in order 
e5a0: 74 6f 20 73 65 74 20 74 68 65 20 74 65 6d 70 6f  to set the tempo
e5b0: 72 61 72 79 20 64 69 72 65 63 74 6f 72 79 2e 20  rary directory. 
e5c0: 20 54 68 65 20 7a 56 61 6c 75 65 0a 2a 2a 20 61   The zValue.** a
e5d0: 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
e5e0: 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
e5f0: 74 6f 72 79 20 74 6f 20 75 73 65 2e 20 20 54 68  tory to use.  Th
e600: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 77  e return value w
e610: 69 6c 6c 20 62 65 0a 2a 2a 20 53 51 4c 49 54 45  ill be.** SQLITE
e620: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
e630: 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
e640: 33 5f 77 69 6e 33 32 5f 73 65 74 5f 64 69 72 65  3_win32_set_dire
e650: 63 74 6f 72 79 28 44 57 4f 52 44 20 74 79 70 65  ctory(DWORD type
e660: 2c 20 4c 50 43 57 53 54 52 20 7a 56 61 6c 75 65  , LPCWSTR zValue
e670: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 70 44 69  ){.  char **ppDi
e680: 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a 23 69 66  rectory = 0;.#if
e690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e6a0: 5f 41 55 54 4f 49 4e 49 54 0a 20 20 69 6e 74 20  _AUTOINIT.  int 
e6b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69  rc = sqlite3_ini
e6c0: 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28  tialize();.  if(
e6d0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e6e0: 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 74 79  .#endif.  if( ty
e6f0: 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33 32  pe==SQLITE_WIN32
e700: 5f 44 41 54 41 5f 44 49 52 45 43 54 4f 52 59 5f  _DATA_DIRECTORY_
e710: 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44 69  TYPE ){.    ppDi
e720: 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69 74  rectory = &sqlit
e730: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
e740: 79 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 74  y;.  }else if( t
e750: 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57 49 4e 33  ype==SQLITE_WIN3
e760: 32 5f 54 45 4d 50 5f 44 49 52 45 43 54 4f 52 59  2_TEMP_DIRECTORY
e770: 5f 54 59 50 45 20 29 7b 0a 20 20 20 20 70 70 44  _TYPE ){.    ppD
e780: 69 72 65 63 74 6f 72 79 20 3d 20 26 73 71 6c 69  irectory = &sqli
e790: 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f  te3_temp_directo
e7a0: 72 79 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ry;.  }.  assert
e7b0: 28 20 21 70 70 44 69 72 65 63 74 6f 72 79 20 7c  ( !ppDirectory |
e7c0: 7c 20 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 57  | type==SQLITE_W
e7d0: 49 4e 33 32 5f 44 41 54 41 5f 44 49 52 45 43 54  IN32_DATA_DIRECT
e7e0: 4f 52 59 5f 54 59 50 45 0a 20 20 20 20 20 20 20  ORY_TYPE.       
e7f0: 20 20 20 7c 7c 20 74 79 70 65 3d 3d 53 51 4c 49     || type==SQLI
e800: 54 45 5f 57 49 4e 33 32 5f 54 45 4d 50 5f 44 49  TE_WIN32_TEMP_DI
e810: 52 45 43 54 4f 52 59 5f 54 59 50 45 0a 20 20 29  RECTORY_TYPE.  )
e820: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 70 44  ;.  assert( !ppD
e830: 69 72 65 63 74 6f 72 79 20 7c 7c 20 73 71 6c 69  irectory || sqli
e840: 74 65 33 4d 65 6d 64 65 62 75 67 48 61 73 54 79  te3MemdebugHasTy
e850: 70 65 28 2a 70 70 44 69 72 65 63 74 6f 72 79 2c  pe(*ppDirectory,
e860: 20 4d 45 4d 54 59 50 45 5f 48 45 41 50 29 20 29   MEMTYPE_HEAP) )
e870: 3b 0a 20 20 69 66 28 20 70 70 44 69 72 65 63 74  ;.  if( ppDirect
e880: 6f 72 79 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ory ){.    char 
e890: 2a 7a 56 61 6c 75 65 55 74 66 38 20 3d 20 30 3b  *zValueUtf8 = 0;
e8a0: 0a 20 20 20 20 69 66 28 20 7a 56 61 6c 75 65 20  .    if( zValue 
e8b0: 26 26 20 7a 56 61 6c 75 65 5b 30 5d 20 29 7b 0a  && zValue[0] ){.
e8c0: 20 20 20 20 20 20 7a 56 61 6c 75 65 55 74 66 38        zValueUtf8
e8d0: 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55   = winUnicodeToU
e8e0: 74 66 38 28 7a 56 61 6c 75 65 29 3b 0a 20 20 20  tf8(zValue);.   
e8f0: 20 20 20 69 66 20 28 20 7a 56 61 6c 75 65 55 74     if ( zValueUt
e900: 66 38 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f8==0 ){.       
e910: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
e920: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
e930: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
e940: 69 74 65 33 5f 66 72 65 65 28 2a 70 70 44 69 72  ite3_free(*ppDir
e950: 65 63 74 6f 72 79 29 3b 0a 20 20 20 20 2a 70 70  ectory);.    *pp
e960: 44 69 72 65 63 74 6f 72 79 20 3d 20 7a 56 61 6c  Directory = zVal
e970: 75 65 55 74 66 38 3b 0a 20 20 20 20 72 65 74 75  ueUtf8;.    retu
e980: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e990: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
e9a0: 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
e9b0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
e9c0: 75 65 20 6f 66 20 77 69 6e 47 65 74 4c 61 73 74  ue of winGetLast
e9d0: 45 72 72 6f 72 4d 73 67 0a 2a 2a 20 69 73 20 7a  ErrorMsg.** is z
e9e0: 65 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72  ero if the error
e9f0: 20 6d 65 73 73 61 67 65 20 66 69 74 73 20 69 6e   message fits in
ea00: 20 74 68 65 20 62 75 66 66 65 72 2c 20 6f 72 20   the buffer, or 
ea10: 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65  non-zero.** othe
ea20: 72 77 69 73 65 20 28 69 66 20 74 68 65 20 6d 65  rwise (if the me
ea30: 73 73 61 67 65 20 77 61 73 20 74 72 75 6e 63 61  ssage was trunca
ea40: 74 65 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ted)..*/.static 
ea50: 69 6e 74 20 77 69 6e 47 65 74 4c 61 73 74 45 72  int winGetLastEr
ea60: 72 6f 72 4d 73 67 28 44 57 4f 52 44 20 6c 61 73  rorMsg(DWORD las
ea70: 74 45 72 72 6e 6f 2c 20 69 6e 74 20 6e 42 75 66  tErrno, int nBuf
ea80: 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  , char *zBuf){. 
ea90: 20 2f 2a 20 46 6f 72 6d 61 74 4d 65 73 73 61 67   /* FormatMessag
eaa0: 65 20 72 65 74 75 72 6e 73 20 30 20 6f 6e 20 66  e returns 0 on f
eab0: 61 69 6c 75 72 65 2e 20 20 4f 74 68 65 72 77 69  ailure.  Otherwi
eac0: 73 65 20 69 74 0a 20 20 2a 2a 20 72 65 74 75 72  se it.  ** retur
ead0: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
eae0: 20 54 43 48 41 52 73 20 77 72 69 74 74 65 6e 20   TCHARs written 
eaf0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20  to the output.  
eb00: 2a 2a 20 62 75 66 66 65 72 2c 20 65 78 63 6c 75  ** buffer, exclu
eb10: 64 69 6e 67 20 74 68 65 20 74 65 72 6d 69 6e 61  ding the termina
eb20: 74 69 6e 67 20 6e 75 6c 6c 20 63 68 61 72 2e 0a  ting null char..
eb30: 20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 64 77 4c    */.  DWORD dwL
eb40: 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  en = 0;.  char *
eb50: 7a 4f 75 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zOut = 0;..  if(
eb60: 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
eb70: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
eb80: 0a 20 20 20 20 57 43 48 41 52 20 7a 54 65 6d 70  .    WCHAR zTemp
eb90: 57 69 64 65 5b 53 51 4c 49 54 45 5f 57 49 4e 33  Wide[SQLITE_WIN3
eba0: 32 5f 4d 41 58 5f 45 52 52 4d 53 47 5f 43 48 41  2_MAX_ERRMSG_CHA
ebb0: 52 53 2b 31 5d 3b 0a 20 20 20 20 64 77 4c 65 6e  RS+1];.    dwLen
ebc0: 20 3d 20 6f 73 46 6f 72 6d 61 74 4d 65 73 73 61   = osFormatMessa
ebd0: 67 65 57 28 46 4f 52 4d 41 54 5f 4d 45 53 53 41  geW(FORMAT_MESSA
ebe0: 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d 20 7c  GE_FROM_SYSTEM |
ebf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ec00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 46 4f                FO
ec10: 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49 47 4e  RMAT_MESSAGE_IGN
ec20: 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20 20 20  ORE_INSERTS,.   
ec30: 20 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 4e 55 4c 4c 2c 0a            NULL,.
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 61 73               las
ec70: 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec90: 20 20 20 20 20 30 2c 0a 20 20 20 20 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 7a 54 65 6d 70 57 69 64 65 2c 0a       zTempWide,.
ecc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ecd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
ece0: 49 54 45 5f 57 49 4e 33 32 5f 4d 41 58 5f 45 52  ITE_WIN32_MAX_ER
ecf0: 52 4d 53 47 5f 43 48 41 52 53 2c 0a 20 20 20 20  RMSG_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 30 29 3b 0a 23 65 6c           0);.#el
ed20: 73 65 0a 20 20 20 20 4c 50 57 53 54 52 20 7a 54  se.    LPWSTR zT
ed30: 65 6d 70 57 69 64 65 20 3d 20 4e 55 4c 4c 3b 0a  empWide = NULL;.
ed40: 20 20 20 20 64 77 4c 65 6e 20 3d 20 6f 73 46 6f      dwLen = osFo
ed50: 72 6d 61 74 4d 65 73 73 61 67 65 57 28 46 4f 52  rmatMessageW(FOR
ed60: 4d 41 54 5f 4d 45 53 53 41 47 45 5f 41 4c 4c 4f  MAT_MESSAGE_ALLO
ed70: 43 41 54 45 5f 42 55 46 46 45 52 20 7c 0a 20 20  CATE_BUFFER |.  
ed80: 20 20 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 46 4f 52 4d 41             FORMA
eda0: 54 5f 4d 45 53 53 41 47 45 5f 46 52 4f 4d 5f 53  T_MESSAGE_FROM_S
edb0: 59 53 54 45 4d 20 7c 0a 20 20 20 20 20 20 20 20  YSTEM |.        
edc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
edd0: 20 20 20 20 20 46 4f 52 4d 41 54 5f 4d 45 53 53       FORMAT_MESS
ede0: 41 47 45 5f 49 47 4e 4f 52 45 5f 49 4e 53 45 52  AGE_IGNORE_INSER
edf0: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee10: 20 4e 55 4c 4c 2c 0a 20 20 20 20 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 6c 61 73 74 45 72 72 6e 6f 2c 0a 20      lastErrno,. 
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 0a 20              0,. 
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 28 4c 50 57              (LPW
ee80: 53 54 52 29 20 26 7a 54 65 6d 70 57 69 64 65 2c  STR) &zTempWide,
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
eeb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 29                0)
eed0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
eee0: 20 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20   dwLen > 0 ){.  
eef0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
ef00: 61 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e  a buffer and con
ef10: 76 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a  vert to UTF8 */.
ef20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67        sqlite3Beg
ef30: 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
ef40: 3b 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77  ;.      zOut = w
ef50: 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  inUnicodeToUtf8(
ef60: 7a 54 65 6d 70 57 69 64 65 29 3b 0a 20 20 20 20  zTempWide);.    
ef70: 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
ef80: 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 23 69 66 20  gnMalloc();.#if 
ef90: 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
efa0: 0a 20 20 20 20 20 20 2f 2a 20 66 72 65 65 20 74  .      /* free t
efb0: 68 65 20 73 79 73 74 65 6d 20 62 75 66 66 65 72  he system buffer
efc0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 46 6f   allocated by Fo
efd0: 72 6d 61 74 4d 65 73 73 61 67 65 20 2a 2f 0a 20  rmatMessage */. 
efe0: 20 20 20 20 20 6f 73 4c 6f 63 61 6c 46 72 65 65       osLocalFree
eff0: 28 7a 54 65 6d 70 57 69 64 65 29 3b 0a 23 65 6e  (zTempWide);.#en
f000: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69  dif.    }.  }.#i
f010: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33  fdef SQLITE_WIN3
f020: 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73  2_HAS_ANSI.  els
f030: 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54 65  e{.    char *zTe
f040: 6d 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 64  mp = NULL;.    d
f050: 77 4c 65 6e 20 3d 20 6f 73 46 6f 72 6d 61 74 4d  wLen = osFormatM
f060: 65 73 73 61 67 65 41 28 46 4f 52 4d 41 54 5f 4d  essageA(FORMAT_M
f070: 45 53 53 41 47 45 5f 41 4c 4c 4f 43 41 54 45 5f  ESSAGE_ALLOCATE_
f080: 42 55 46 46 45 52 20 7c 0a 20 20 20 20 20 20 20  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 46 4f 52 4d 41 54 5f 4d 45 53        FORMAT_MES
f0b0: 53 41 47 45 5f 46 52 4f 4d 5f 53 59 53 54 45 4d  SAGE_FROM_SYSTEM
f0c0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0e0: 46 4f 52 4d 41 54 5f 4d 45 53 53 41 47 45 5f 49  FORMAT_MESSAGE_I
f0f0: 47 4e 4f 52 45 5f 49 4e 53 45 52 54 53 2c 0a 20  GNORE_INSERTS,. 
f100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
f120: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
f140: 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
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 30 2c 0a 20 20 20 20 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 28 4c 50 53 54 52 29 20 26         (LPSTR) &
f190: 7a 54 65 6d 70 2c 0a 20 20 20 20 20 20 20 20 20  zTemp,.         
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 20 20 20 20 30 2c 0a 20 20 20 20 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 30 29 3b 0a 20 20 20 20 69 66 28 20      0);.    if( 
f1e0: 64 77 4c 65 6e 20 3e 20 30 20 29 7b 0a 20 20 20  dwLen > 0 ){.   
f1f0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 61     /* allocate a
f200: 20 62 75 66 66 65 72 20 61 6e 64 20 63 6f 6e 76   buffer and conv
f210: 65 72 74 20 74 6f 20 55 54 46 38 20 2a 2f 0a 20  ert to UTF8 */. 
f220: 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
f230: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
f240: 0a 20 20 20 20 20 20 7a 4f 75 74 20 3d 20 77 69  .      zOut = wi
f250: 6e 4d 62 63 73 54 6f 55 74 66 38 28 7a 54 65 6d  nMbcsToUtf8(zTem
f260: 70 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73  p, osAreFileApis
f270: 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 20 20 73  ANSI());.      s
f280: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
f290: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 2f  alloc();.      /
f2a0: 2a 20 66 72 65 65 20 74 68 65 20 73 79 73 74 65  * free the syste
f2b0: 6d 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61 74  m buffer allocat
f2c0: 65 64 20 62 79 20 46 6f 72 6d 61 74 4d 65 73 73  ed by FormatMess
f2d0: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 6f 73 4c  age */.      osL
f2e0: 6f 63 61 6c 46 72 65 65 28 7a 54 65 6d 70 29 3b  ocalFree(zTemp);
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
f300: 66 0a 20 20 69 66 28 20 30 20 3d 3d 20 64 77 4c  f.  if( 0 == dwL
f310: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
f320: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f330: 20 7a 42 75 66 2c 20 22 4f 73 45 72 72 6f 72 20   zBuf, "OsError 
f340: 30 78 25 6c 78 20 28 25 6c 75 29 22 2c 20 6c 61  0x%lx (%lu)", la
f350: 73 74 45 72 72 6e 6f 2c 20 6c 61 73 74 45 72 72  stErrno, lastErr
f360: 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  no);.  }else{.  
f370: 20 20 2f 2a 20 63 6f 70 79 20 61 20 6d 61 78 69    /* copy a maxi
f380: 6d 75 6d 20 6f 66 20 6e 42 75 66 20 63 68 61 72  mum of nBuf char
f390: 73 20 74 6f 20 6f 75 74 70 75 74 20 62 75 66 66  s to output buff
f3a0: 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
f3b0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
f3c0: 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4f 75   zBuf, "%s", zOu
f3d0: 74 29 3b 0a 20 20 20 20 2f 2a 20 66 72 65 65 20  t);.    /* free 
f3e0: 74 68 65 20 55 54 46 38 20 62 75 66 66 65 72 20  the UTF8 buffer 
f3f0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  */.    sqlite3_f
f400: 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 7d 0a 20  ree(zOut);.  }. 
f410: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
f420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
f430: 74 69 6f 6e 20 2d 20 77 69 6e 4c 6f 67 45 72 72  tion - winLogErr
f440: 6f 72 41 74 4c 69 6e 65 28 29 20 2d 20 69 73 20  orAtLine() - is 
f450: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
f460: 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a   via the macro.*
f470: 2a 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 29 2e  * winLogError().
f480: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
f490: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 61  ine is invoked a
f4a0: 66 74 65 72 20 61 6e 20 65 72 72 6f 72 20 6f 63  fter an error oc
f4b0: 63 75 72 73 20 69 6e 20 61 6e 20 4f 53 20 66 75  curs in an OS fu
f4c0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 6c 6f  nction..** It lo
f4d0: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
f4e0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
f4f0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
f500: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
f510: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 61  .** error code a
f520: 6e 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  nd, if possible,
f530: 20 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61   the human-reada
f540: 62 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66  ble equivalent f
f550: 72 6f 6d 0a 2a 2a 20 46 6f 72 6d 61 74 4d 65 73  rom.** FormatMes
f560: 73 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sage..**.** The 
f570: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  first argument p
f580: 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d 61 63  assed to the mac
f590: 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74 68 65  ro should be the
f5a0: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68 61 74   error code that
f5b0: 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 74 75  .** will be retu
f5c0: 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 28  rned to SQLite (
f5d0: 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  e.g. SQLITE_IOER
f5e0: 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49 54 45  R_DELETE, SQLITE
f5f0: 5f 43 41 4e 54 4f 50 45 4e 29 2e 0a 2a 2a 20 54  _CANTOPEN)..** T
f600: 68 65 20 74 77 6f 20 73 75 62 73 65 71 75 65 6e  he two subsequen
f610: 74 20 61 72 67 75 6d 65 6e 74 73 20 73 68 6f 75  t arguments shou
f620: 6c 64 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ld be the name o
f630: 66 20 74 68 65 20 4f 53 20 66 75 6e 63 74 69 6f  f the OS functio
f640: 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64  n that.** failed
f650: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
f660: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
f670: 70 61 74 68 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f  path, if any..*/
f680: 0a 23 64 65 66 69 6e 65 20 77 69 6e 4c 6f 67 45  .#define winLogE
f690: 72 72 6f 72 28 61 2c 62 2c 63 2c 64 29 20 20 20  rror(a,b,c,d)   
f6a0: 77 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  winLogErrorAtLin
f6b0: 65 28 61 2c 62 2c 63 2c 64 2c 5f 5f 4c 49 4e 45  e(a,b,c,d,__LINE
f6c0: 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 77  __).static int w
f6d0: 69 6e 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  inLogErrorAtLine
f6e0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
f710: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 44 57  ror code */.  DW
f720: 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 2c 20 20  ORD lastErrno,  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f740: 20 57 69 6e 33 32 20 6c 61 73 74 20 65 72 72 6f   Win32 last erro
f750: 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
f760: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
f770: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
f780: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
f790: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
f7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
f7b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
f7c0: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
f7d0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
f7e0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
f7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f800: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
f810: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
f820: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
f830: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 7a  d */.){.  char z
f840: 4d 73 67 5b 35 30 30 5d 3b 20 20 20 20 20 20 20  Msg[500];       
f850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 75 6d            /* Hum
f860: 61 6e 20 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an readable erro
f870: 72 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  r text */.  int 
f880: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
f890: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
f8a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
f8b0: 20 20 7a 4d 73 67 5b 30 5d 20 3d 20 30 3b 0a 20    zMsg[0] = 0;. 
f8c0: 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72   winGetLastError
f8d0: 4d 73 67 28 6c 61 73 74 45 72 72 6e 6f 2c 20 73  Msg(lastErrno, s
f8e0: 69 7a 65 6f 66 28 7a 4d 73 67 29 2c 20 7a 4d 73  izeof(zMsg), zMs
f8f0: 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 72  g);.  assert( er
f900: 72 63 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b  rcode!=SQLITE_OK
f910: 20 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 3d   );.  if( zPath=
f920: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
f930: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4d 73 67  .  for(i=0; zMsg
f940: 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69 5d 21 3d  [i] && zMsg[i]!=
f950: 27 5c 72 27 20 26 26 20 7a 4d 73 67 5b 69 5d 21  '\r' && zMsg[i]!
f960: 3d 27 5c 6e 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\n'; i++){}.  
f970: 7a 4d 73 67 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  zMsg[i] = 0;.  s
f980: 71 6c 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f  qlite3_log(errco
f990: 64 65 2c 0a 20 20 20 20 20 20 22 6f 73 5f 77 69  de,.      "os_wi
f9a0: 6e 2e 63 3a 25 64 3a 20 28 25 6c 75 29 20 25 73  n.c:%d: (%lu) %s
f9b0: 28 25 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20  (%s) - %s",.    
f9c0: 20 20 69 4c 69 6e 65 2c 20 6c 61 73 74 45 72 72    iLine, lastErr
f9d0: 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74 68  no, zFunc, zPath
f9e0: 2c 20 7a 4d 73 67 0a 20 20 29 3b 0a 0a 20 20 72  , zMsg.  );..  r
f9f0: 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a 7d  eturn errcode;.}
fa00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
fa10: 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
fa20: 20 61 20 52 65 61 64 46 69 6c 65 28 29 2c 20 57   a ReadFile(), W
fa30: 72 69 74 65 46 69 6c 65 28 29 2c 20 61 6e 64 20  riteFile(), and 
fa40: 44 65 6c 65 74 65 46 69 6c 65 28 29 0a 2a 2a 20  DeleteFile().** 
fa50: 77 69 6c 6c 20 62 65 20 72 65 74 72 69 65 64 20  will be retried 
fa60: 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 6c 6f 63 6b  following a lock
fa70: 69 6e 67 20 65 72 72 6f 72 20 2d 20 70 72 6f 62  ing error - prob
fa80: 61 62 6c 79 20 63 61 75 73 65 64 20 62 79 0a 2a  ably caused by.*
fa90: 2a 20 61 6e 74 69 76 69 72 75 73 20 73 6f 66 74  * antivirus soft
faa0: 77 61 72 65 2e 20 20 41 6c 73 6f 20 74 68 65 20  ware.  Also the 
fab0: 69 6e 69 74 69 61 6c 20 64 65 6c 61 79 20 62 65  initial delay be
fac0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 72  fore the first r
fad0: 65 74 72 79 2e 0a 2a 2a 20 54 68 65 20 64 65 6c  etry..** The del
fae0: 61 79 20 69 6e 63 72 65 61 73 65 73 20 6c 69 6e  ay increases lin
faf0: 65 61 72 6c 79 20 77 69 74 68 20 65 61 63 68 20  early with each 
fb00: 72 65 74 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65  retry..*/.#ifnde
fb10: 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49  f SQLITE_WIN32_I
fb20: 4f 45 52 52 5f 52 45 54 52 59 0a 23 20 64 65 66  OERR_RETRY.# def
fb30: 69 6e 65 20 53 51 4c 49 54 45 5f 57 49 4e 33 32  ine SQLITE_WIN32
fb40: 5f 49 4f 45 52 52 5f 52 45 54 52 59 20 31 30 0a  _IOERR_RETRY 10.
fb50: 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
fb60: 51 4c 49 54 45 5f 57 49 4e 33 32 5f 49 4f 45 52  QLITE_WIN32_IOER
fb70: 52 5f 52 45 54 52 59 5f 44 45 4c 41 59 0a 23 20  R_RETRY_DELAY.# 
fb80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 49  define SQLITE_WI
fb90: 4e 33 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f  N32_IOERR_RETRY_
fba0: 44 45 4c 41 59 20 32 35 0a 23 65 6e 64 69 66 0a  DELAY 25.#endif.
fbb0: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 49 6f  static int winIo
fbc0: 65 72 72 52 65 74 72 79 20 3d 20 53 51 4c 49 54  errRetry = SQLIT
fbd0: 45 5f 57 49 4e 33 32 5f 49 4f 45 52 52 5f 52 45  E_WIN32_IOERR_RE
fbe0: 54 52 59 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  TRY;.static int 
fbf0: 77 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c  winIoerrRetryDel
fc00: 61 79 20 3d 20 53 51 4c 49 54 45 5f 57 49 4e 33  ay = SQLITE_WIN3
fc10: 32 5f 49 4f 45 52 52 5f 52 45 54 52 59 5f 44 45  2_IOERR_RETRY_DE
fc20: 4c 41 59 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LAY;../*.** The 
fc30: 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74 72  "winIoerrCanRetr
fc40: 79 31 22 20 6d 61 63 72 6f 20 69 73 20 75 73 65  y1" macro is use
fc50: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69  d to determine i
fc60: 66 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 49  f a particular I
fc70: 2f 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  /O.** error code
fc80: 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20 47 65   obtained via Ge
fc90: 74 4c 61 73 74 45 72 72 6f 72 28 29 20 69 73 20  tLastError() is 
fca0: 65 6c 69 67 69 62 6c 65 20 74 6f 20 62 65 20 72  eligible to be r
fcb0: 65 74 72 69 65 64 2e 20 20 49 74 0a 2a 2a 20 6d  etried.  It.** m
fcc0: 75 73 74 20 61 63 63 65 70 74 20 74 68 65 20 65  ust accept the e
fcd0: 72 72 6f 72 20 63 6f 64 65 20 44 57 4f 52 44 20  rror code DWORD 
fce0: 61 73 20 69 74 73 20 6f 6e 6c 79 20 61 72 67 75  as its only argu
fcf0: 6d 65 6e 74 20 61 6e 64 20 73 68 6f 75 6c 64 20  ment and should 
fd00: 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65  return.** non-ze
fd10: 72 6f 20 69 66 20 74 68 65 20 65 72 72 6f 72 20  ro if the error 
fd20: 63 6f 64 65 20 69 73 20 74 72 61 6e 73 69 65 6e  code is transien
fd30: 74 20 69 6e 20 6e 61 74 75 72 65 20 61 6e 64 20  t in nature and 
fd40: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  the operation.**
fd50: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
fd60: 20 67 65 6e 65 72 61 74 69 6e 67 20 74 68 65 20   generating the 
fd70: 6f 72 69 67 69 6e 61 6c 20 65 72 72 6f 72 20 6d  original error m
fd80: 69 67 68 74 20 73 75 63 63 65 65 64 20 75 70 6f  ight succeed upo
fd90: 6e 20 62 65 69 6e 67 0a 2a 2a 20 72 65 74 72 69  n being.** retri
fda0: 65 64 2e 20 20 54 68 65 20 61 72 67 75 6d 65 6e  ed.  The argumen
fdb0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
fdc0: 73 68 6f 75 6c 64 20 62 65 20 61 20 76 61 72 69  should be a vari
fdd0: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69  able..**.** Addi
fde0: 74 69 6f 6e 61 6c 6c 79 2c 20 61 20 6d 61 63 72  tionally, a macr
fdf0: 6f 20 6e 61 6d 65 64 20 22 77 69 6e 49 6f 65 72  o named "winIoer
fe00: 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61 79 20  rCanRetry2" may 
fe10: 62 65 20 64 65 66 69 6e 65 64 2e 20 20 49 66 20  be defined.  If 
fe20: 69 74 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  it.** is defined
fe30: 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e  , it will be con
fe40: 73 75 6c 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e  sulted only when
fe50: 20 74 68 65 20 6d 61 63 72 6f 20 22 77 69 6e 49   the macro "winI
fe60: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 22 0a 2a  oerrCanRetry1".*
fe70: 2a 20 72 65 74 75 72 6e 73 20 7a 65 72 6f 2e 20  * returns zero. 
fe80: 20 54 68 65 20 22 77 69 6e 49 6f 65 72 72 43 61   The "winIoerrCa
fe90: 6e 52 65 74 72 79 32 22 20 6d 61 63 72 6f 20 69  nRetry2" macro i
fea0: 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 70 74  s completely opt
feb0: 69 6f 6e 61 6c 20 61 6e 64 0a 2a 2a 20 6d 61 79  ional and.** may
fec0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6e 63 6c   be used to incl
fed0: 75 64 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ude additional e
fee0: 72 72 6f 72 20 63 6f 64 65 73 20 69 6e 20 74 68  rror codes in th
fef0: 65 20 73 65 74 20 74 68 61 74 20 73 68 6f 75 6c  e set that shoul
ff00: 64 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 74  d.** result in t
ff10: 68 65 20 66 61 69 6c 69 6e 67 20 49 2f 4f 20 6f  he failing I/O o
ff20: 70 65 72 61 74 69 6f 6e 20 62 65 69 6e 67 20 72  peration being r
ff30: 65 74 72 69 65 64 20 62 79 20 74 68 65 20 63 61  etried by the ca
ff40: 6c 6c 65 72 2e 20 20 49 66 0a 2a 2a 20 64 65 66  ller.  If.** def
ff50: 69 6e 65 64 2c 20 74 68 65 20 22 77 69 6e 49 6f  ined, the "winIo
ff60: 65 72 72 43 61 6e 52 65 74 72 79 32 22 20 6d 61  errCanRetry2" ma
ff70: 63 72 6f 20 6d 75 73 74 20 65 78 68 69 62 69 74  cro must exhibit
ff80: 20 65 78 74 65 72 6e 61 6c 20 73 65 6d 61 6e 74   external semant
ff90: 69 63 73 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c  ics.** identical
ffa0: 20 74 6f 20 74 68 6f 73 65 20 6f 66 20 74 68 65   to those of the
ffb0: 20 22 77 69 6e 49 6f 65 72 72 43 61 6e 52 65 74   "winIoerrCanRet
ffc0: 72 79 31 22 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23  ry1" macro..*/.#
ffd0: 69 66 20 21 64 65 66 69 6e 65 64 28 77 69 6e 49  if !defined(winI
ffe0: 6f 65 72 72 43 61 6e 52 65 74 72 79 31 29 0a 23  oerrCanRetry1).#
fff0: 64 65 66 69 6e 65 20 77 69 6e 49 6f 65 72 72 43  define winIoerrC
10000 61 6e 52 65 74 72 79 31 28 61 29 20 28 28 28 61  anRetry1(a) (((a
10010 29 3d 3d 45 52 52 4f 52 5f 41 43 43 45 53 53 5f  )==ERROR_ACCESS_
10020 44 45 4e 49 45 44 29 20 20 20 20 20 20 20 20 7c  DENIED)        |
10030 7c 20 5c 0a 20 20 20 20 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 28 28 61 29 3d 3d 45 52 52 4f 52 5f 53 48    ((a)==ERROR_SH
10060 41 52 49 4e 47 5f 56 49 4f 4c 41 54 49 4f 4e 29  ARING_VIOLATION)
10070 20 20 20 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20      || \.       
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 28 28 61 29 3d 3d 45 52 52         ((a)==ERR
100a0 4f 52 5f 4c 4f 43 4b 5f 56 49 4f 4c 41 54 49 4f  OR_LOCK_VIOLATIO
100b0 4e 29 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20  N)       || \.  
100c0 20 20 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 28 28 61 29              ((a)
100e0 3d 3d 45 52 52 4f 52 5f 44 45 56 5f 4e 4f 54 5f  ==ERROR_DEV_NOT_
100f0 45 58 49 53 54 29 20 20 20 20 20 20 20 20 7c 7c  EXIST)        ||
10100 20 5c 0a 20 20 20 20 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 28 28 61 29 3d 3d 45 52 52 4f 52 5f 4e 45 54   ((a)==ERROR_NET
10130 4e 41 4d 45 5f 44 45 4c 45 54 45 44 29 20 20 20  NAME_DELETED)   
10140 20 20 20 7c 7c 20 5c 0a 20 20 20 20 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 28 28 61 29 3d 3d 45 52 52 4f        ((a)==ERRO
10170 52 5f 53 45 4d 5f 54 49 4d 45 4f 55 54 29 20 20  R_SEM_TIMEOUT)  
10180 20 20 20 20 20 20 20 20 7c 7c 20 5c 0a 20 20 20          || \.   
10190 20 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 28 28 61 29 3d             ((a)=
101b0 3d 45 52 52 4f 52 5f 4e 45 54 57 4f 52 4b 5f 55  =ERROR_NETWORK_U
101c0 4e 52 45 41 43 48 41 42 4c 45 29 29 0a 23 65 6e  NREACHABLE)).#en
101d0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  dif../*.** If a 
101e0 52 65 61 64 46 69 6c 65 28 29 20 6f 72 20 57 72  ReadFile() or Wr
101f0 69 74 65 46 69 6c 65 28 29 20 65 72 72 6f 72 20  iteFile() error 
10200 6f 63 63 75 72 73 2c 20 69 6e 76 6f 6b 65 20 74  occurs, invoke t
10210 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
10220 6f 20 73 65 65 20 69 66 20 69 74 20 73 68 6f 75  o see if it shou
10230 6c 64 20 62 65 20 72 65 74 72 69 65 64 2e 20 20  ld be retried.  
10240 52 65 74 75 72 6e 20 54 52 55 45 20 74 6f 20 72  Return TRUE to r
10250 65 74 72 79 2e 20 20 52 65 74 75 72 6e 20 46 41  etry.  Return FA
10260 4c 53 45 0a 2a 2a 20 74 6f 20 67 69 76 65 20 75  LSE.** to give u
10270 70 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 2e  p with an error.
10280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
10290 69 6e 52 65 74 72 79 49 6f 65 72 72 28 69 6e 74  inRetryIoerr(int
102a0 20 2a 70 6e 52 65 74 72 79 2c 20 44 57 4f 52 44   *pnRetry, DWORD
102b0 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 44 57 4f   *pError){.  DWO
102c0 52 44 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74  RD e = osGetLast
102d0 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 2a  Error();.  if( *
102e0 70 6e 52 65 74 72 79 3e 3d 77 69 6e 49 6f 65 72  pnRetry>=winIoer
102f0 72 52 65 74 72 79 20 29 7b 0a 20 20 20 20 69 66  rRetry ){.    if
10300 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
10310 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 3b 0a 20    *pError = e;. 
10320 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
10330 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 77 69 6e  0;.  }.  if( win
10340 49 6f 65 72 72 43 61 6e 52 65 74 72 79 31 28 65  IoerrCanRetry1(e
10350 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
10360 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e  _win32_sleep(win
10370 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a  IoerrRetryDelay*
10380 28 31 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20  (1+*pnRetry));. 
10390 20 20 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20     ++*pnRetry;. 
103a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
103b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 77 69 6e  .#if defined(win
103c0 49 6f 65 72 72 43 61 6e 52 65 74 72 79 32 29 0a  IoerrCanRetry2).
103d0 20 20 65 6c 73 65 20 69 66 28 20 77 69 6e 49 6f    else if( winIo
103e0 65 72 72 43 61 6e 52 65 74 72 79 32 28 65 29 20  errCanRetry2(e) 
103f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
10400 69 6e 33 32 5f 73 6c 65 65 70 28 77 69 6e 49 6f  in32_sleep(winIo
10410 65 72 72 52 65 74 72 79 44 65 6c 61 79 2a 28 31  errRetryDelay*(1
10420 2b 2a 70 6e 52 65 74 72 79 29 29 3b 0a 20 20 20  +*pnRetry));.   
10430 20 2b 2b 2a 70 6e 52 65 74 72 79 3b 0a 20 20 20   ++*pnRetry;.   
10440 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 23   return 1;.  }.#
10450 65 6e 64 69 66 0a 20 20 69 66 28 20 70 45 72 72  endif.  if( pErr
10460 6f 72 20 29 7b 0a 20 20 20 20 2a 70 45 72 72 6f  or ){.    *pErro
10470 72 20 3d 20 65 3b 0a 20 20 7d 0a 20 20 72 65 74  r = e;.  }.  ret
10480 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10490 4c 6f 67 20 61 20 49 2f 4f 20 65 72 72 6f 72 20  Log a I/O error 
104a0 72 65 74 72 79 20 65 70 69 73 6f 64 65 2e 0a 2a  retry episode..*
104b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69  /.static void wi
104c0 6e 4c 6f 67 49 6f 65 72 72 28 69 6e 74 20 6e 52  nLogIoerr(int nR
104d0 65 74 72 79 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  etry, int lineno
104e0 29 7b 0a 20 20 69 66 28 20 6e 52 65 74 72 79 20  ){.  if( nRetry 
104f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
10500 6f 67 28 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  og(SQLITE_NOTICE
10510 2c 0a 20 20 20 20 20 20 22 64 65 6c 61 79 65 64  ,.      "delayed
10520 20 25 64 6d 73 20 66 6f 72 20 6c 6f 63 6b 2f 73   %dms for lock/s
10530 68 61 72 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20  haring conflict 
10540 61 74 20 6c 69 6e 65 20 25 64 22 2c 0a 20 20 20  at line %d",.   
10550 20 20 20 77 69 6e 49 6f 65 72 72 52 65 74 72 79     winIoerrRetry
10560 44 65 6c 61 79 2a 6e 52 65 74 72 79 2a 28 6e 52  Delay*nRetry*(nR
10570 65 74 72 79 2b 31 29 2f 32 2c 20 6c 69 6e 65 6e  etry+1)/2, linen
10580 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
10590 2f 2a 0a 2a 2a 20 54 68 69 73 20 23 69 66 20 64  /*.** This #if d
105a0 6f 65 73 20 6e 6f 74 20 72 65 6c 79 20 6f 6e 20  oes not rely on 
105b0 74 68 65 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  the SQLITE_OS_WI
105c0 4e 43 45 20 64 65 66 69 6e 65 20 62 65 63 61 75  NCE define becau
105d0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  se the.** corres
105e0 70 6f 6e 64 69 6e 67 20 73 65 63 74 69 6f 6e 20  ponding section 
105f0 69 6e 20 22 64 61 74 65 2e 63 22 20 63 61 6e 6e  in "date.c" cann
10600 6f 74 20 75 73 65 20 69 74 2e 0a 2a 2f 0a 23 69  ot use it..*/.#i
10610 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
10620 45 5f 4f 4d 49 54 5f 4c 4f 43 41 4c 54 49 4d 45  E_OMIT_LOCALTIME
10630 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 57 49  ) && defined(_WI
10640 4e 33 32 5f 57 43 45 29 20 26 26 20 5c 0a 20 20  N32_WCE) && \.  
10650 20 20 28 21 64 65 66 69 6e 65 64 28 53 51 4c 49    (!defined(SQLI
10660 54 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d  TE_MSVC_LOCALTIM
10670 45 5f 41 50 49 29 20 7c 7c 20 21 53 51 4c 49 54  E_API) || !SQLIT
10680 45 5f 4d 53 56 43 5f 4c 4f 43 41 4c 54 49 4d 45  E_MSVC_LOCALTIME
10690 5f 41 50 49 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  _API)./*.** The 
106a0 4d 53 56 43 20 43 52 54 20 6f 6e 20 57 69 6e 64  MSVC CRT on Wind
106b0 6f 77 73 20 43 45 20 6d 61 79 20 6e 6f 74 20 68  ows CE may not h
106c0 61 76 65 20 61 20 6c 6f 63 61 6c 74 69 6d 65 28  ave a localtime(
106d0 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 53  ) function..** S
106e0 6f 20 64 65 66 69 6e 65 20 61 20 73 75 62 73 74  o define a subst
106f0 69 74 75 74 65 2e 0a 2a 2f 0a 23 20 20 69 6e 63  itute..*/.#  inc
10700 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 73 74  lude <time.h>.st
10710 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65 63 6c  ruct tm *__cdecl
10720 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e 73 74   localtime(const
10730 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a 20 20   time_t *t).{.  
10740 73 74 61 74 69 63 20 73 74 72 75 63 74 20 74 6d  static struct tm
10750 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45 20 75   y;.  FILETIME u
10760 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53 54 45  Tm, lTm;.  SYSTE
10770 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 73 71 6c  MTIME pTm;.  sql
10780 69 74 65 33 5f 69 6e 74 36 34 20 74 36 34 3b 0a  ite3_int64 t64;.
10790 20 20 74 36 34 20 3d 20 2a 74 3b 0a 20 20 74 36    t64 = *t;.  t6
107a0 34 20 3d 20 28 74 36 34 20 2b 20 31 31 36 34 34  4 = (t64 + 11644
107b0 34 37 33 36 30 30 29 2a 31 30 30 30 30 30 30 30  473600)*10000000
107c0 3b 0a 20 20 75 54 6d 2e 64 77 4c 6f 77 44 61 74  ;.  uTm.dwLowDat
107d0 65 54 69 6d 65 20 3d 20 28 44 57 4f 52 44 29 28  eTime = (DWORD)(
107e0 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
107f0 29 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44  );.  uTm.dwHighD
10800 61 74 65 54 69 6d 65 3d 20 28 44 57 4f 52 44 29  ateTime= (DWORD)
10810 28 74 36 34 20 3e 3e 20 33 32 29 3b 0a 20 20 6f  (t64 >> 32);.  o
10820 73 46 69 6c 65 54 69 6d 65 54 6f 4c 6f 63 61 6c  sFileTimeToLocal
10830 46 69 6c 65 54 69 6d 65 28 26 75 54 6d 2c 26 6c  FileTime(&uTm,&l
10840 54 6d 29 3b 0a 20 20 6f 73 46 69 6c 65 54 69 6d  Tm);.  osFileTim
10850 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28 26 6c  eToSystemTime(&l
10860 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e 74 6d  Tm,&pTm);.  y.tm
10870 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59 65 61  _year = pTm.wYea
10880 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e 74 6d  r - 1900;.  y.tm
10890 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f 6e 74  _mon = pTm.wMont
108a0 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f 77 64  h - 1;.  y.tm_wd
108b0 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f 66 57  ay = pTm.wDayOfW
108c0 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64 61 79  eek;.  y.tm_mday
108d0 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20 20 79   = pTm.wDay;.  y
108e0 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d 2e 77  .tm_hour = pTm.w
108f0 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d 69 6e  Hour;.  y.tm_min
10900 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65 3b 0a   = pTm.wMinute;.
10910 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70 54 6d    y.tm_sec = pTm
10920 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65 74 75  .wSecond;.  retu
10930 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn &y;.}.#endif.
10940 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
10950 49 4e 43 45 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  INCE./**********
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
109a0 2a 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e 20  ** This section 
109b0 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 20 66 6f  contains code fo
109c0 72 20 57 69 6e 43 45 20 6f 6e 6c 79 2e 0a 2a 2f  r WinCE only..*/
109d0 0a 23 64 65 66 69 6e 65 20 48 41 4e 44 4c 45 5f  .#define HANDLE_
109e0 54 4f 5f 57 49 4e 46 49 4c 45 28 61 29 20 28 77  TO_WINFILE(a) (w
109f0 69 6e 46 69 6c 65 2a 29 26 28 28 63 68 61 72 2a  inFile*)&((char*
10a00 29 61 29 5b 2d 28 69 6e 74 29 6f 66 66 73 65 74  )a)[-(int)offset
10a10 6f 66 28 77 69 6e 46 69 6c 65 2c 68 29 5d 0a 0a  of(winFile,h)]..
10a20 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
10a30 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 68 61 6e 64  lock on the hand
10a40 6c 65 20 68 0a 2a 2f 0a 73 74 61 74 69 63 20 76  le h.*/.static v
10a50 6f 69 64 20 77 69 6e 63 65 4d 75 74 65 78 41 63  oid winceMutexAc
10a60 71 75 69 72 65 28 48 41 4e 44 4c 45 20 68 29 7b  quire(HANDLE h){
10a70 0a 20 20 20 44 57 4f 52 44 20 64 77 45 72 72 3b  .   DWORD dwErr;
10a80 0a 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 64 77  .   do {.     dw
10a90 45 72 72 20 3d 20 6f 73 57 61 69 74 46 6f 72 53  Err = osWaitForS
10aa0 69 6e 67 6c 65 4f 62 6a 65 63 74 28 68 2c 20 49  ingleObject(h, I
10ab0 4e 46 49 4e 49 54 45 29 3b 0a 20 20 20 7d 20 77  NFINITE);.   } w
10ac0 68 69 6c 65 20 28 64 77 45 72 72 20 21 3d 20 57  hile (dwErr != W
10ad0 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 26 26 20  AIT_OBJECT_0 && 
10ae0 64 77 45 72 72 20 21 3d 20 57 41 49 54 5f 41 42  dwErr != WAIT_AB
10af0 41 4e 44 4f 4e 45 44 29 3b 0a 7d 0a 2f 2a 0a 2a  ANDONED);.}./*.*
10b00 2a 20 52 65 6c 65 61 73 65 20 61 20 6c 6f 63 6b  * Release a lock
10b10 20 61 63 71 75 69 72 65 64 20 62 79 20 77 69 6e   acquired by win
10b20 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 29  ceMutexAcquire()
10b30 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 77 69 6e 63  .*/.#define winc
10b40 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 68 29  eMutexRelease(h)
10b50 20 52 65 6c 65 61 73 65 4d 75 74 65 78 28 68 29   ReleaseMutex(h)
10b60 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
10b70 68 65 20 6d 75 74 65 78 20 61 6e 64 20 73 68 61  he mutex and sha
10b80 72 65 64 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  red memory used 
10b90 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74  for locking in t
10ba0 68 65 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  he file.** descr
10bb0 69 70 74 6f 72 20 70 46 69 6c 65 0a 2a 2f 0a 73  iptor pFile.*/.s
10bc0 74 61 74 69 63 20 69 6e 74 20 77 69 6e 63 65 43  tatic int winceC
10bd0 72 65 61 74 65 4c 6f 63 6b 28 63 6f 6e 73 74 20  reateLock(const 
10be0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
10bf0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29   winFile *pFile)
10c00 7b 0a 20 20 4c 50 57 53 54 52 20 7a 54 6f 6b 3b  {.  LPWSTR zTok;
10c10 0a 20 20 4c 50 57 53 54 52 20 7a 4e 61 6d 65 3b  .  LPWSTR zName;
10c20 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
10c30 6e 6f 3b 0a 20 20 42 4f 4f 4c 20 62 4c 6f 67 67  no;.  BOOL bLogg
10c40 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 42 4f  ed = FALSE;.  BO
10c50 4f 4c 20 62 49 6e 69 74 20 3d 20 54 52 55 45 3b  OL bInit = TRUE;
10c60 0a 0a 20 20 7a 4e 61 6d 65 20 3d 20 77 69 6e 55  ..  zName = winU
10c70 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
10c80 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
10c90 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Name==0 ){.    /
10ca0 2a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 20  * out of memory 
10cb0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
10cc0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
10cd0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _BKPT;.  }..  /*
10ce0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
10cf0 6c 6f 63 61 6c 20 6c 6f 63 6b 64 61 74 61 20 2a  local lockdata *
10d00 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 46 69 6c  /.  memset(&pFil
10d10 65 2d 3e 6c 6f 63 61 6c 2c 20 30 2c 20 73 69 7a  e->local, 0, siz
10d20 65 6f 66 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  eof(pFile->local
10d30 29 29 3b 0a 0a 20 20 2f 2a 20 52 65 70 6c 61 63  ));..  /* Replac
10d40 65 20 74 68 65 20 62 61 63 6b 73 6c 61 73 68 65  e the backslashe
10d50 73 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 6e  s from the filen
10d60 61 6d 65 20 61 6e 64 20 6c 6f 77 65 72 63 61 73  ame and lowercas
10d70 65 20 69 74 0a 20 20 2a 2a 20 74 6f 20 64 65 72  e it.  ** to der
10d80 69 76 65 20 61 20 6d 75 74 65 78 20 6e 61 6d 65  ive a mutex name
10d90 2e 20 2a 2f 0a 20 20 7a 54 6f 6b 20 3d 20 6f 73  . */.  zTok = os
10da0 43 68 61 72 4c 6f 77 65 72 57 28 7a 4e 61 6d 65  CharLowerW(zName
10db0 29 3b 0a 20 20 66 6f 72 20 28 3b 2a 7a 54 6f 6b  );.  for (;*zTok
10dc0 3b 7a 54 6f 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ;zTok++){.    if
10dd0 20 28 2a 7a 54 6f 6b 20 3d 3d 20 27 5c 5c 27 29   (*zTok == '\\')
10de0 20 2a 7a 54 6f 6b 20 3d 20 27 5f 27 3b 0a 20 20   *zTok = '_';.  
10df0 7d 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65 2f 6f  }..  /* Create/o
10e00 70 65 6e 20 74 68 65 20 6e 61 6d 65 64 20 6d 75  pen the named mu
10e10 74 65 78 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e  tex */.  pFile->
10e20 68 4d 75 74 65 78 20 3d 20 6f 73 43 72 65 61 74  hMutex = osCreat
10e30 65 4d 75 74 65 78 57 28 4e 55 4c 4c 2c 20 46 41  eMutexW(NULL, FA
10e40 4c 53 45 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69  LSE, zName);.  i
10e50 66 20 28 21 70 46 69 6c 65 2d 3e 68 4d 75 74 65  f (!pFile->hMute
10e60 78 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  x){.    pFile->l
10e70 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
10e80 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
10e90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e   sqlite3_free(zN
10ea0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
10eb0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
10ec0 49 54 45 5f 49 4f 45 52 52 2c 20 70 46 69 6c 65  ITE_IOERR, pFile
10ed0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
10ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ef0 20 20 20 20 22 77 69 6e 63 65 43 72 65 61 74 65      "winceCreate
10f00 4c 6f 63 6b 31 22 2c 20 7a 46 69 6c 65 6e 61 6d  Lock1", zFilenam
10f10 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63  e);.  }..  /* Ac
10f20 71 75 69 72 65 20 74 68 65 20 6d 75 74 65 78 20  quire the mutex 
10f30 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 69 6e  before continuin
10f40 67 20 2a 2f 0a 20 20 77 69 6e 63 65 4d 75 74 65  g */.  winceMute
10f50 78 41 63 71 75 69 72 65 28 70 46 69 6c 65 2d 3e  xAcquire(pFile->
10f60 68 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 53  hMutex);..  /* S
10f70 69 6e 63 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ince the names o
10f80 66 20 6e 61 6d 65 64 20 6d 75 74 65 78 65 73 2c  f named mutexes,
10f90 20 73 65 6d 61 70 68 6f 72 65 73 2c 20 66 69 6c   semaphores, fil
10fa0 65 20 6d 61 70 70 69 6e 67 73 20 65 74 63 20 61  e mappings etc a
10fb0 72 65 0a 20 20 2a 2a 20 63 61 73 65 2d 73 65 6e  re.  ** case-sen
10fc0 73 69 74 69 76 65 2c 20 74 61 6b 65 20 61 64 76  sitive, take adv
10fd0 61 6e 74 61 67 65 20 6f 66 20 74 68 61 74 20 62  antage of that b
10fe0 79 20 75 70 70 65 72 63 61 73 69 6e 67 20 74 68  y uppercasing th
10ff0 65 20 6d 75 74 65 78 20 6e 61 6d 65 0a 20 20 2a  e mutex name.  *
11000 2a 20 61 6e 64 20 75 73 69 6e 67 20 74 68 61 74  * and using that
11010 20 61 73 20 74 68 65 20 73 68 61 72 65 64 20 66   as the shared f
11020 69 6c 65 6d 61 70 70 69 6e 67 20 6e 61 6d 65 2e  ilemapping name.
11030 0a 20 20 2a 2f 0a 20 20 6f 73 43 68 61 72 55 70  .  */.  osCharUp
11040 70 65 72 57 28 7a 4e 61 6d 65 29 3b 0a 20 20 70  perW(zName);.  p
11050 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 3d 20  File->hShared = 
11060 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61 70 70  osCreateFileMapp
11070 69 6e 67 57 28 49 4e 56 41 4c 49 44 5f 48 41 4e  ingW(INVALID_HAN
11080 44 4c 45 5f 56 41 4c 55 45 2c 20 4e 55 4c 4c 2c  DLE_VALUE, NULL,
11090 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 20 20 20 20 20 20 20 20 20 50 41 47 45 5f 52 45           PAGE_RE
110c0 41 44 57 52 49 54 45 2c 20 30 2c 20 73 69 7a 65  ADWRITE, 0, size
110d0 6f 66 28 77 69 6e 63 65 4c 6f 63 6b 29 2c 0a 20  of(winceLock),. 
110e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 20 20 7a 4e 61 6d 65 29 3b 0a 0a         zName);..
11110 20 20 2f 2a 20 53 65 74 20 61 20 66 6c 61 67 20    /* Set a flag 
11120 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20 77  that indicates w
11130 65 27 72 65 20 74 68 65 20 66 69 72 73 74 20 74  e're the first t
11140 6f 20 63 72 65 61 74 65 20 74 68 65 20 6d 65 6d  o create the mem
11150 6f 72 79 20 73 6f 20 69 74 0a 20 20 2a 2a 20 6d  ory so it.  ** m
11160 75 73 74 20 62 65 20 7a 65 72 6f 2d 69 6e 69 74  ust be zero-init
11170 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 6c 61 73  ialized */.  las
11180 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
11190 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 20  stError();.  if 
111a0 28 6c 61 73 74 45 72 72 6e 6f 20 3d 3d 20 45 52  (lastErrno == ER
111b0 52 4f 52 5f 41 4c 52 45 41 44 59 5f 45 58 49 53  ROR_ALREADY_EXIS
111c0 54 53 29 7b 0a 20 20 20 20 62 49 6e 69 74 20 3d  TS){.    bInit =
111d0 20 46 41 4c 53 45 3b 0a 20 20 7d 0a 0a 20 20 73   FALSE;.  }..  s
111e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 61 6d  qlite3_free(zNam
111f0 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20  e);..  /* If we 
11200 73 75 63 63 65 65 64 65 64 20 69 6e 20 6d 61 6b  succeeded in mak
11210 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
11220 65 6d 6f 72 79 20 68 61 6e 64 6c 65 2c 20 6d 61  emory handle, ma
11230 70 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70  p it. */.  if( p
11240 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 20 29 7b  File->hShared ){
11250 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72  .    pFile->shar
11260 65 64 20 3d 20 28 77 69 6e 63 65 4c 6f 63 6b 2a  ed = (winceLock*
11270 29 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c 65  )osMapViewOfFile
11280 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64 2c  (pFile->hShared,
11290 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 46 49  .             FI
112a0 4c 45 5f 4d 41 50 5f 52 45 41 44 7c 46 49 4c 45  LE_MAP_READ|FILE
112b0 5f 4d 41 50 5f 57 52 49 54 45 2c 20 30 2c 20 30  _MAP_WRITE, 0, 0
112c0 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65 4c 6f  , sizeof(winceLo
112d0 63 6b 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20  ck));.    /* If 
112e0 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2c 20  mapping failed, 
112f0 63 6c 6f 73 65 20 74 68 65 20 73 68 61 72 65 64  close the shared
11300 20 6d 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 61   memory handle a
11310 6e 64 20 65 72 61 73 65 20 69 74 20 2a 2f 0a 20  nd erase it */. 
11320 20 20 20 69 66 28 20 21 70 46 69 6c 65 2d 3e 73     if( !pFile->s
11330 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 70  hared ){.      p
11340 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
11350 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
11360 28 29 3b 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67  ();.      winLog
11370 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
11380 52 52 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  RR, pFile->lastE
11390 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
113a0 20 20 20 20 20 20 20 20 22 77 69 6e 63 65 43 72          "winceCr
113b0 65 61 74 65 4c 6f 63 6b 32 22 2c 20 7a 46 69 6c  eateLock2", zFil
113c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 4c  ename);.      bL
113d0 6f 67 67 65 64 20 3d 20 54 52 55 45 3b 0a 20 20  ogged = TRUE;.  
113e0 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c      osCloseHandl
113f0 65 28 70 46 69 6c 65 2d 3e 68 53 68 61 72 65 64  e(pFile->hShared
11400 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
11410 68 53 68 61 72 65 64 20 3d 20 4e 55 4c 4c 3b 0a  hShared = NULL;.
11420 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
11430 49 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  If shared memory
11440 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 72   could not be cr
11450 65 61 74 65 64 2c 20 74 68 65 6e 20 63 6c 6f 73  eated, then clos
11460 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
11470 66 61 69 6c 20 2a 2f 0a 20 20 69 66 28 20 70 46  fail */.  if( pF
11480 69 6c 65 2d 3e 68 53 68 61 72 65 64 3d 3d 4e 55  ile->hShared==NU
11490 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 62  LL ){.    if( !b
114a0 4c 6f 67 67 65 64 20 29 7b 0a 20 20 20 20 20 20  Logged ){.      
114b0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
114c0 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20   = lastErrno;.  
114d0 20 20 20 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28      winLogError(
114e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 70 46  SQLITE_IOERR, pF
114f0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a  ile->lastErrno,.
11500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11510 20 20 22 77 69 6e 63 65 43 72 65 61 74 65 4c 6f    "winceCreateLo
11520 63 6b 33 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ck3", zFilename)
11530 3b 0a 20 20 20 20 20 20 62 4c 6f 67 67 65 64 20  ;.      bLogged 
11540 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11550 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c 65    winceMutexRele
11560 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65  ase(pFile->hMute
11570 78 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48  x);.    osCloseH
11580 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 4d 75  andle(pFile->hMu
11590 74 65 78 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  tex);.    pFile-
115a0 3e 68 4d 75 74 65 78 20 3d 20 4e 55 4c 4c 3b 0a  >hMutex = NULL;.
115b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
115c0 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 20 20  E_IOERR;.  }..  
115d0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
115e0 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
115f0 69 66 20 77 65 27 72 65 20 73 75 70 70 6f 73 65  if we're suppose
11600 64 20 74 6f 20 2a 2f 0a 20 20 69 66 28 20 62 49  d to */.  if( bI
11610 6e 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  nit ){.    memse
11620 74 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2c  t(pFile->shared,
11630 20 30 2c 20 73 69 7a 65 6f 66 28 77 69 6e 63 65   0, sizeof(wince
11640 4c 6f 63 6b 29 29 3b 0a 20 20 7d 0a 0a 20 20 77  Lock));.  }..  w
11650 69 6e 63 65 4d 75 74 65 78 52 65 6c 65 61 73 65  inceMutexRelease
11660 28 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b  (pFile->hMutex);
11670 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11680 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  _OK;.}../*.** De
11690 73 74 72 6f 79 20 74 68 65 20 70 61 72 74 20 6f  stroy the part o
116a0 66 20 77 69 6e 46 69 6c 65 20 74 68 61 74 20 64  f winFile that d
116b0 65 61 6c 73 20 77 69 74 68 20 77 69 6e 63 65 20  eals with wince 
116c0 6c 6f 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  locks.*/.static 
116d0 76 6f 69 64 20 77 69 6e 63 65 44 65 73 74 72 6f  void winceDestro
116e0 79 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70  yLock(winFile *p
116f0 46 69 6c 65 29 7b 0a 20 20 69 66 20 28 70 46 69  File){.  if (pFi
11700 6c 65 2d 3e 68 4d 75 74 65 78 29 7b 0a 20 20 20  le->hMutex){.   
11710 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65 20   /* Acquire the 
11720 6d 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e  mutex */.    win
11730 63 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70  ceMutexAcquire(p
11740 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a  File->hMutex);..
11750 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
11760 77 69 6e 67 20 62 6c 6f 63 6b 73 20 73 68 6f 75  wing blocks shou
11770 6c 64 20 70 72 6f 62 61 62 6c 79 20 61 73 73 65  ld probably asse
11780 72 74 20 69 6e 20 64 65 62 75 67 20 6d 6f 64 65  rt in debug mode
11790 2c 20 62 75 74 20 74 68 65 79 0a 20 20 20 20 20  , but they.     
117a0 20 20 61 72 65 20 74 6f 20 63 6c 65 61 6e 75 70    are to cleanup
117b0 20 69 6e 20 63 61 73 65 20 61 6e 79 20 6c 6f 63   in case any loc
117c0 6b 73 20 72 65 6d 61 69 6e 65 64 20 6f 70 65 6e  ks remained open
117d0 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 46 69 6c   */.    if (pFil
117e0 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65 72  e->local.nReader
117f0 73 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  s){.      pFile-
11800 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72  >shared->nReader
11810 73 20 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  s --;.    }.    
11820 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11830 2e 62 52 65 73 65 72 76 65 64 29 7b 0a 20 20 20  .bReserved){.   
11840 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
11850 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41  ->bReserved = FA
11860 4c 53 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  LSE;.    }.    i
11870 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e  f (pFile->local.
11880 62 50 65 6e 64 69 6e 67 29 7b 0a 20 20 20 20 20  bPending){.     
11890 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e   pFile->shared->
118a0 62 50 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45  bPending = FALSE
118b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
118c0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45 78  pFile->local.bEx
118d0 63 6c 75 73 69 76 65 29 7b 0a 20 20 20 20 20 20  clusive){.      
118e0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
118f0 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c 53  Exclusive = FALS
11900 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
11910 20 44 65 2d 72 65 66 65 72 65 6e 63 65 20 61 6e   De-reference an
11920 64 20 63 6c 6f 73 65 20 6f 75 72 20 63 6f 70 79  d close our copy
11930 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 6d   of the shared m
11940 65 6d 6f 72 79 20 68 61 6e 64 6c 65 20 2a 2f 0a  emory handle */.
11950 20 20 20 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f      osUnmapViewO
11960 66 46 69 6c 65 28 70 46 69 6c 65 2d 3e 73 68 61  fFile(pFile->sha
11970 72 65 64 29 3b 0a 20 20 20 20 6f 73 43 6c 6f 73  red);.    osClos
11980 65 48 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68  eHandle(pFile->h
11990 53 68 61 72 65 64 29 3b 0a 0a 20 20 20 20 2f 2a  Shared);..    /*
119a0 20 44 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d   Done with the m
119b0 75 74 65 78 20 2a 2f 0a 20 20 20 20 77 69 6e 63  utex */.    winc
119c0 65 4d 75 74 65 78 52 65 6c 65 61 73 65 28 70 46  eMutexRelease(pF
119d0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 20 20  ile->hMutex);.  
119e0 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28    osCloseHandle(
119f0 70 46 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a  pFile->hMutex);.
11a00 20 20 20 20 70 46 69 6c 65 2d 3e 68 4d 75 74 65      pFile->hMute
11a10 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 7d 0a  x = NULL;.  }.}.
11a20 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6d 70 6c 65 6d  ./*.** An implem
11a30 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
11a40 4c 6f 63 6b 46 69 6c 65 28 29 20 41 50 49 20 6f  LockFile() API o
11a50 66 20 57 69 6e 64 6f 77 73 20 66 6f 72 20 43 45  f Windows for CE
11a60 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20  .*/.static BOOL 
11a70 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 0a 20  winceLockFile(. 
11a80 20 4c 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65   LPHANDLE phFile
11a90 2c 0a 20 20 44 57 4f 52 44 20 64 77 46 69 6c 65  ,.  DWORD dwFile
11aa0 4f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44 57 4f  OffsetLow,.  DWO
11ab0 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65 74 48  RD dwFileOffsetH
11ac0 69 67 68 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75  igh,.  DWORD nNu
11ad0 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63  mberOfBytesToLoc
11ae0 6b 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e  kLow,.  DWORD nN
11af0 75 6d 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f  umberOfBytesToLo
11b00 63 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46  ckHigh.){.  winF
11b10 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e  ile *pFile = HAN
11b20 44 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70  DLE_TO_WINFILE(p
11b30 68 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62  hFile);.  BOOL b
11b40 52 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a  Return = FALSE;.
11b50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
11b60 54 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74  TER(dwFileOffset
11b70 48 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f  High);.  UNUSED_
11b80 50 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65  PARAMETER(nNumbe
11b90 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 48 69  rOfBytesToLockHi
11ba0 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46 69  gh);..  if (!pFi
11bb0 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74 75  le->hMutex) retu
11bc0 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63 65  rn TRUE;.  wince
11bd0 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46 69  MutexAcquire(pFi
11be0 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20 20  le->hMutex);..  
11bf0 2f 2a 20 57 61 6e 74 69 6e 67 20 61 6e 20 65 78  /* Wanting an ex
11c00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 3f 20 2a 2f  clusive lock? */
11c10 0a 20 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66  .  if (dwFileOff
11c20 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44  setLow == (DWORD
11c30 29 53 48 41 52 45 44 5f 46 49 52 53 54 0a 20 20  )SHARED_FIRST.  
11c40 20 20 20 20 20 26 26 20 6e 4e 75 6d 62 65 72 4f       && nNumberO
11c50 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c 6f 77 20  fBytesToLockLow 
11c60 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
11c70 5f 53 49 5a 45 29 7b 0a 20 20 20 20 69 66 20 28  _SIZE){.    if (
11c80 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e  pFile->shared->n
11c90 52 65 61 64 65 72 73 20 3d 3d 20 30 20 26 26 20  Readers == 0 && 
11ca0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62  pFile->shared->b
11cb0 45 78 63 6c 75 73 69 76 65 20 3d 3d 20 30 29 7b  Exclusive == 0){
11cc0 0a 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  .       pFile->s
11cd0 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69 76  hared->bExclusiv
11ce0 65 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20  e = TRUE;.      
11cf0 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 45   pFile->local.bE
11d00 78 63 6c 75 73 69 76 65 20 3d 20 54 52 55 45 3b  xclusive = TRUE;
11d10 0a 20 20 20 20 20 20 20 62 52 65 74 75 72 6e 20  .       bReturn 
11d20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20  = TRUE;.    }.  
11d30 7d 0a 0a 20 20 2f 2a 20 57 61 6e 74 20 61 20 72  }..  /* Want a r
11d40 65 61 64 2d 6f 6e 6c 79 20 6c 6f 63 6b 3f 20 2a  ead-only lock? *
11d50 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
11d60 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
11d70 28 44 57 4f 52 44 29 53 48 41 52 45 44 5f 46 49  (DWORD)SHARED_FI
11d80 52 53 54 20 26 26 0a 20 20 20 20 20 20 20 20 20  RST &&.         
11d90 20 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65 73    nNumberOfBytes
11da0 54 6f 4c 6f 63 6b 4c 6f 77 20 3d 3d 20 31 29 7b  ToLockLow == 1){
11db0 0a 20 20 20 20 69 66 20 28 70 46 69 6c 65 2d 3e  .    if (pFile->
11dc0 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73 69  shared->bExclusi
11dd0 76 65 20 3d 3d 20 30 29 7b 0a 20 20 20 20 20 20  ve == 0){.      
11de0 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65  pFile->local.nRe
11df0 61 64 65 72 73 20 2b 2b 3b 0a 20 20 20 20 20 20  aders ++;.      
11e00 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
11e10 2e 6e 52 65 61 64 65 72 73 20 3d 3d 20 31 29 7b  .nReaders == 1){
11e20 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
11e30 73 68 61 72 65 64 2d 3e 6e 52 65 61 64 65 72 73  shared->nReaders
11e40 20 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   ++;.      }.   
11e50 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
11e60 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
11e70 2f 2a 20 57 61 6e 74 20 61 20 70 65 6e 64 69 6e  /* Want a pendin
11e80 67 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  g lock? */.  els
11e90 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11ea0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
11eb0 50 45 4e 44 49 4e 47 5f 42 59 54 45 0a 20 20 20  PENDING_BYTE.   
11ec0 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d 62          && nNumb
11ed0 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b 4c  erOfBytesToLockL
11ee0 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 2f 2a  ow == 1){.    /*
11ef0 20 49 66 20 6e 6f 20 70 65 6e 64 69 6e 67 20 6c   If no pending l
11f00 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 61 63 71  ock has been acq
11f10 75 69 72 65 64 2c 20 74 68 65 6e 20 61 63 71 75  uired, then acqu
11f20 69 72 65 20 69 74 20 2a 2f 0a 20 20 20 20 69 66  ire it */.    if
11f30 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d   (pFile->shared-
11f40 3e 62 50 65 6e 64 69 6e 67 20 3d 3d 20 30 29 20  >bPending == 0) 
11f50 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
11f60 68 61 72 65 64 2d 3e 62 50 65 6e 64 69 6e 67 20  hared->bPending 
11f70 3d 20 54 52 55 45 3b 0a 20 20 20 20 20 20 70 46  = TRUE;.      pF
11f80 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64  ile->local.bPend
11f90 69 6e 67 20 3d 20 54 52 55 45 3b 0a 20 20 20 20  ing = TRUE;.    
11fa0 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55 45    bReturn = TRUE
11fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
11fc0 2a 20 57 61 6e 74 20 61 20 72 65 73 65 72 76 65  * Want a reserve
11fd0 64 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 65 6c 73  d lock? */.  els
11fe0 65 20 69 66 20 28 64 77 46 69 6c 65 4f 66 66 73  e if (dwFileOffs
11ff0 65 74 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29  etLow == (DWORD)
12000 52 45 53 45 52 56 45 44 5f 42 59 54 45 0a 20 20  RESERVED_BYTE.  
12010 20 20 20 20 20 20 20 20 20 26 26 20 6e 4e 75 6d           && nNum
12020 62 65 72 4f 66 42 79 74 65 73 54 6f 4c 6f 63 6b  berOfBytesToLock
12030 4c 6f 77 20 3d 3d 20 31 29 7b 0a 20 20 20 20 69  Low == 1){.    i
12040 66 20 28 70 46 69 6c 65 2d 3e 73 68 61 72 65 64  f (pFile->shared
12050 2d 3e 62 52 65 73 65 72 76 65 64 20 3d 3d 20 30  ->bReserved == 0
12060 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ) {.      pFile-
12070 3e 73 68 61 72 65 64 2d 3e 62 52 65 73 65 72 76  >shared->bReserv
12080 65 64 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 20  ed = TRUE;.     
12090 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 62 52   pFile->local.bR
120a0 65 73 65 72 76 65 64 20 3d 20 54 52 55 45 3b 0a  eserved = TRUE;.
120b0 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
120c0 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
120d0 0a 20 20 77 69 6e 63 65 4d 75 74 65 78 52 65 6c  .  winceMutexRel
120e0 65 61 73 65 28 70 46 69 6c 65 2d 3e 68 4d 75 74  ease(pFile->hMut
120f0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  ex);.  return bR
12100 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
12110 41 6e 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  An implementatio
12120 6e 20 6f 66 20 74 68 65 20 55 6e 6c 6f 63 6b 46  n of the UnlockF
12130 69 6c 65 20 41 50 49 20 6f 66 20 57 69 6e 64 6f  ile API of Windo
12140 77 73 20 66 6f 72 20 43 45 0a 2a 2f 0a 73 74 61  ws for CE.*/.sta
12150 74 69 63 20 42 4f 4f 4c 20 77 69 6e 63 65 55 6e  tic BOOL winceUn
12160 6c 6f 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41  lockFile(.  LPHA
12170 4e 44 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44  NDLE phFile,.  D
12180 57 4f 52 44 20 64 77 46 69 6c 65 4f 66 66 73 65  WORD dwFileOffse
12190 74 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 64 77  tLow,.  DWORD dw
121a0 46 69 6c 65 4f 66 66 73 65 74 48 69 67 68 2c 0a  FileOffsetHigh,.
121b0 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62 65 72 4f    DWORD nNumberO
121c0 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f  fBytesToUnlockLo
121d0 77 2c 0a 20 20 44 57 4f 52 44 20 6e 4e 75 6d 62  w,.  DWORD nNumb
121e0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
121f0 6b 48 69 67 68 0a 29 7b 0a 20 20 77 69 6e 46 69  kHigh.){.  winFi
12200 6c 65 20 2a 70 46 69 6c 65 20 3d 20 48 41 4e 44  le *pFile = HAND
12210 4c 45 5f 54 4f 5f 57 49 4e 46 49 4c 45 28 70 68  LE_TO_WINFILE(ph
12220 46 69 6c 65 29 3b 0a 20 20 42 4f 4f 4c 20 62 52  File);.  BOOL bR
12230 65 74 75 72 6e 20 3d 20 46 41 4c 53 45 3b 0a 0a  eturn = FALSE;..
12240 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
12250 45 52 28 64 77 46 69 6c 65 4f 66 66 73 65 74 48  ER(dwFileOffsetH
12260 69 67 68 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  igh);.  UNUSED_P
12270 41 52 41 4d 45 54 45 52 28 6e 4e 75 6d 62 65 72  ARAMETER(nNumber
12280 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 48  OfBytesToUnlockH
12290 69 67 68 29 3b 0a 0a 20 20 69 66 20 28 21 70 46  igh);..  if (!pF
122a0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 20 72 65 74  ile->hMutex) ret
122b0 75 72 6e 20 54 52 55 45 3b 0a 20 20 77 69 6e 63  urn TRUE;.  winc
122c0 65 4d 75 74 65 78 41 63 71 75 69 72 65 28 70 46  eMutexAcquire(pF
122d0 69 6c 65 2d 3e 68 4d 75 74 65 78 29 3b 0a 0a 20  ile->hMutex);.. 
122e0 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61 20   /* Releasing a 
122f0 72 65 61 64 65 72 20 6c 6f 63 6b 20 6f 72 20 61  reader lock or a
12300 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
12310 20 2a 2f 0a 20 20 69 66 20 28 64 77 46 69 6c 65   */.  if (dwFile
12320 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20 28 44 57  OffsetLow == (DW
12330 4f 52 44 29 53 48 41 52 45 44 5f 46 49 52 53 54  ORD)SHARED_FIRST
12340 29 7b 0a 20 20 20 20 2f 2a 20 44 69 64 20 77 65  ){.    /* Did we
12350 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69   have an exclusi
12360 76 65 20 6c 6f 63 6b 3f 20 2a 2f 0a 20 20 20 20  ve lock? */.    
12370 69 66 20 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c  if (pFile->local
12380 2e 62 45 78 63 6c 75 73 69 76 65 29 7b 0a 20 20  .bExclusive){.  
12390 20 20 20 20 61 73 73 65 72 74 28 6e 4e 75 6d 62      assert(nNumb
123a0 65 72 4f 66 42 79 74 65 73 54 6f 55 6e 6c 6f 63  erOfBytesToUnloc
123b0 6b 4c 6f 77 20 3d 3d 20 28 44 57 4f 52 44 29 53  kLow == (DWORD)S
123c0 48 41 52 45 44 5f 53 49 5a 45 29 3b 0a 20 20 20  HARED_SIZE);.   
123d0 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e     pFile->local.
123e0 62 45 78 63 6c 75 73 69 76 65 20 3d 20 46 41 4c  bExclusive = FAL
123f0 53 45 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  SE;.      pFile-
12400 3e 73 68 61 72 65 64 2d 3e 62 45 78 63 6c 75 73  >shared->bExclus
12410 69 76 65 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20  ive = FALSE;.   
12420 20 20 20 62 52 65 74 75 72 6e 20 3d 20 54 52 55     bReturn = TRU
12430 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  E;.    }..    /*
12440 20 44 69 64 20 77 65 20 6a 75 73 74 20 68 61 76   Did we just hav
12450 65 20 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 3f  e a reader lock?
12460 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 20   */.    else if 
12470 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12480 65 61 64 65 72 73 29 7b 0a 20 20 20 20 20 20 61  eaders){.      a
12490 73 73 65 72 74 28 6e 4e 75 6d 62 65 72 4f 66 42  ssert(nNumberOfB
124a0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
124b0 3d 3d 20 28 44 57 4f 52 44 29 53 48 41 52 45 44  == (DWORD)SHARED
124c0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 20  _SIZE.          
124d0 20 20 20 7c 7c 20 6e 4e 75 6d 62 65 72 4f 66 42     || nNumberOfB
124e0 79 74 65 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20  ytesToUnlockLow 
124f0 3d 3d 20 31 29 3b 0a 20 20 20 20 20 20 70 46 69  == 1);.      pFi
12500 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52 65 61 64 65  le->local.nReade
12510 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 69 66 20  rs --;.      if 
12520 28 70 46 69 6c 65 2d 3e 6c 6f 63 61 6c 2e 6e 52  (pFile->local.nR
12530 65 61 64 65 72 73 20 3d 3d 20 30 29 0a 20 20 20  eaders == 0).   
12540 20 20 20 7b 0a 20 20 20 20 20 20 20 20 70 46 69     {.        pFi
12550 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 6e 52 65 61  le->shared->nRea
12560 64 65 72 73 20 2d 2d 3b 0a 20 20 20 20 20 20 7d  ders --;.      }
12570 0a 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d  .      bReturn =
12580 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d   TRUE;.    }.  }
12590 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67  ..  /* Releasing
125a0 20 61 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20   a pending lock 
125b0 2a 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77  */.  else if (dw
125c0 46 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d  FileOffsetLow ==
125d0 20 28 44 57 4f 52 44 29 50 45 4e 44 49 4e 47 5f   (DWORD)PENDING_
125e0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
125f0 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12600 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12610 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12620 65 2d 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e  e->local.bPendin
12630 67 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  g){.      pFile-
12640 3e 6c 6f 63 61 6c 2e 62 50 65 6e 64 69 6e 67 20  >local.bPending 
12650 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20 20 20 70  = FALSE;.      p
12660 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d 3e 62 50  File->shared->bP
12670 65 6e 64 69 6e 67 20 3d 20 46 41 4c 53 45 3b 0a  ending = FALSE;.
12680 20 20 20 20 20 20 62 52 65 74 75 72 6e 20 3d 20        bReturn = 
12690 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
126a0 20 20 2f 2a 20 52 65 6c 65 61 73 69 6e 67 20 61    /* Releasing a
126b0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 2a   reserved lock *
126c0 2f 0a 20 20 65 6c 73 65 20 69 66 20 28 64 77 46  /.  else if (dwF
126d0 69 6c 65 4f 66 66 73 65 74 4c 6f 77 20 3d 3d 20  ileOffsetLow == 
126e0 28 44 57 4f 52 44 29 52 45 53 45 52 56 45 44 5f  (DWORD)RESERVED_
126f0 42 59 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  BYTE.           
12700 26 26 20 6e 4e 75 6d 62 65 72 4f 66 42 79 74 65  && nNumberOfByte
12710 73 54 6f 55 6e 6c 6f 63 6b 4c 6f 77 20 3d 3d 20  sToUnlockLow == 
12720 31 29 7b 0a 20 20 20 20 69 66 20 28 70 46 69 6c  1){.    if (pFil
12730 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12740 65 64 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ed) {.      pFil
12750 65 2d 3e 6c 6f 63 61 6c 2e 62 52 65 73 65 72 76  e->local.bReserv
12760 65 64 20 3d 20 46 41 4c 53 45 3b 0a 20 20 20 20  ed = FALSE;.    
12770 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 2d    pFile->shared-
12780 3e 62 52 65 73 65 72 76 65 64 20 3d 20 46 41 4c  >bReserved = FAL
12790 53 45 3b 0a 20 20 20 20 20 20 62 52 65 74 75 72  SE;.      bRetur
127a0 6e 20 3d 20 54 52 55 45 3b 0a 20 20 20 20 7d 0a  n = TRUE;.    }.
127b0 20 20 7d 0a 0a 20 20 77 69 6e 63 65 4d 75 74 65    }..  winceMute
127c0 78 52 65 6c 65 61 73 65 28 70 46 69 6c 65 2d 3e  xRelease(pFile->
127d0 68 4d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  hMutex);.  retur
127e0 6e 20 62 52 65 74 75 72 6e 3b 0a 7d 0a 2f 2a 0a  n bReturn;.}./*.
127f0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 73 70  ** End of the sp
12800 65 63 69 61 6c 20 63 6f 64 65 20 66 6f 72 20 77  ecial code for w
12810 69 6e 63 65 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ince.***********
12820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12860 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  **/.#endif /* SQ
12870 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 2a 2f  LITE_OS_WINCE */
12880 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61 20 66  ../*.** Lock a f
12890 69 6c 65 20 72 65 67 69 6f 6e 2e 0a 2a 2f 0a 73  ile region..*/.s
128a0 74 61 74 69 63 20 42 4f 4f 4c 20 77 69 6e 4c 6f  tatic BOOL winLo
128b0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
128c0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
128d0 52 44 20 66 6c 61 67 73 2c 0a 20 20 44 57 4f 52  RD flags,.  DWOR
128e0 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20 44  D offsetLow,.  D
128f0 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68 2c  WORD offsetHigh,
12900 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74 65  .  DWORD numByte
12910 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e 75  sLow,.  DWORD nu
12920 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23 69  mBytesHigh.){.#i
12930 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
12940 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54 45  E.  /*.  ** NOTE
12950 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
12960 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
12970 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
12980 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
12990 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41 50  32.  **       AP
129a0 49 20 4c 6f 63 6b 46 69 6c 65 2e 0a 20 20 2a 2f  I LockFile..  */
129b0 0a 20 20 72 65 74 75 72 6e 20 77 69 6e 63 65 4c  .  return winceL
129c0 6f 63 6b 46 69 6c 65 28 70 68 46 69 6c 65 2c 20  ockFile(phFile, 
129d0 6f 66 66 73 65 74 4c 6f 77 2c 20 6f 66 66 73 65  offsetLow, offse
129e0 74 48 69 67 68 2c 0a 20 20 20 20 20 20 20 20 20  tHigh,.         
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
12a00 6d 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79  mBytesLow, numBy
12a10 74 65 73 48 69 67 68 29 3b 0a 23 65 6c 73 65 0a  tesHigh);.#else.
12a20 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29    if( osIsNT() )
12a30 7b 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44  {.    OVERLAPPED
12a40 20 6f 76 6c 70 3b 0a 20 20 20 20 6d 65 6d 73 65   ovlp;.    memse
12a50 74 28 26 6f 76 6c 70 2c 20 30 2c 20 73 69 7a 65  t(&ovlp, 0, size
12a60 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29 3b  of(OVERLAPPED));
12a70 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74  .    ovlp.Offset
12a80 20 3d 20 6f 66 66 73 65 74 4c 6f 77 3b 0a 20 20   = offsetLow;.  
12a90 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67    ovlp.OffsetHig
12aa0 68 20 3d 20 6f 66 66 73 65 74 48 69 67 68 3b 0a  h = offsetHigh;.
12ab0 20 20 20 20 72 65 74 75 72 6e 20 6f 73 4c 6f 63      return osLoc
12ac0 6b 46 69 6c 65 45 78 28 2a 70 68 46 69 6c 65 2c  kFileEx(*phFile,
12ad0 20 66 6c 61 67 73 2c 20 30 2c 20 6e 75 6d 42 79   flags, 0, numBy
12ae0 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74 65 73  tesLow, numBytes
12af0 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a 20 20  High, &ovlp);.  
12b00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
12b10 6e 20 6f 73 4c 6f 63 6b 46 69 6c 65 28 2a 70 68  n osLockFile(*ph
12b20 46 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c  File, offsetLow,
12b30 20 6f 66 66 73 65 74 48 69 67 68 2c 20 6e 75 6d   offsetHigh, num
12b40 42 79 74 65 73 4c 6f 77 2c 0a 20 20 20 20 20 20  BytesLow,.      
12b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b60 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b 0a 20  numBytesHigh);. 
12b70 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
12b80 2a 2a 20 55 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  ** Unlock a file
12b90 20 72 65 67 69 6f 6e 2e 0a 20 2a 2f 0a 73 74 61   region.. */.sta
12ba0 74 69 63 20 42 4f 4f 4c 20 77 69 6e 55 6e 6c 6f  tic BOOL winUnlo
12bb0 63 6b 46 69 6c 65 28 0a 20 20 4c 50 48 41 4e 44  ckFile(.  LPHAND
12bc0 4c 45 20 70 68 46 69 6c 65 2c 0a 20 20 44 57 4f  LE phFile,.  DWO
12bd0 52 44 20 6f 66 66 73 65 74 4c 6f 77 2c 0a 20 20  RD offsetLow,.  
12be0 44 57 4f 52 44 20 6f 66 66 73 65 74 48 69 67 68  DWORD offsetHigh
12bf0 2c 0a 20 20 44 57 4f 52 44 20 6e 75 6d 42 79 74  ,.  DWORD numByt
12c00 65 73 4c 6f 77 2c 0a 20 20 44 57 4f 52 44 20 6e  esLow,.  DWORD n
12c10 75 6d 42 79 74 65 73 48 69 67 68 0a 29 7b 0a 23  umBytesHigh.){.#
12c20 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
12c30 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4e 4f 54  CE.  /*.  ** NOT
12c40 45 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73  E: Windows CE is
12c50 20 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65   handled differe
12c60 6e 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74  ntly here due it
12c70 73 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69  s lack of the Wi
12c80 6e 33 32 0a 20 20 2a 2a 20 20 20 20 20 20 20 41  n32.  **       A
12c90 50 49 20 55 6e 6c 6f 63 6b 46 69 6c 65 2e 0a 20  PI UnlockFile.. 
12ca0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 77 69 6e   */.  return win
12cb0 63 65 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 68 46  ceUnlockFile(phF
12cc0 69 6c 65 2c 20 6f 66 66 73 65 74 4c 6f 77 2c 20  ile, offsetLow, 
12cd0 6f 66 66 73 65 74 48 69 67 68 2c 0a 20 20 20 20  offsetHigh,.    
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12cf0 20 20 20 20 20 6e 75 6d 42 79 74 65 73 4c 6f 77       numBytesLow
12d00 2c 20 6e 75 6d 42 79 74 65 73 48 69 67 68 29 3b  , numBytesHigh);
12d10 0a 23 65 6c 73 65 0a 20 20 69 66 28 20 6f 73 49  .#else.  if( osI
12d20 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 4f 56 45  sNT() ){.    OVE
12d30 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b 0a 20 20  RLAPPED ovlp;.  
12d40 20 20 6d 65 6d 73 65 74 28 26 6f 76 6c 70 2c 20    memset(&ovlp, 
12d50 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45 52 4c 41  0, sizeof(OVERLA
12d60 50 50 45 44 29 29 3b 0a 20 20 20 20 6f 76 6c 70  PPED));.    ovlp
12d70 2e 4f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .Offset = offset
12d80 4c 6f 77 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66  Low;.    ovlp.Of
12d90 66 73 65 74 48 69 67 68 20 3d 20 6f 66 66 73 65  fsetHigh = offse
12da0 74 48 69 67 68 3b 0a 20 20 20 20 72 65 74 75 72  tHigh;.    retur
12db0 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65 45 78  n osUnlockFileEx
12dc0 28 2a 70 68 46 69 6c 65 2c 20 30 2c 20 6e 75 6d  (*phFile, 0, num
12dd0 42 79 74 65 73 4c 6f 77 2c 20 6e 75 6d 42 79 74  BytesLow, numByt
12de0 65 73 48 69 67 68 2c 20 26 6f 76 6c 70 29 3b 0a  esHigh, &ovlp);.
12df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
12e00 75 72 6e 20 6f 73 55 6e 6c 6f 63 6b 46 69 6c 65  urn osUnlockFile
12e10 28 2a 70 68 46 69 6c 65 2c 20 6f 66 66 73 65 74  (*phFile, offset
12e20 4c 6f 77 2c 20 6f 66 66 73 65 74 48 69 67 68 2c  Low, offsetHigh,
12e30 20 6e 75 6d 42 79 74 65 73 4c 6f 77 2c 0a 20 20   numBytesLow,.  
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e50 20 20 20 20 20 20 6e 75 6d 42 79 74 65 73 48 69        numBytesHi
12e60 67 68 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gh);.  }.#endif.
12e70 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
12e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ec0 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
12ed0 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
12ee0 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
12ef0 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
12f00 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
12f10 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
12f20 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
12f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12f70 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
12f80 53 6f 6d 65 20 4d 69 63 72 6f 73 6f 66 74 20 63  Some Microsoft c
12f90 6f 6d 70 69 6c 65 72 73 20 6c 61 63 6b 20 74 68  ompilers lack th
12fa0 69 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a  is definition..*
12fb0 2f 0a 23 69 66 6e 64 65 66 20 49 4e 56 41 4c 49  /.#ifndef INVALI
12fc0 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54  D_SET_FILE_POINT
12fd0 45 52 0a 23 20 64 65 66 69 6e 65 20 49 4e 56 41  ER.# define INVA
12fe0 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f 49  LID_SET_FILE_POI
12ff0 4e 54 45 52 20 28 28 44 57 4f 52 44 29 2d 31 29  NTER ((DWORD)-1)
13000 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
13010 6f 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ove the current 
13020 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
13030 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 61 73 73  file handle pass
13040 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  ed as the first.
13050 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f  ** argument to o
13060 66 66 73 65 74 20 69 4f 66 66 73 65 74 20 77 69  ffset iOffset wi
13070 74 68 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 49  thin the file. I
13080 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
13090 74 75 72 6e 20 30 2e 0a 2a 2a 20 4f 74 68 65 72  turn 0..** Other
130a0 77 69 73 65 2c 20 73 65 74 20 70 46 69 6c 65 2d  wise, set pFile-
130b0 3e 6c 61 73 74 45 72 72 6e 6f 20 61 6e 64 20 72  >lastErrno and r
130c0 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
130d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
130e0 6e 53 65 65 6b 46 69 6c 65 28 77 69 6e 46 69 6c  nSeekFile(winFil
130f0 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
13100 33 5f 69 6e 74 36 34 20 69 4f 66 66 73 65 74 29  3_int64 iOffset)
13110 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f 53  {.#if !SQLITE_OS
13120 5f 57 49 4e 52 54 0a 20 20 4c 4f 4e 47 20 75 70  _WINRT.  LONG up
13130 70 65 72 42 69 74 73 3b 20 20 20 20 20 20 20 20  perBits;        
13140 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74           /* Most
13150 20 73 69 67 2e 20 33 32 20 62 69 74 73 20 6f 66   sig. 32 bits of
13160 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f 0a 20   new offset */. 
13170 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73 3b   LONG lowerBits;
13180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13190 20 2f 2a 20 4c 65 61 73 74 20 73 69 67 2e 20 33   /* Least sig. 3
131a0 32 20 62 69 74 73 20 6f 66 20 6e 65 77 20 6f 66  2 bits of new of
131b0 66 73 65 74 20 2a 2f 0a 20 20 44 57 4f 52 44 20  fset */.  DWORD 
131c0 64 77 52 65 74 3b 20 20 20 20 20 20 20 20 20 20  dwRet;          
131d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
131e0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 53  ue returned by S
131f0 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 29 20  etFilePointer() 
13200 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45  */.  DWORD lastE
13210 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
13220 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
13230 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61 73  turned by GetLas
13240 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 20 20 4f  tError() */..  O
13250 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69  STRACE(("SEEK fi
13260 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d 25 6c  le=%p, offset=%l
13270 6c 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  ld\n", pFile->h,
13280 20 69 4f 66 66 73 65 74 29 29 3b 0a 0a 20 20 75   iOffset));..  u
13290 70 70 65 72 42 69 74 73 20 3d 20 28 4c 4f 4e 47  pperBits = (LONG
132a0 29 28 28 69 4f 66 66 73 65 74 3e 3e 33 32 29 20  )((iOffset>>32) 
132b0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 20  & 0x7fffffff);. 
132c0 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 28 4c 4f   lowerBits = (LO
132d0 4e 47 29 28 69 4f 66 66 73 65 74 20 26 20 30 78  NG)(iOffset & 0x
132e0 66 66 66 66 66 66 66 66 29 3b 0a 0a 20 20 2f 2a  ffffffff);..  /*
132f0 20 41 50 49 20 6f 64 64 69 74 79 3a 20 49 66 20   API oddity: If 
13300 73 75 63 63 65 73 73 66 75 6c 2c 20 53 65 74 46  successful, SetF
13310 69 6c 65 50 6f 69 6e 74 65 72 28 29 20 72 65 74  ilePointer() ret
13320 75 72 6e 73 20 61 20 64 77 6f 72 64 0a 20 20 2a  urns a dword.  *
13330 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
13340 20 6c 6f 77 65 72 20 33 32 2d 62 69 74 73 20 6f   lower 32-bits o
13350 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 2d 6f  f the new file-o
13360 66 66 73 65 74 2e 20 4f 72 2c 20 69 66 20 69 74  ffset. Or, if it
13370 20 66 61 69 6c 73 2c 0a 20 20 2a 2a 20 69 74 20   fails,.  ** it 
13380 72 65 74 75 72 6e 73 20 49 4e 56 41 4c 49 44 5f  returns INVALID_
13390 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
133a0 2e 20 48 6f 77 65 76 65 72 20 61 63 63 6f 72 64  . However accord
133b0 69 6e 67 20 74 6f 20 4d 53 44 4e 2c 0a 20 20 2a  ing to MSDN,.  *
133c0 2a 20 49 4e 56 41 4c 49 44 5f 53 45 54 5f 46 49  * INVALID_SET_FI
133d0 4c 45 5f 50 4f 49 4e 54 45 52 20 6d 61 79 20 61  LE_POINTER may a
133e0 6c 73 6f 20 62 65 20 61 20 76 61 6c 69 64 20 6e  lso be a valid n
133f0 65 77 20 6f 66 66 73 65 74 2e 20 53 6f 20 74 6f  ew offset. So to
13400 20 64 65 74 65 72 6d 69 6e 65 0a 20 20 2a 2a 20   determine.  ** 
13410 77 68 65 74 68 65 72 20 61 6e 20 65 72 72 6f 72  whether an error
13420 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 6f 63   has actually oc
13430 63 75 72 72 65 64 2c 20 69 74 20 69 73 20 61 6c  curred, it is al
13440 73 6f 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  so necessary to 
13450 63 61 6c 6c 0a 20 20 2a 2a 20 47 65 74 4c 61 73  call.  ** GetLas
13460 74 45 72 72 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  tError()..  */. 
13470 20 64 77 52 65 74 20 3d 20 6f 73 53 65 74 46 69   dwRet = osSetFi
13480 6c 65 50 6f 69 6e 74 65 72 28 70 46 69 6c 65 2d  lePointer(pFile-
13490 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20 26  >h, lowerBits, &
134a0 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
134b0 42 45 47 49 4e 29 3b 0a 0a 20 20 69 66 28 20 28  BEGIN);..  if( (
134c0 64 77 52 65 74 3d 3d 49 4e 56 41 4c 49 44 5f 53  dwRet==INVALID_S
134d0 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a  ET_FILE_POINTER.
134e0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
134f0 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
13500 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
13510 4f 52 29 29 20 29 7b 0a 20 20 20 20 70 46 69 6c  OR)) ){.    pFil
13520 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c  e->lastErrno = l
13530 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77 69  astErrno;.    wi
13540 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
13550 5f 49 4f 45 52 52 5f 53 45 45 4b 2c 20 70 46 69  _IOERR_SEEK, pFi
13560 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20  le->lastErrno,. 
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
13580 77 69 6e 53 65 65 6b 46 69 6c 65 22 2c 20 70 46  winSeekFile", pF
13590 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
135a0 20 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20   OSTRACE(("SEEK 
135b0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
135c0 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22  TE_IOERR_SEEK\n"
135d0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
135e0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
135f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 45 45  .  OSTRACE(("SEE
13600 4b 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51  K file=%p, rc=SQ
13610 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c  LITE_OK\n", pFil
13620 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
13630 20 30 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 0a 20   0;.#else.  /*. 
13640 20 2a 2a 20 53 61 6d 65 20 61 73 20 61 62 6f 76   ** Same as abov
13650 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 74  e, except that t
13660 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  his implementati
13670 6f 6e 20 77 6f 72 6b 73 20 66 6f 72 20 57 69 6e  on works for Win
13680 52 54 2e 0a 20 20 2a 2f 0a 0a 20 20 4c 41 52 47  RT..  */..  LARG
13690 45 5f 49 4e 54 45 47 45 52 20 78 3b 20 20 20 20  E_INTEGER x;    
136a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
136b0 68 65 20 6e 65 77 20 6f 66 66 73 65 74 20 2a 2f  he new offset */
136c0 0a 20 20 42 4f 4f 4c 20 62 52 65 74 3b 20 20 20  .  BOOL bRet;   
136d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
136f0 72 6e 65 64 20 62 79 20 53 65 74 46 69 6c 65 50  rned by SetFileP
13700 6f 69 6e 74 65 72 45 78 28 29 20 2a 2f 0a 0a 20  ointerEx() */.. 
13710 20 78 2e 51 75 61 64 50 61 72 74 20 3d 20 69 4f   x.QuadPart = iO
13720 66 66 73 65 74 3b 0a 20 20 62 52 65 74 20 3d 20  ffset;.  bRet = 
13730 6f 73 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72  osSetFilePointer
13740 45 78 28 70 46 69 6c 65 2d 3e 68 2c 20 78 2c 20  Ex(pFile->h, x, 
13750 30 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a  0, FILE_BEGIN);.
13760 0a 20 20 69 66 28 21 62 52 65 74 29 7b 0a 20 20  .  if(!bRet){.  
13770 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
13780 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
13790 72 6f 72 28 29 3b 0a 20 20 20 20 77 69 6e 4c 6f  ror();.    winLo
137a0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
137b0 45 52 52 5f 53 45 45 4b 2c 20 70 46 69 6c 65 2d  ERR_SEEK, pFile-
137c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
137d0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
137e0 53 65 65 6b 46 69 6c 65 22 2c 20 70 46 69 6c 65  SeekFile", pFile
137f0 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 4f 53  ->zPath);.    OS
13800 54 52 41 43 45 28 28 22 53 45 45 4b 20 66 69 6c  TRACE(("SEEK fil
13810 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%p, rc=SQLITE_
13820 49 4f 45 52 52 5f 53 45 45 4b 5c 6e 22 2c 20 70  IOERR_SEEK\n", p
13830 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72  File->h));.    r
13840 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a 20 20  eturn 1;.  }..  
13850 4f 53 54 52 41 43 45 28 28 22 53 45 45 4b 20 66  OSTRACE(("SEEK f
13860 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
13870 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  E_OK\n", pFile->
13880 68 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  h));.  return 0;
13890 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 53  .#endif.}..#if S
138a0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
138b0 49 5a 45 3e 30 0a 2f 2a 20 46 6f 72 77 61 72 64  IZE>0./* Forward
138c0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 56   references to V
138d0 46 53 20 68 65 6c 70 65 72 20 6d 65 74 68 6f 64  FS helper method
138e0 73 20 75 73 65 64 20 66 6f 72 20 6d 65 6d 6f 72  s used for memor
138f0 79 20 6d 61 70 70 65 64 20 66 69 6c 65 73 20 2a  y mapped files *
13900 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
13910 4d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c 65 2a  Mapfile(winFile*
13920 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  , sqlite3_int64)
13930 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  ;.static int win
13940 55 6e 6d 61 70 66 69 6c 65 28 77 69 6e 46 69 6c  Unmapfile(winFil
13950 65 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e*);.#endif../*.
13960 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e  ** Close a file.
13970 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 72 65 70  .**.** It is rep
13980 6f 72 74 65 64 20 74 68 61 74 20 61 6e 20 61 74  orted that an at
13990 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 61  tempt to close a
139a0 20 68 61 6e 64 6c 65 20 6d 69 67 68 74 20 73 6f   handle might so
139b0 6d 65 74 69 6d 65 73 0a 2a 2a 20 66 61 69 6c 2e  metimes.** fail.
139c0 20 20 54 68 69 73 20 69 73 20 61 20 76 65 72 79    This is a very
139d0 20 75 6e 72 65 61 73 6f 6e 61 62 6c 65 20 72 65   unreasonable re
139e0 73 75 6c 74 2c 20 62 75 74 20 57 69 6e 64 6f 77  sult, but Window
139f0 73 20 69 73 20 6e 6f 74 6f 72 69 6f 75 73 0a 2a  s is notorious.*
13a00 2a 20 66 6f 72 20 62 65 69 6e 67 20 75 6e 72 65  * for being unre
13a10 61 73 6f 6e 61 62 6c 65 20 73 6f 20 49 20 64 6f  asonable so I do
13a20 20 6e 6f 74 20 64 6f 75 62 74 20 74 68 61 74 20   not doubt that 
13a30 69 74 20 6d 69 67 68 74 20 68 61 70 70 65 6e 2e  it might happen.
13a40 20 20 49 66 0a 2a 2a 20 74 68 65 20 63 6c 6f 73    If.** the clos
13a50 65 20 66 61 69 6c 73 2c 20 77 65 20 70 61 75 73  e fails, we paus
13a60 65 20 66 6f 72 20 31 30 30 20 6d 69 6c 6c 69 73  e for 100 millis
13a70 65 63 6f 6e 64 73 20 61 6e 64 20 74 72 79 20 61  econds and try a
13a80 67 61 69 6e 2e 20 20 41 73 0a 2a 2a 20 6d 61 6e  gain.  As.** man
13a90 79 20 61 73 20 4d 58 5f 43 4c 4f 53 45 5f 41 54  y as MX_CLOSE_AT
13aa0 54 45 4d 50 54 20 61 74 74 65 6d 70 74 73 20 74  TEMPT attempts t
13ab0 6f 20 63 6c 6f 73 65 20 74 68 65 20 68 61 6e 64  o close the hand
13ac0 6c 65 20 61 72 65 20 6d 61 64 65 20 62 65 66 6f  le are made befo
13ad0 72 65 0a 2a 2a 20 67 69 76 69 6e 67 20 75 70 20  re.** giving up 
13ae0 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61 6e  and returning an
13af0 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69   error..*/.#defi
13b00 6e 65 20 4d 58 5f 43 4c 4f 53 45 5f 41 54 54 45  ne MX_CLOSE_ATTE
13b10 4d 50 54 20 33 0a 73 74 61 74 69 63 20 69 6e 74  MPT 3.static int
13b20 20 77 69 6e 43 6c 6f 73 65 28 73 71 6c 69 74 65   winClose(sqlite
13b30 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69  3_file *id){.  i
13b40 6e 74 20 72 63 2c 20 63 6e 74 20 3d 20 30 3b 0a  nt rc, cnt = 0;.
13b50 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65    winFile *pFile
13b60 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b   = (winFile*)id;
13b70 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ..  assert( id!=
13b80 30 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 );.#ifndef SQL
13b90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 61  ITE_OMIT_WAL.  a
13ba0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 53  ssert( pFile->pS
13bb0 68 6d 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  hm==0 );.#endif.
13bc0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13bd0 3e 68 21 3d 4e 55 4c 4c 20 26 26 20 70 46 69 6c  >h!=NULL && pFil
13be0 65 2d 3e 68 21 3d 49 4e 56 41 4c 49 44 5f 48 41  e->h!=INVALID_HA
13bf0 4e 44 4c 45 5f 56 41 4c 55 45 20 29 3b 0a 20 20  NDLE_VALUE );.  
13c00 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  OSTRACE(("CLOSE 
13c10 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
13c20 70 2c 20 66 69 6c 65 3d 25 70 5c 6e 22 2c 0a 20  p, file=%p\n",. 
13c30 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
13c40 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
13c50 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
13c60 3e 68 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  >h));..#if SQLIT
13c70 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
13c80 30 0a 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  0.  winUnmapfile
13c90 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
13ca0 0a 20 20 64 6f 7b 0a 20 20 20 20 72 63 20 3d 20  .  do{.    rc = 
13cb0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
13cc0 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 2f 2a 20  ile->h);.    /* 
13cd0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13ce0 20 72 63 3d 30 3b 20 63 6e 74 3d 4d 58 5f 43 4c   rc=0; cnt=MX_CL
13cf0 4f 53 45 5f 41 54 54 45 4d 50 54 3b 20 29 3b 20  OSE_ATTEMPT; ); 
13d00 2a 2f 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  */.  }while( rc=
13d10 3d 30 20 26 26 20 2b 2b 63 6e 74 20 3c 20 4d 58  =0 && ++cnt < MX
13d20 5f 43 4c 4f 53 45 5f 41 54 54 45 4d 50 54 20 26  _CLOSE_ATTEMPT &
13d30 26 20 28 73 71 6c 69 74 65 33 5f 77 69 6e 33 32  & (sqlite3_win32
13d40 5f 73 6c 65 65 70 28 31 30 30 29 2c 20 31 29 20  _sleep(100), 1) 
13d50 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
13d60 5f 57 49 4e 43 45 0a 23 64 65 66 69 6e 65 20 57  _WINCE.#define W
13d70 49 4e 43 45 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  INCE_DELETION_AT
13d80 54 45 4d 50 54 53 20 33 0a 20 20 77 69 6e 63 65  TEMPTS 3.  wince
13d90 44 65 73 74 72 6f 79 4c 6f 63 6b 28 70 46 69 6c  DestroyLock(pFil
13da0 65 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e);.  if( pFile-
13db0 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 20  >zDeleteOnClose 
13dc0 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  ){.    int cnt =
13dd0 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 0a 20   0;.    while(. 
13de0 20 20 20 20 20 20 20 20 20 20 6f 73 44 65 6c 65            osDele
13df0 74 65 46 69 6c 65 57 28 70 46 69 6c 65 2d 3e 7a  teFileW(pFile->z
13e00 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3d 3d  DeleteOnClose)==
13e10 30 0a 20 20 20 20 20 20 20 20 26 26 20 6f 73 47  0.        && osG
13e20 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
13e30 57 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65  W(pFile->zDelete
13e40 4f 6e 43 6c 6f 73 65 29 21 3d 30 78 66 66 66 66  OnClose)!=0xffff
13e50 66 66 66 66 0a 20 20 20 20 20 20 20 20 26 26 20  ffff.        && 
13e60 63 6e 74 2b 2b 20 3c 20 57 49 4e 43 45 5f 44 45  cnt++ < WINCE_DE
13e70 4c 45 54 49 4f 4e 5f 41 54 54 45 4d 50 54 53 0a  LETION_ATTEMPTS.
13e80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
13e90 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
13ea0 70 28 31 30 30 29 3b 20 20 2f 2a 20 57 61 69 74  p(100);  /* Wait
13eb0 20 61 20 6c 69 74 74 6c 65 20 62 65 66 6f 72 65   a little before
13ec0 20 74 72 79 69 6e 67 20 61 67 61 69 6e 20 2a 2f   trying again */
13ed0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13ee0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 7a  e3_free(pFile->z
13ef0 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29 3b 0a  DeleteOnClose);.
13f00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
13f10 20 72 63 20 29 7b 0a 20 20 20 20 70 46 69 6c 65   rc ){.    pFile
13f20 2d 3e 68 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  ->h = NULL;.  }.
13f30 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31    OpenCounter(-1
13f40 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  );.  OSTRACE(("C
13f50 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  LOSE pid=%lu, pF
13f60 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
13f70 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20   rc=%s\n",.     
13f80 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
13f90 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
13fa0 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  File, pFile->h, 
13fb0 72 63 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  rc ? "ok" : "fai
13fc0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
13fd0 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 0a   rc ? SQLITE_OK.
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77 69              : wi
13ff0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
14000 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c 20 6f 73  _IOERR_CLOSE, os
14010 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 2c 0a  GetLastError(),.
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 43 6c            "winCl
14040 6f 73 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ose", pFile->zPa
14050 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  th);.}../*.** Re
14060 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66  ad data from a f
14070 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65  ile into a buffe
14080 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
14090 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62  E_OK if all.** b
140a0 79 74 65 73 20 77 65 72 65 20 72 65 61 64 20 73  ytes were read s
140b0 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20  uccessfully and 
140c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20  SQLITE_IOERR if 
140d0 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
140e0 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
140f0 63 20 69 6e 74 20 77 69 6e 52 65 61 64 28 0a 20  c int winRead(. 
14100 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
14110 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d,          /* F
14120 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
14130 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
14140 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14150 20 2f 2a 20 57 72 69 74 65 20 63 6f 6e 74 65 6e   /* Write conten
14160 74 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  t into this buff
14170 65 72 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c  er */.  int amt,
14180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
141a0 62 79 74 65 73 20 74 6f 20 72 65 61 64 20 2a 2f  bytes to read */
141b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
141c0 20 6f 66 66 73 65 74 20 20 20 20 20 20 20 2f 2a   offset       /*
141d0 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61   Begin reading a
141e0 74 20 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f  t this offset */
141f0 0a 29 7b 0a 23 69 66 20 21 53 51 4c 49 54 45 5f  .){.#if !SQLITE_
14200 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
14210 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
14220 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
14230 0a 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76  .  OVERLAPPED ov
14240 65 72 6c 61 70 70 65 64 3b 20 20 20 20 20 20 20  erlapped;       
14250 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73 65 74     /* The offset
14260 20 66 6f 72 20 52 65 61 64 46 69 6c 65 2e 20 2a   for ReadFile. *
14270 2f 0a 23 65 6e 64 69 66 0a 20 20 77 69 6e 46 69  /.#endif.  winFi
14280 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
14290 46 69 6c 65 2a 29 69 64 3b 20 20 2f 2a 20 66 69  File*)id;  /* fi
142a0 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 44  le handle */.  D
142b0 57 4f 52 44 20 6e 52 65 61 64 3b 20 20 20 20 20  WORD nRead;     
142c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
142d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
142e0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  s actually read 
142f0 66 72 6f 6d 20 66 69 6c 65 20 2a 2f 0a 20 20 69  from file */.  i
14300 6e 74 20 6e 52 65 74 72 79 20 3d 20 30 3b 20 20  nt nRetry = 0;  
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14320 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 74 72  * Number of retr
14330 79 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ys */..  assert(
14340 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65   id!=0 );.  asse
14350 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 20 20 61  rt( amt>0 );.  a
14360 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
14370 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
14380 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
14390 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 29 3b  ITE_IOERR_READ);
143a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
143b0 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
143c0 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 62 75  =%p, file=%p, bu
143d0 66 66 65 72 3d 25 70 2c 20 61 6d 6f 75 6e 74 3d  ffer=%p, amount=
143e0 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20  %d, ".          
143f0 20 22 6f 66 66 73 65 74 3d 25 6c 6c 64 2c 20 6c   "offset=%lld, l
14400 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f 73 47 65 74  ock=%d\n", osGet
14410 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
14420 28 29 2c 20 70 46 69 6c 65 2c 0a 20 20 20 20 20  (), pFile,.     
14430 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20        pFile->h, 
14440 70 42 75 66 2c 20 61 6d 74 2c 20 6f 66 66 73 65  pBuf, amt, offse
14450 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  t, pFile->lockty
14460 70 65 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54  pe));..#if SQLIT
14470 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
14480 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
14490 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
144a0 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
144b0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
144c0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
144d0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
144e0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
144f0 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
14500 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
14510 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
14520 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
14530 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
14540 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
14550 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
14560 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
14570 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
14580 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 4f 53 54   amt);.      OST
14590 52 41 43 45 28 28 22 52 45 41 44 2d 4d 4d 41 50  RACE(("READ-MMAP
145a0 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
145b0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  %p, file=%p, rc=
145c0 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20  SQLITE_OK\n",.  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
145e0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
145f0 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14600 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72  le->h));.      r
14610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14620 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14630 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 28 69    int nCopy = (i
14640 6e 74 29 28 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  nt)(pFile->mmapS
14650 69 7a 65 20 2d 20 6f 66 66 73 65 74 29 3b 0a 20  ize - offset);. 
14660 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
14670 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
14680 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
14690 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
146a0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
146b0 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
146c0 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
146d0 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
146e0 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
146f0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
14700 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
14710 4e 43 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  NCE || defined(S
14720 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
14730 56 45 52 4c 41 50 50 45 44 29 0a 20 20 69 66 28  VERLAPPED).  if(
14740 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
14750 6c 65 2c 20 6f 66 66 73 65 74 29 20 29 7b 0a 20  le, offset) ){. 
14760 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14770 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14780 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14790 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e 22 2c  =SQLITE_FULL\n",
147a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73  .             os
147b0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
147c0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
147d0 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65  ile->h));.    re
147e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
147f0 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 21  ;.  }.  while( !
14800 6f 73 52 65 61 64 46 69 6c 65 28 70 46 69 6c 65  osReadFile(pFile
14810 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20  ->h, pBuf, amt, 
14820 26 6e 52 65 61 64 2c 20 30 29 20 29 7b 0a 23 65  &nRead, 0) ){.#e
14830 6c 73 65 0a 20 20 6d 65 6d 73 65 74 28 26 6f 76  lse.  memset(&ov
14840 65 72 6c 61 70 70 65 64 2c 20 30 2c 20 73 69 7a  erlapped, 0, siz
14850 65 6f 66 28 4f 56 45 52 4c 41 50 50 45 44 29 29  eof(OVERLAPPED))
14860 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f  ;.  overlapped.O
14870 66 66 73 65 74 20 3d 20 28 4c 4f 4e 47 29 28 6f  ffset = (LONG)(o
14880 66 66 73 65 74 20 26 20 30 78 66 66 66 66 66 66  ffset & 0xffffff
14890 66 66 29 3b 0a 20 20 6f 76 65 72 6c 61 70 70 65  ff);.  overlappe
148a0 64 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28  d.OffsetHigh = (
148b0 4c 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33  LONG)((offset>>3
148c0 32 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29  2) & 0x7fffffff)
148d0 3b 0a 20 20 77 68 69 6c 65 28 20 21 6f 73 52 65  ;.  while( !osRe
148e0 61 64 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  adFile(pFile->h,
148f0 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 6e 52 65   pBuf, amt, &nRe
14900 61 64 2c 20 26 6f 76 65 72 6c 61 70 70 65 64 29  ad, &overlapped)
14910 20 26 26 0a 20 20 20 20 20 20 20 20 20 6f 73 47   &&.         osG
14920 65 74 4c 61 73 74 45 72 72 6f 72 28 29 21 3d 45  etLastError()!=E
14930 52 52 4f 52 5f 48 41 4e 44 4c 45 5f 45 4f 46 20  RROR_HANDLE_EOF 
14940 29 7b 0a 23 65 6e 64 69 66 0a 20 20 20 20 44 57  ){.#endif.    DW
14950 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  ORD lastErrno;. 
14960 20 20 20 69 66 28 20 77 69 6e 52 65 74 72 79 49     if( winRetryI
14970 6f 65 72 72 28 26 6e 52 65 74 72 79 2c 20 26 6c  oerr(&nRetry, &l
14980 61 73 74 45 72 72 6e 6f 29 20 29 20 63 6f 6e 74  astErrno) ) cont
14990 69 6e 75 65 3b 0a 20 20 20 20 70 46 69 6c 65 2d  inue;.    pFile-
149a0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73  >lastErrno = las
149b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52  tErrno;.    OSTR
149c0 41 43 45 28 28 22 52 45 41 44 20 70 69 64 3d 25  ACE(("READ pid=%
149d0 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69  lu, pFile=%p, fi
149e0 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
149f0 5f 49 4f 45 52 52 5f 52 45 41 44 5c 6e 22 2c 0a  _IOERR_READ\n",.
14a00 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
14a10 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
14a20 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69  Id(), pFile, pFi
14a30 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 72 65 74  le->h));.    ret
14a40 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
14a50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
14a60 44 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  D, pFile->lastEr
14a70 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
14a80 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
14a90 52 65 61 64 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  Read", pFile->zP
14aa0 61 74 68 29 3b 0a 20 20 7d 0a 20 20 77 69 6e 4c  ath);.  }.  winL
14ab0 6f 67 49 6f 65 72 72 28 6e 52 65 74 72 79 2c 20  ogIoerr(nRetry, 
14ac0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 69 66 28  __LINE__);.  if(
14ad0 20 6e 52 65 61 64 3c 28 44 57 4f 52 44 29 61 6d   nRead<(DWORD)am
14ae0 74 20 29 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65  t ){.    /* Unre
14af0 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
14b00 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
14b10 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
14b20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
14b30 2a 29 70 42 75 66 29 5b 6e 52 65 61 64 5d 2c 20  *)pBuf)[nRead], 
14b40 30 2c 20 61 6d 74 2d 6e 52 65 61 64 29 3b 0a 20  0, amt-nRead);. 
14b50 20 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41     OSTRACE(("REA
14b60 44 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  D pid=%lu, pFile
14b70 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63  =%p, file=%p, rc
14b80 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
14b90 4f 52 54 5f 52 45 41 44 5c 6e 22 2c 0a 20 20 20  ORT_READ\n",.   
14ba0 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43            osGetC
14bb0 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28  urrentProcessId(
14bc0 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  ), pFile, pFile-
14bd0 3e 68 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >h));.    return
14be0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
14bf0 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ORT_READ;.  }.. 
14c00 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
14c10 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25  pid=%lu, pFile=%
14c20 70 2c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53  p, file=%p, rc=S
14c30 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20  QLITE_OK\n",.   
14c40 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
14c50 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
14c60 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
14c70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
14c80 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14c90 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
14ca0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
14cb0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
14cc0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
14cd0 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
14ce0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
14cf0 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
14d00 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72 69  tatic int winWri
14d10 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  te(.  sqlite3_fi
14d20 6c 65 20 2a 69 64 2c 20 20 20 20 20 20 20 20 20  le *id,         
14d30 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f        /* File to
14d40 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20   write into */. 
14d50 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
14d60 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
14d70 20 2f 2a 20 54 68 65 20 62 79 74 65 73 20 74 6f   /* The bytes to
14d80 20 62 65 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   be written */. 
14d90 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14db0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
14dc0 74 65 73 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  tes to write */.
14dd0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
14de0 6f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  offset          
14df0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
14e00 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 67   the file to beg
14e10 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f  in writing at */
14e20 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
14e30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14e40 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
14e50 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
14e60 72 65 64 2c 20 65 6c 73 65 20 66 61 6c 73 65 20  red, else false 
14e70 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  */.  winFile *pF
14e80 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
14e90 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
14ea0 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  dle */.  int nRe
14eb0 74 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  try = 0;        
14ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14ed0 65 72 20 6f 66 20 72 65 74 72 69 65 73 20 2a 2f  er of retries */
14ee0 0a 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ..  assert( amt>
14ef0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14f00 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61  File );.  Simula
14f10 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
14f20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
14f30 49 54 45 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  ITE);.  Simulate
14f40 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 72 65  DiskfullError(re
14f50 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
14f60 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
14f70 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
14f80 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
14f90 2c 20 62 75 66 66 65 72 3d 25 70 2c 20 61 6d 6f  , buffer=%p, amo
14fa0 75 6e 74 3d 25 64 2c 20 22 0a 20 20 20 20 20 20  unt=%d, ".      
14fb0 20 20 20 20 20 22 6f 66 66 73 65 74 3d 25 6c 6c       "offset=%ll
14fc0 64 2c 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 6f  d, lock=%d\n", o
14fd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
14fe0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 0a 20  ssId(), pFile,. 
14ff0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15000 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 6f  >h, pBuf, amt, o
15010 66 66 73 65 74 2c 20 70 46 69 6c 65 2d 3e 6c 6f  ffset, pFile->lo
15020 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69 66 20 64  cktype));..#if d
15030 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4d 4d  efined(SQLITE_MM
15040 41 50 5f 52 45 41 44 57 52 49 54 45 29 20 26 26  AP_READWRITE) &&
15050 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
15060 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
15070 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
15080 66 20 74 68 69 73 20 77 72 69 74 65 20 72 65 71  f this write req
15090 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65  uest as possible
150a0 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a   by transfering.
150b0 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74    ** data from t
150c0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
150d0 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29  g using memcpy()
150e0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  .  */.  if( offs
150f0 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  et<pFile->mmapSi
15100 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66  ze ){.    if( of
15110 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c  fset+amt <= pFil
15120 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
15130 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
15140 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
15150 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
15160 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
15170 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
15180 49 54 45 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75  ITE-MMAP pid=%lu
15190 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65  , pFile=%p, file
151a0 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
151b0 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
151c0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
151d0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
151e0 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  ile, pFile->h));
151f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
15200 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
15210 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
15220 6f 70 79 20 3d 20 28 69 6e 74 29 28 70 46 69 6c  opy = (int)(pFil
15230 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
15240 66 73 65 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d  fset);.      mem
15250 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
15260 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
15270 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
15280 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
15290 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
152a0 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
152b0 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
152c0 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
152d0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
152e0 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
152f0 54 45 5f 4f 53 5f 57 49 4e 43 45 20 7c 7c 20 64  TE_OS_WINCE || d
15300 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
15310 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
15320 44 29 0a 20 20 72 63 20 3d 20 77 69 6e 53 65 65  D).  rc = winSee
15330 6b 46 69 6c 65 28 70 46 69 6c 65 2c 20 6f 66 66  kFile(pFile, off
15340 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  set);.  if( rc==
15350 30 20 29 7b 0a 23 65 6c 73 65 0a 20 20 7b 0a 23  0 ){.#else.  {.#
15360 65 6e 64 69 66 0a 23 69 66 20 21 53 51 4c 49 54  endif.#if !SQLIT
15370 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64  E_OS_WINCE && !d
15380 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49  efined(SQLITE_WI
15390 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45  N32_NO_OVERLAPPE
153a0 44 29 0a 20 20 20 20 4f 56 45 52 4c 41 50 50 45  D).    OVERLAPPE
153b0 44 20 6f 76 65 72 6c 61 70 70 65 64 3b 20 20 20  D overlapped;   
153c0 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 66 66 73       /* The offs
153d0 65 74 20 66 6f 72 20 57 72 69 74 65 46 69 6c 65  et for WriteFile
153e0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
153f0 75 38 20 2a 61 52 65 6d 20 3d 20 28 75 38 20 2a  u8 *aRem = (u8 *
15400 29 70 42 75 66 3b 20 20 20 20 20 20 20 20 2f 2a  )pBuf;        /*
15410 20 44 61 74 61 20 79 65 74 20 74 6f 20 62 65 20   Data yet to be 
15420 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
15430 6e 74 20 6e 52 65 6d 20 3d 20 61 6d 74 3b 20 20  nt nRem = amt;  
15440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15450 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15460 79 65 74 20 74 6f 20 62 65 20 77 72 69 74 74 65  yet to be writte
15470 6e 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6e  n */.    DWORD n
15480 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
15490 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
154a0 77 72 69 74 74 65 6e 20 62 79 20 65 61 63 68 20  written by each 
154b0 57 72 69 74 65 46 69 6c 65 28 29 20 63 61 6c 6c  WriteFile() call
154c0 20 2a 2f 0a 20 20 20 20 44 57 4f 52 44 20 6c 61   */.    DWORD la
154d0 73 74 45 72 72 6e 6f 20 3d 20 4e 4f 5f 45 52 52  stErrno = NO_ERR
154e0 4f 52 3b 20 20 20 2f 2a 20 56 61 6c 75 65 20 72  OR;   /* Value r
154f0 65 74 75 72 6e 65 64 20 62 79 20 47 65 74 4c 61  eturned by GetLa
15500 73 74 45 72 72 6f 72 28 29 20 2a 2f 0a 0a 23 69  stError() */..#i
15510 66 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  f !SQLITE_OS_WIN
15520 43 45 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  CE && !defined(S
15530 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f  QLITE_WIN32_NO_O
15540 56 45 52 4c 41 50 50 45 44 29 0a 20 20 20 20 6d  VERLAPPED).    m
15550 65 6d 73 65 74 28 26 6f 76 65 72 6c 61 70 70 65  emset(&overlappe
15560 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 56 45  d, 0, sizeof(OVE
15570 52 4c 41 50 50 45 44 29 29 3b 0a 20 20 20 20 6f  RLAPPED));.    o
15580 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
15590 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
155a0 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
155b0 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64 2e 4f      overlapped.O
155c0 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c 4f 4e  ffsetHigh = (LON
155d0 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32 29 20  G)((offset>>32) 
155e0 26 20 30 78 37 66 66 66 66 66 66 66 29 3b 0a 23  & 0x7fffffff);.#
155f0 65 6e 64 69 66 0a 0a 20 20 20 20 77 68 69 6c 65  endif..    while
15600 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 23 69 66 20  ( nRem>0 ){.#if 
15610 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20  SQLITE_OS_WINCE 
15620 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
15630 45 5f 57 49 4e 33 32 5f 4e 4f 5f 4f 56 45 52 4c  E_WIN32_NO_OVERL
15640 41 50 50 45 44 29 0a 20 20 20 20 20 20 69 66 28  APPED).      if(
15650 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28 70 46   !osWriteFile(pF
15660 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20 6e 52  ile->h, aRem, nR
15670 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 30 29 20  em, &nWrite, 0) 
15680 29 7b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 69  ){.#else.      i
15690 66 28 20 21 6f 73 57 72 69 74 65 46 69 6c 65 28  f( !osWriteFile(
156a0 70 46 69 6c 65 2d 3e 68 2c 20 61 52 65 6d 2c 20  pFile->h, aRem, 
156b0 6e 52 65 6d 2c 20 26 6e 57 72 69 74 65 2c 20 26  nRem, &nWrite, &
156c0 6f 76 65 72 6c 61 70 70 65 64 29 20 29 7b 0a 23  overlapped) ){.#
156d0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
156e0 28 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28  ( winRetryIoerr(
156f0 26 6e 52 65 74 72 79 2c 20 26 6c 61 73 74 45 72  &nRetry, &lastEr
15700 72 6e 6f 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rno) ) continue;
15710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
15730 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 30 20  sert( nWrite==0 
15740 7c 7c 20 6e 57 72 69 74 65 3c 3d 28 44 57 4f 52  || nWrite<=(DWOR
15750 44 29 6e 52 65 6d 20 29 3b 0a 20 20 20 20 20 20  D)nRem );.      
15760 69 66 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c  if( nWrite==0 ||
15770 20 6e 57 72 69 74 65 3e 28 44 57 4f 52 44 29 6e   nWrite>(DWORD)n
15780 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  Rem ){.        l
15790 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74  astErrno = osGet
157a0 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20  LastError();.   
157b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
157c0 20 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f    }.#if !SQLITE_
157d0 4f 53 5f 57 49 4e 43 45 20 26 26 20 21 64 65 66  OS_WINCE && !def
157e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
157f0 32 5f 4e 4f 5f 4f 56 45 52 4c 41 50 50 45 44 29  2_NO_OVERLAPPED)
15800 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
15810 20 6e 57 72 69 74 65 3b 0a 20 20 20 20 20 20 6f   nWrite;.      o
15820 76 65 72 6c 61 70 70 65 64 2e 4f 66 66 73 65 74  verlapped.Offset
15830 20 3d 20 28 4c 4f 4e 47 29 28 6f 66 66 73 65 74   = (LONG)(offset
15840 20 26 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a   & 0xffffffff);.
15850 20 20 20 20 20 20 6f 76 65 72 6c 61 70 70 65 64        overlapped
15860 2e 4f 66 66 73 65 74 48 69 67 68 20 3d 20 28 4c  .OffsetHigh = (L
15870 4f 4e 47 29 28 28 6f 66 66 73 65 74 3e 3e 33 32  ONG)((offset>>32
15880 29 20 26 20 30 78 37 66 66 66 66 66 66 66 29 3b  ) & 0x7fffffff);
15890 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 52  .#endif.      aR
158a0 65 6d 20 2b 3d 20 6e 57 72 69 74 65 3b 0a 20 20  em += nWrite;.  
158b0 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 57 72 69      nRem -= nWri
158c0 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  te;.    }.    if
158d0 28 20 6e 52 65 6d 3e 30 20 29 7b 0a 20 20 20 20  ( nRem>0 ){.    
158e0 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
158f0 6e 6f 20 3d 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  no = lastErrno;.
15900 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
15910 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
15920 63 20 29 7b 0a 20 20 20 20 69 66 28 20 20 20 28  c ){.    if(   (
15930 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
15940 6f 3d 3d 45 52 52 4f 52 5f 48 41 4e 44 4c 45 5f  o==ERROR_HANDLE_
15950 44 49 53 4b 5f 46 55 4c 4c 20 29 0a 20 20 20 20  DISK_FULL ).    
15960 20 20 20 7c 7c 20 28 20 70 46 69 6c 65 2d 3e 6c     || ( pFile->l
15970 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
15980 44 49 53 4b 5f 46 55 4c 4c 20 29 29 7b 0a 20 20  DISK_FULL )){.  
15990 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57 52      OSTRACE(("WR
159a0 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ITE pid=%lu, pFi
159b0 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20  le=%p, file=%p, 
159c0 72 63 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 5c 6e  rc=SQLITE_FULL\n
159d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
159e0 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72    osGetCurrentPr
159f0 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65  ocessId(), pFile
15a00 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
15a10 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f      return winLo
15a20 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 46 55  gError(SQLITE_FU
15a30 4c 4c 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  LL, pFile->lastE
15a40 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
15a60 77 69 6e 57 72 69 74 65 31 22 2c 20 70 46 69 6c  winWrite1", pFil
15a70 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d  e->zPath);.    }
15a80 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 57  .    OSTRACE(("W
15a90 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70 46  RITE pid=%lu, pF
15aa0 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70 2c  ile=%p, file=%p,
15ab0 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52   rc=SQLITE_IOERR
15ac0 5f 57 52 49 54 45 5c 6e 22 2c 0a 20 20 20 20 20  _WRITE\n",.     
15ad0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
15ae0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
15af0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
15b00 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 77  ));.    return w
15b10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
15b20 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 2c 20 70  E_IOERR_WRITE, p
15b30 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c  File->lastErrno,
15b40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b50 20 20 20 20 20 20 20 20 22 77 69 6e 57 72 69 74          "winWrit
15b60 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  e2", pFile->zPat
15b70 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  h);.  }else{.   
15b80 20 77 69 6e 4c 6f 67 49 6f 65 72 72 28 6e 52 65   winLogIoerr(nRe
15b90 74 72 79 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  try, __LINE__);.
15ba0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
15bb0 57 52 49 54 45 20 70 69 64 3d 25 6c 75 2c 20 70  WRITE pid=%lu, p
15bc0 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25 70  File=%p, file=%p
15bd0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
15be0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
15bf0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
15c00 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
15c10 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75  ile->h));.  retu
15c20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15c30 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
15c40 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
15c50 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
15c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
15c70 69 6e 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  inTruncate(sqlit
15c80 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c  e3_file *id, sql
15c90 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65  ite3_int64 nByte
15ca0 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46  ){.  winFile *pF
15cb0 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29  ile = (winFile*)
15cc0 69 64 3b 20 20 2f 2a 20 46 69 6c 65 20 68 61 6e  id;  /* File han
15cd0 64 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dle object */.  
15ce0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15cf0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
15d00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
15d10 6f 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  or this function
15d20 20 2a 2f 0a 20 20 44 57 4f 52 44 20 6c 61 73 74   */.  DWORD last
15d30 45 72 72 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  Errno;..  assert
15d40 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d  ( pFile );.  Sim
15d50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74  ulateIOError(ret
15d60 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15d70 5f 54 52 55 4e 43 41 54 45 29 3b 0a 20 20 4f 53  _TRUNCATE);.  OS
15d80 54 52 41 43 45 28 28 22 54 52 55 4e 43 41 54 45  TRACE(("TRUNCATE
15d90 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
15da0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 73 69 7a  %p, file=%p, siz
15db0 65 3d 25 6c 6c 64 2c 20 6c 6f 63 6b 3d 25 64 5c  e=%lld, lock=%d\
15dc0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f  n",.           o
15dd0 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65  sGetCurrentProce
15de0 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70  ssId(), pFile, p
15df0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 2c 20  File->h, nByte, 
15e00 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 29  pFile->locktype)
15e10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15e20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
15e30 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
15e40 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
15e50 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
15e60 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
15e70 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
15e80 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
15e90 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
15ea0 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
15eb0 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
15ec0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
15ed0 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
15ee0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
15ef0 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
15f00 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
15f10 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
15f20 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
15f30 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
15f40 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
15f50 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
15f60 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  hunk;.  }..  /* 
15f70 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 29 20 72  SetEndOfFile() r
15f80 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
15f90 77 68 65 6e 20 73 75 63 63 65 73 73 66 75 6c 2c  when successful,
15fa0 20 6f 72 20 7a 65 72 6f 20 77 68 65 6e 20 69 74   or zero when it
15fb0 20 66 61 69 6c 73 2e 20 2a 2f 0a 20 20 69 66 28   fails. */.  if(
15fc0 20 77 69 6e 53 65 65 6b 46 69 6c 65 28 70 46 69   winSeekFile(pFi
15fd0 6c 65 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20  le, nByte) ){.  
15fe0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
15ff0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
16000 54 52 55 4e 43 41 54 45 2c 20 70 46 69 6c 65 2d  TRUNCATE, pFile-
16010 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 22 77 69 6e 54 72 75 6e 63 61 74 65 31 22 2c   "winTruncate1",
16040 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
16050 20 20 7d 65 6c 73 65 20 69 66 28 20 30 3d 3d 6f    }else if( 0==o
16060 73 53 65 74 45 6e 64 4f 66 46 69 6c 65 28 70 46  sSetEndOfFile(pF
16070 69 6c 65 2d 3e 68 29 20 26 26 0a 20 20 20 20 20  ile->h) &&.     
16080 20 20 20 20 20 20 20 28 28 6c 61 73 74 45 72 72         ((lastErr
16090 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
160a0 72 6f 72 28 29 29 21 3d 45 52 52 4f 52 5f 55 53  ror())!=ERROR_US
160b0 45 52 5f 4d 41 50 50 45 44 5f 46 49 4c 45 29 20  ER_MAPPED_FILE) 
160c0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  ){.    pFile->la
160d0 73 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72  stErrno = lastEr
160e0 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 77 69  rno;.    rc = wi
160f0 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
16100 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
16110 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
16120 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
16130 20 20 20 20 20 20 20 20 22 77 69 6e 54 72 75 6e          "winTrun
16140 63 61 74 65 32 22 2c 20 70 46 69 6c 65 2d 3e 7a  cate2", pFile->z
16150 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  Path);.  }..#if 
16160 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
16170 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 49 66 20 74  SIZE>0.  /* If t
16180 68 65 20 66 69 6c 65 20 77 61 73 20 74 72 75 6e  he file was trun
16190 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20  cated to a size 
161a0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
161b0 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 2a 2a 20   currently.  ** 
161c0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
161d0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
161e0 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
161f0 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
16200 20 77 69 6c 6c 0a 20 20 2a 2a 20 75 73 65 20 72   will.  ** use r
16210 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28  ead() and write(
16220 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  ) to access data
16230 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69   beyond this poi
16240 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 0a  nt from now on..
16250 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
16260 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 26 26 20  ->pMapRegion && 
16270 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
16280 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 70 46 69  pSize ){.    pFi
16290 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
162a0 42 79 74 65 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Byte;.  }.#endif
162b0 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  ..  OSTRACE(("TR
162c0 55 4e 43 41 54 45 20 70 69 64 3d 25 6c 75 2c 20  UNCATE pid=%lu, 
162d0 70 46 69 6c 65 3d 25 70 2c 20 66 69 6c 65 3d 25  pFile=%p, file=%
162e0 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  p, rc=%s\n",.   
162f0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
16300 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
16310 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
16320 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
16330 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  (rc)));.  return
16340 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53   rc;.}..#ifdef S
16350 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
16360 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
16370 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
16380 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
16390 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
163a0 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
163b0 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
163c0 63 73 20 61 72 65 20 6f 63 63 75 72 69 6e 67 20  cs are occuring 
163d0 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
163e0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
163f0 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
16400 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
16410 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
16420 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
16430 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
16440 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
16450 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
16460 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
16470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16480 77 69 6e 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  winSync(sqlite3_
16490 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
164a0 61 67 73 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  ags){.#ifndef SQ
164b0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 2f  LITE_NO_SYNC.  /
164c0 2a 0a 20 20 2a 2a 20 55 73 65 64 20 6f 6e 6c 79  *.  ** Used only
164d0 20 77 68 65 6e 20 53 51 4c 49 54 45 5f 4e 4f 5f   when SQLITE_NO_
164e0 53 59 4e 43 20 69 73 20 6e 6f 74 20 64 65 66 69  SYNC is not defi
164f0 6e 65 64 2e 0a 20 20 20 2a 2f 0a 20 20 42 4f 4f  ned..   */.  BOO
16500 4c 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  L rc;.#endif.#if
16510 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
16520 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
16530 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 29 20 7c 7c  LITE_NO_SYNC) ||
16540 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
16550 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
16560 41 43 45 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  ACE).  /*.  ** U
16570 73 65 64 20 77 68 65 6e 20 53 51 4c 49 54 45 5f  sed when SQLITE_
16580 4e 4f 5f 53 59 4e 43 20 69 73 20 6e 6f 74 20 64  NO_SYNC is not d
16590 65 66 69 6e 65 64 20 61 6e 64 20 62 79 20 74 68  efined and by th
165a0 65 20 61 73 73 65 72 74 28 29 20 61 6e 64 2f 6f  e assert() and/o
165b0 72 0a 20 20 2a 2a 20 4f 53 54 52 41 43 45 28 29  r.  ** OSTRACE()
165c0 20 6d 61 63 72 6f 73 2e 0a 20 20 20 2a 2f 0a 20   macros..   */. 
165d0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
165e0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
165f0 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
16600 41 52 41 4d 45 54 45 52 28 69 64 29 3b 0a 23 65  ARAMETER(id);.#e
16610 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
16620 70 46 69 6c 65 20 29 3b 0a 20 20 2f 2a 20 43 68  pFile );.  /* Ch
16630 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
16640 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16650 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
16660 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
16670 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
16680 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
16690 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
166a0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
166b0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
166c0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
166d0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
166e0 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
166f0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
16700 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
16710 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
16720 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
16730 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
16740 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
16750 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
16760 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
16770 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
16780 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16790 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
167a0 25 70 2c 20 66 69 6c 65 3d 25 70 2c 20 66 6c 61  %p, file=%p, fla
167b0 67 73 3d 25 78 2c 20 6c 6f 63 6b 3d 25 64 5c 6e  gs=%x, lock=%d\n
167c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  ",.           os
167d0 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
167e0 73 49 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46  sId(), pFile, pF
167f0 69 6c 65 2d 3e 68 2c 20 66 6c 61 67 73 2c 0a 20  ile->h, flags,. 
16800 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
16810 3e 6c 6f 63 6b 74 79 70 65 29 29 3b 0a 0a 23 69  >locktype));..#i
16820 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  fndef SQLITE_TES
16830 54 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  T.  UNUSED_PARAM
16840 45 54 45 52 28 66 6c 61 67 73 29 3b 0a 23 65 6c  ETER(flags);.#el
16850 73 65 0a 20 20 69 66 28 20 28 66 6c 61 67 73 26  se.  if( (flags&
16860 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
16870 4e 43 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 73  NC_FULL ){.    s
16880 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
16890 63 6f 75 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 73  count++;.  }.  s
168a0 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e  qlite3_sync_coun
168b0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  t++;.#endif..  /
168c0 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64  * If we compiled
168d0 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45   with the SQLITE
168e0 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74  _NO_SYNC flag, t
168f0 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61  hen syncing is a
16900 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f  .  ** no-op.  */
16910 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
16920 4f 5f 53 59 4e 43 0a 20 20 4f 53 54 52 41 43 45  O_SYNC.  OSTRACE
16930 28 28 22 53 59 4e 43 2d 4e 4f 50 20 70 69 64 3d  (("SYNC-NOP pid=
16940 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 66  %lu, pFile=%p, f
16950 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
16960 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
16970 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
16980 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
16990 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  le, pFile->h));.
169a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
169b0 4f 4b 3b 0a 23 65 6c 73 65 0a 23 69 66 20 53 51  OK;.#else.#if SQ
169c0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
169d0 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65  ZE>0.  if( pFile
169e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
169f0 20 20 20 20 69 66 28 20 6f 73 46 6c 75 73 68 56      if( osFlushV
16a00 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65 2d  iewOfFile(pFile-
16a10 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 30 29 20  >pMapRegion, 0) 
16a20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
16a30 28 28 22 53 59 4e 43 2d 4d 4d 41 50 20 70 69 64  (("SYNC-MMAP pid
16a40 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16a50 70 4d 61 70 52 65 67 69 6f 6e 3d 25 70 2c 20 22  pMapRegion=%p, "
16a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16a70 22 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22  "rc=SQLITE_OK\n"
16a80 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72  , osGetCurrentPr
16a90 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20 20  ocessId(),.     
16aa0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2c            pFile,
16ab0 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69   pFile->pMapRegi
16ac0 6f 6e 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  on));.    }else{
16ad0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
16ae0 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
16af0 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
16b00 20 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43    OSTRACE(("SYNC
16b10 2d 4d 4d 41 50 20 70 69 64 3d 25 6c 75 2c 20 70  -MMAP pid=%lu, p
16b20 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65 67  File=%p, pMapReg
16b30 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20 20  ion=%p, ".      
16b40 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51 4c           "rc=SQL
16b50 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c 6e  ITE_IOERR_MMAP\n
16b60 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50  ", osGetCurrentP
16b70 72 6f 63 65 73 73 49 64 28 29 2c 0a 20 20 20 20  rocessId(),.    
16b80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16b90 2c 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  , pFile->pMapReg
16ba0 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ion));.      ret
16bb0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
16bc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
16bd0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
16be0 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
16c00 69 6e 53 79 6e 63 31 22 2c 20 70 46 69 6c 65 2d  inSync1", pFile-
16c10 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20  >zPath);.    }. 
16c20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d   }.#endif.  rc =
16c30 20 6f 73 46 6c 75 73 68 46 69 6c 65 42 75 66 66   osFlushFileBuff
16c40 65 72 73 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ers(pFile->h);. 
16c50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
16c60 28 20 72 63 3d 46 41 4c 53 45 20 29 3b 0a 20 20  ( rc=FALSE );.  
16c70 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 4f 53  if( rc ){.    OS
16c80 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69 64  TRACE(("SYNC pid
16c90 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20  =%lu, pFile=%p, 
16ca0 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49  file=%p, rc=SQLI
16cb0 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20  TE_OK\n",.      
16cc0 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
16cd0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
16ce0 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 29  pFile, pFile->h)
16cf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
16d00 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
16d10 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
16d20 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
16d30 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 4f  stError();.    O
16d40 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 70 69  STRACE(("SYNC pi
16d50 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c  d=%lu, pFile=%p,
16d60 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
16d70 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 5c  ITE_IOERR_FSYNC\
16d80 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
16d90 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
16da0 63 65 73 73 49 64 28 29 2c 20 70 46 69 6c 65 2c  cessId(), pFile,
16db0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
16dc0 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72   return winLogEr
16dd0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
16de0 5f 46 53 59 4e 43 2c 20 70 46 69 6c 65 2d 3e 6c  _FSYNC, pFile->l
16df0 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  astErrno,.      
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 22 77 69 6e 53 79 6e 63 32 22 2c 20 70 46 69   "winSync2", pFi
16e20 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
16e30 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16e40 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
16e50 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
16e60 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
16e70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 46  .static int winF
16e80 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
16e90 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
16ea0 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29 7b  3_int64 *pSize){
16eb0 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c  .  winFile *pFil
16ec0 65 20 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64  e = (winFile*)id
16ed0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
16ee0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
16ef0 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61 73  t( id!=0 );.  as
16f00 73 65 72 74 28 20 70 53 69 7a 65 21 3d 30 20 29  sert( pSize!=0 )
16f10 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
16f20 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
16f30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 29 3b 0a  E_IOERR_FSTAT);.
16f40 20 20 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45    OSTRACE(("SIZE
16f50 20 66 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d   file=%p, pSize=
16f60 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
16f70 20 70 53 69 7a 65 29 29 3b 0a 0a 23 69 66 20 53   pSize));..#if S
16f80 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a 20  QLITE_OS_WINRT. 
16f90 20 7b 0a 20 20 20 20 46 49 4c 45 5f 53 54 41 4e   {.    FILE_STAN
16fa0 44 41 52 44 5f 49 4e 46 4f 20 69 6e 66 6f 3b 0a  DARD_INFO info;.
16fb0 20 20 20 20 69 66 28 20 6f 73 47 65 74 46 69 6c      if( osGetFil
16fc0 65 49 6e 66 6f 72 6d 61 74 69 6f 6e 42 79 48 61  eInformationByHa
16fd0 6e 64 6c 65 45 78 28 70 46 69 6c 65 2d 3e 68 2c  ndleEx(pFile->h,
16fe0 20 46 69 6c 65 53 74 61 6e 64 61 72 64 49 6e 66   FileStandardInf
16ff0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17010 20 20 20 20 20 20 20 20 26 69 6e 66 6f 2c 20 73          &info, s
17020 69 7a 65 6f 66 28 69 6e 66 6f 29 29 20 29 7b 0a  izeof(info)) ){.
17030 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 69        *pSize = i
17040 6e 66 6f 2e 45 6e 64 4f 66 46 69 6c 65 2e 51 75  nfo.EndOfFile.Qu
17050 61 64 50 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73  adPart;.    }els
17060 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
17070 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65  lastErrno = osGe
17080 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
17090 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
170a0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
170b0 52 5f 46 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e  R_FSTAT, pFile->
170c0 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  lastErrno,.     
170d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
170e0 20 20 22 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c    "winFileSize",
170f0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
17100 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a      }.  }.#else.
17110 20 20 7b 0a 20 20 20 20 44 57 4f 52 44 20 75 70    {.    DWORD up
17120 70 65 72 42 69 74 73 3b 0a 20 20 20 20 44 57 4f  perBits;.    DWO
17130 52 44 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  RD lowerBits;.  
17140 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
17150 6f 3b 0a 0a 20 20 20 20 6c 6f 77 65 72 42 69 74  o;..    lowerBit
17160 73 20 3d 20 6f 73 47 65 74 46 69 6c 65 53 69 7a  s = osGetFileSiz
17170 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 75 70 70  e(pFile->h, &upp
17180 65 72 42 69 74 73 29 3b 0a 20 20 20 20 2a 70 53  erBits);.    *pS
17190 69 7a 65 20 3d 20 28 28 28 73 71 6c 69 74 65 33  ize = (((sqlite3
171a0 5f 69 6e 74 36 34 29 75 70 70 65 72 42 69 74 73  _int64)upperBits
171b0 29 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69  )<<32) + lowerBi
171c0 74 73 3b 0a 20 20 20 20 69 66 28 20 20 20 28 6c  ts;.    if(   (l
171d0 6f 77 65 72 42 69 74 73 20 3d 3d 20 49 4e 56 41  owerBits == INVA
171e0 4c 49 44 5f 46 49 4c 45 5f 53 49 5a 45 29 0a 20  LID_FILE_SIZE). 
171f0 20 20 20 20 20 20 26 26 20 28 28 6c 61 73 74 45        && ((lastE
17200 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
17210 45 72 72 6f 72 28 29 29 21 3d 4e 4f 5f 45 52 52  Error())!=NO_ERR
17220 4f 52 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  OR) ){.      pFi
17230 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
17240 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
17250 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f   rc = winLogErro
17260 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
17270 53 54 41 54 2c 20 70 46 69 6c 65 2d 3e 6c 61 73  STAT, pFile->las
17280 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20  tErrno,.        
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
172a0 77 69 6e 46 69 6c 65 53 69 7a 65 22 2c 20 70 46  winFileSize", pF
172b0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
172c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
172d0 4f 53 54 52 41 43 45 28 28 22 53 49 5a 45 20 66  OSTRACE(("SIZE f
172e0 69 6c 65 3d 25 70 2c 20 70 53 69 7a 65 3d 25 70  ile=%p, pSize=%p
172f0 2c 20 2a 70 53 69 7a 65 3d 25 6c 6c 64 2c 20 72  , *pSize=%lld, r
17300 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
17310 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70 53      pFile->h, pS
17320 69 7a 65 2c 20 2a 70 53 69 7a 65 2c 20 73 71 6c  ize, *pSize, sql
17330 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
17340 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17350 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 4f 43 4b 46 49 4c  }../*.** LOCKFIL
17360 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17370 4c 59 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  LY is undefined 
17380 6f 6e 20 73 6f 6d 65 20 57 69 6e 64 6f 77 73 20  on some Windows 
17390 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
173a0 64 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49  def LOCKFILE_FAI
173b0 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 0a 23 20  L_IMMEDIATELY.# 
173c0 64 65 66 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f  define LOCKFILE_
173d0 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
173e0 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64   1.#endif..#ifnd
173f0 65 66 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43 4c  ef LOCKFILE_EXCL
17400 55 53 49 56 45 5f 4c 4f 43 4b 0a 23 20 64 65 66  USIVE_LOCK.# def
17410 69 6e 65 20 4c 4f 43 4b 46 49 4c 45 5f 45 58 43  ine LOCKFILE_EXC
17420 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 32 0a 23 65  LUSIVE_LOCK 2.#e
17430 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 69 73 74  ndif../*.** Hist
17440 6f 72 69 63 61 6c 6c 79 2c 20 53 51 4c 69 74 65  orically, SQLite
17450 20 68 61 73 20 75 73 65 64 20 62 6f 74 68 20 74   has used both t
17460 68 65 20 4c 6f 63 6b 46 69 6c 65 20 61 6e 64 20  he LockFile and 
17470 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e 63 74  LockFileEx funct
17480 69 6f 6e 73 2e 0a 2a 2a 20 57 68 65 6e 20 74 68  ions..** When th
17490 65 20 4c 6f 63 6b 46 69 6c 65 20 66 75 6e 63 74  e LockFile funct
174a0 69 6f 6e 20 77 61 73 20 75 73 65 64 2c 20 69 74  ion was used, it
174b0 20 77 61 73 20 61 6c 77 61 79 73 20 65 78 70 65   was always expe
174c0 63 74 65 64 20 74 6f 20 66 61 69 6c 0a 2a 2a 20  cted to fail.** 
174d0 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 66 20 74  immediately if t
174e0 68 65 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  he lock could no
174f0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 20 20  t be obtained.  
17500 41 6c 73 6f 2c 20 69 74 20 61 6c 77 61 79 73 20  Also, it always 
17510 65 78 70 65 63 74 65 64 20 74 6f 0a 2a 2a 20 6f  expected to.** o
17520 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
17530 76 65 20 6c 6f 63 6b 2e 20 20 54 68 65 73 65 20  ve lock.  These 
17540 66 6c 61 67 73 20 61 72 65 20 75 73 65 64 20 77  flags are used w
17550 69 74 68 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  ith the LockFile
17560 45 78 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  Ex function.** a
17570 6e 64 20 72 65 66 6c 65 63 74 20 74 68 6f 73 65  nd reflect those
17580 20 65 78 70 65 63 74 61 74 69 6f 6e 73 3b 20 74   expectations; t
17590 68 65 72 65 66 6f 72 65 2c 20 74 68 65 79 20 73  herefore, they s
175a0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 68 61  hould not be cha
175b0 6e 67 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  nged..*/.#ifndef
175c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
175d0 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e 65 20  _FLAGS.# define 
175e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f  SQLITE_LOCKFILE_
175f0 46 4c 41 47 53 20 20 20 28 4c 4f 43 4b 46 49 4c  FLAGS   (LOCKFIL
17600 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45  E_FAIL_IMMEDIATE
17610 4c 59 20 7c 20 5c 0a 20 20 20 20 20 20 20 20 20  LY | \.         
17620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17630 20 20 20 20 20 20 20 20 20 4c 4f 43 4b 46 49 4c           LOCKFIL
17640 45 5f 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  E_EXCLUSIVE_LOCK
17650 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
17660 43 75 72 72 65 6e 74 6c 79 2c 20 53 51 4c 69 74  Currently, SQLit
17670 65 20 6e 65 76 65 72 20 63 61 6c 6c 73 20 74 68  e never calls th
17680 65 20 4c 6f 63 6b 46 69 6c 65 45 78 20 66 75 6e  e LockFileEx fun
17690 63 74 69 6f 6e 20 77 69 74 68 6f 75 74 20 77 61  ction without wa
176a0 6e 74 69 6e 67 20 74 68 65 0a 2a 2a 20 63 61 6c  nting the.** cal
176b0 6c 20 74 6f 20 66 61 69 6c 20 69 6d 6d 65 64 69  l to fail immedi
176c0 61 74 65 6c 79 20 69 66 20 74 68 65 20 6c 6f 63  ately if the loc
176d0 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61  k cannot be obta
176e0 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  ined..*/.#ifndef
176f0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45   SQLITE_LOCKFILE
17700 45 58 5f 46 4c 41 47 53 0a 23 20 64 65 66 69 6e  EX_FLAGS.# defin
17710 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c  e SQLITE_LOCKFIL
17720 45 45 58 5f 46 4c 41 47 53 20 28 4c 4f 43 4b 46  EEX_FLAGS (LOCKF
17730 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
17740 54 45 4c 59 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TELY).#endif../*
17750 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65  .** Acquire a re
17760 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2a 20 44 69  ader lock..** Di
17770 66 66 65 72 65 6e 74 20 41 50 49 20 72 6f 75 74  fferent API rout
17780 69 6e 65 73 20 61 72 65 20 63 61 6c 6c 65 64 20  ines are called 
17790 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65  depending on whe
177a0 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 69 73  ther or not this
177b0 0a 2a 2a 20 69 73 20 57 69 6e 39 78 20 6f 72 20  .** is Win9x or 
177c0 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  WinNT..*/.static
177d0 20 69 6e 74 20 77 69 6e 47 65 74 52 65 61 64 4c   int winGetReadL
177e0 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 70 46 69  ock(winFile *pFi
177f0 6c 65 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  le){.  int res;.
17800 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44    OSTRACE(("READ
17810 2d 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  -LOCK file=%p, l
17820 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17830 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17840 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
17850 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20 53 51  IsNT() ){.#if SQ
17860 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20 20  LITE_OS_WINCE.  
17870 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45    /*.    ** NOTE
17880 3a 20 57 69 6e 64 6f 77 73 20 43 45 20 69 73 20  : Windows CE is 
17890 68 61 6e 64 6c 65 64 20 64 69 66 66 65 72 65 6e  handled differen
178a0 74 6c 79 20 68 65 72 65 20 64 75 65 20 69 74 73  tly here due its
178b0 20 6c 61 63 6b 20 6f 66 20 74 68 65 20 57 69 6e   lack of the Win
178c0 33 32 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  32.    **       
178d0 41 50 49 20 4c 6f 63 6b 46 69 6c 65 45 78 2e 0a  API LockFileEx..
178e0 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d      */.    res =
178f0 20 77 69 6e 63 65 4c 6f 63 6b 46 69 6c 65 28 26   winceLockFile(&
17900 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
17910 5f 46 49 52 53 54 2c 20 30 2c 20 31 2c 20 30 29  _FIRST, 0, 1, 0)
17920 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 65 73 20  ;.#else.    res 
17930 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70  = winLockFile(&p
17940 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f  File->h, SQLITE_
17950 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47 53  LOCKFILEEX_FLAGS
17960 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17970 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
17980 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
17990 53 49 5a 45 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SIZE, 0);.#endif
179a0 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49  .  }.#ifdef SQLI
179b0 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
179c0 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 69 6e  I.  else{.    in
179d0 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
179e0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
179f0 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20  eof(lk), &lk);. 
17a00 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
17a10 4c 6f 63 6b 42 79 74 65 20 3d 20 28 73 68 6f 72  LockByte = (shor
17a20 74 29 28 28 6c 6b 20 26 20 30 78 37 66 66 66 66  t)((lk & 0x7ffff
17a30 66 66 66 29 25 28 53 48 41 52 45 44 5f 53 49 5a  fff)%(SHARED_SIZ
17a40 45 20 2d 20 31 29 29 3b 0a 20 20 20 20 72 65 73  E - 1));.    res
17a50 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
17a60 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
17a70 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c 41 47 53 2c  _LOCKFILE_FLAGS,
17a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a90 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17aa0 52 53 54 2b 70 46 69 6c 65 2d 3e 73 68 61 72 65  RST+pFile->share
17ab0 64 4c 6f 63 6b 42 79 74 65 2c 20 30 2c 20 31 2c  dLockByte, 0, 1,
17ac0 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
17ad0 20 20 69 66 28 20 72 65 73 20 3d 3d 20 30 20 29    if( res == 0 )
17ae0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
17af0 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61  tErrno = osGetLa
17b00 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 2f  stError();.    /
17b10 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6c 6f 67  * No need to log
17b20 20 61 20 66 61 69 6c 75 72 65 20 74 6f 20 6c 6f   a failure to lo
17b30 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 4f 53 54 52  ck */.  }.  OSTR
17b40 41 43 45 28 28 22 52 45 41 44 2d 4c 4f 43 4b 20  ACE(("READ-LOCK 
17b50 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
17b60 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
17b70 20 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e   res));.  return
17b80 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   res;.}../*.** U
17b90 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a  ndo a readlock.*
17ba0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
17bb0 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 77  UnlockReadLock(w
17bc0 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  inFile *pFile){.
17bd0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 44 57 4f    int res;.  DWO
17be0 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  RD lastErrno;.  
17bf0 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 2d 55  OSTRACE(("READ-U
17c00 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20 6c  NLOCK file=%p, l
17c10 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  ock=%d\n", pFile
17c20 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ->h, pFile->lock
17c30 74 79 70 65 29 29 3b 0a 20 20 69 66 28 20 6f 73  type));.  if( os
17c40 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 72 65  IsNT() ){.    re
17c50 73 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c  s = winUnlockFil
17c60 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41  e(&pFile->h, SHA
17c70 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 20 53 48  RED_FIRST, 0, SH
17c80 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17c90 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
17ca0 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
17cb0 20 20 65 6c 73 65 7b 0a 20 20 20 20 72 65 73 20    else{.    res 
17cc0 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28  = winUnlockFile(
17cd0 26 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45  &pFile->h, SHARE
17ce0 44 5f 46 49 52 53 54 2b 70 46 69 6c 65 2d 3e 73  D_FIRST+pFile->s
17cf0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 30  haredLockByte, 0
17d00 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 1, 0);.  }.#en
17d10 64 69 66 0a 20 20 69 66 28 20 72 65 73 3d 3d 30  dif.  if( res==0
17d20 20 26 26 20 28 28 6c 61 73 74 45 72 72 6e 6f 20   && ((lastErrno 
17d30 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72  = osGetLastError
17d40 28 29 29 21 3d 45 52 52 4f 52 5f 4e 4f 54 5f 4c  ())!=ERROR_NOT_L
17d50 4f 43 4b 45 44 29 20 29 7b 0a 20 20 20 20 70 46  OCKED) ){.    pF
17d60 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
17d70 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20   lastErrno;.    
17d80 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  winLogError(SQLI
17d90 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 2c  TE_IOERR_UNLOCK,
17da0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
17db0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
17dc0 20 20 20 22 77 69 6e 55 6e 6c 6f 63 6b 52 65 61     "winUnlockRea
17dd0 64 4c 6f 63 6b 22 2c 20 70 46 69 6c 65 2d 3e 7a  dLock", pFile->z
17de0 50 61 74 68 29 3b 0a 20 20 7d 0a 20 20 4f 53 54  Path);.  }.  OST
17df0 52 41 43 45 28 28 22 52 45 41 44 2d 55 4e 4c 4f  RACE(("READ-UNLO
17e00 43 4b 20 66 69 6c 65 3d 25 70 2c 20 72 65 73 75  CK file=%p, resu
17e10 6c 74 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d  lt=%d\n", pFile-
17e20 3e 68 2c 20 72 65 73 29 29 3b 0a 20 20 72 65 74  >h, res));.  ret
17e30 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
17e40 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
17e50 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
17e60 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
17e70 65 74 65 72 20 6c 6f 63 6b 74 79 70 65 20 2d 20  eter locktype - 
17e80 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
17e90 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
17ea0 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
17eb0 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
17ec0 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
17ed0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
17ee0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
17ef0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
17f00 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
17f10 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
17f20 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
17f30 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
17f40 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
17f50 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
17f60 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
17f70 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
17f80 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
17f90 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
17fa0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
17fb0 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
17fc0 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
17fd0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
17fe0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
17ff0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18000 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
18010 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
18020 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
18030 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
18040 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
18050 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
18060 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
18070 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
18080 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
18090 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
180a0 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
180b0 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
180c0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
180d0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
180e0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
180f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18100 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
18110 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 54 68 65  ase a lock.  The
18120 20 77 69 6e 55 6e 6c 6f 63 6b 28 29 20 72 6f 75   winUnlock() rou
18130 74 69 6e 65 0a 2a 2a 20 65 72 61 73 65 73 20 61  tine.** erases a
18140 6c 6c 20 6c 6f 63 6b 73 20 61 74 20 6f 6e 63 65  ll locks at once
18150 20 61 6e 64 20 72 65 74 75 72 6e 73 20 75 73 20   and returns us 
18160 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 6c  immediately to l
18170 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30 2e 0a  ocking level 0..
18180 2a 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73  ** It is not pos
18190 73 69 62 6c 65 20 74 6f 20 6c 6f 77 65 72 20 74  sible to lower t
181a0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
181b0 20 6f 6e 65 20 73 74 65 70 20 61 74 20 61 20 74   one step at a t
181c0 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a 20 6d 75 73  ime.  You.** mus
181d0 74 20 67 6f 20 73 74 72 61 69 67 68 74 20 74 6f  t go straight to
181e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 30   locking level 0
181f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18200 77 69 6e 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  winLock(sqlite3_
18210 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f  file *id, int lo
18220 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
18230 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
18240 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
18250 20 66 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65   from subroutine
18260 73 20 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d  s */.  int res =
18270 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   1;           /*
18280 20 52 65 73 75 6c 74 20 6f 66 20 61 20 57 69 6e   Result of a Win
18290 64 6f 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a  dows lock call *
182a0 2f 0a 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74  /.  int newLockt
182b0 79 70 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65  ype;       /* Se
182c0 74 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  t pFile->locktyp
182d0 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  e to this value 
182e0 62 65 66 6f 72 65 20 65 78 69 74 69 6e 67 20 2a  before exiting *
182f0 2f 0a 20 20 69 6e 74 20 67 6f 74 50 65 6e 64 69  /.  int gotPendi
18300 6e 67 4c 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72  ngLock = 0;/* Tr
18310 75 65 20 69 66 20 77 65 20 61 63 71 75 69 72 65  ue if we acquire
18320 64 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  d a PENDING lock
18330 20 74 68 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20   this time */.  
18340 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  winFile *pFile =
18350 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20   (winFile*)id;. 
18360 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
18370 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20   = NO_ERROR;..  
18380 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
18390 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
183a0 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
183b0 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
183c0 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
183d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
183e0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
183f0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
18400 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
18410 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
18420 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
18430 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
18440 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
18450 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
18460 20 4f 73 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68   OsFile, do noth
18470 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
18480 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
18490 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
184a0 73 71 6c 69 74 65 33 4f 73 45 6e 74 65 72 4d 75  sqlite3OsEnterMu
184b0 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65  tex() hasn't bee
184c0 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20  n called yet..  
184d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
184e0 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79  locktype>=lockty
184f0 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  pe ){.    OSTRAC
18500 45 28 28 22 4c 4f 43 4b 2d 48 45 4c 44 20 66 69  E(("LOCK-HELD fi
18510 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45  le=%p, rc=SQLITE
18520 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  _OK\n", pFile->h
18530 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
18540 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
18550 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
18560 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 77 72 69   any kind of wri
18570 74 65 2d 6c 6f 63 6b 20 6f 6e 20 61 20 72 65 61  te-lock on a rea
18580 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 0a  d-only database.
18590 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
185a0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 57  e->ctrlFlags & W
185b0 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 21 3d  INFILE_RDONLY)!=
185c0 30 20 26 26 20 6c 6f 63 6b 74 79 70 65 3e 3d 52  0 && locktype>=R
185d0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
185e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
185f0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
18600 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
18610 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
18620 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
18630 74 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  t.  */.  assert(
18640 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18650 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 6c 6f 63  !=NO_LOCK || loc
18660 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
18670 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18680 6c 6f 63 6b 74 79 70 65 21 3d 50 45 4e 44 49 4e  locktype!=PENDIN
18690 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
186a0 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d 52 45  rt( locktype!=RE
186b0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
186c0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
186d0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
186e0 20 20 2f 2a 20 4c 6f 63 6b 20 74 68 65 20 50 45    /* Lock the PE
186f0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20  NDING_LOCK byte 
18700 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 61 63  if we need to ac
18710 71 75 69 72 65 20 61 20 50 45 4e 44 49 4e 47 20  quire a PENDING 
18720 6c 6f 63 6b 20 6f 72 0a 20 20 2a 2a 20 61 20 53  lock or.  ** a S
18730 48 41 52 45 44 20 6c 6f 63 6b 2e 20 20 49 66 20  HARED lock.  If 
18740 77 65 20 61 72 65 20 61 63 71 75 69 72 69 6e 67  we are acquiring
18750 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
18760 74 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  the acquisition 
18770 6f 66 0a 20 20 2a 2a 20 74 68 65 20 50 45 4e 44  of.  ** the PEND
18780 49 4e 47 5f 4c 4f 43 4b 20 62 79 74 65 20 69 73  ING_LOCK byte is
18790 20 74 65 6d 70 6f 72 61 72 79 2e 0a 20 20 2a 2f   temporary..  */
187a0 0a 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d  .  newLocktype =
187b0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
187c0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
187d0 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
187e0 0a 20 20 20 7c 7c 20 28 6c 6f 63 6b 74 79 70 65  .   || (locktype
187f0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18800 20 26 26 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74   && pFile->lockt
18810 79 70 65 3c 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype<=RESERVED_LO
18820 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
18830 20 63 6e 74 20 3d 20 33 3b 0a 20 20 20 20 77 68   cnt = 3;.    wh
18840 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20  ile( cnt-->0 && 
18850 28 72 65 73 20 3d 20 77 69 6e 4c 6f 63 6b 46 69  (res = winLockFi
18860 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 53 51  le(&pFile->h, SQ
18870 4c 49 54 45 5f 4c 4f 43 4b 46 49 4c 45 5f 46 4c  LITE_LOCKFILE_FL
18880 41 47 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AGS,.           
18890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 45                PE
188b0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31  NDING_BYTE, 0, 1
188c0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
188d0 20 20 2f 2a 20 54 72 79 20 33 20 74 69 6d 65 73    /* Try 3 times
188e0 20 74 6f 20 67 65 74 20 74 68 65 20 70 65 6e 64   to get the pend
188f0 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20  ing lock.  This 
18900 69 73 20 6e 65 65 64 65 64 20 74 6f 20 77 6f 72  is needed to wor
18910 6b 0a 20 20 20 20 20 20 2a 2a 20 61 72 6f 75 6e  k.      ** aroun
18920 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
18930 64 20 62 79 20 69 6e 64 65 78 69 6e 67 20 61 6e  d by indexing an
18940 64 2f 6f 72 20 61 6e 74 69 2d 76 69 72 75 73 20  d/or anti-virus 
18950 73 6f 66 74 77 61 72 65 20 6f 6e 0a 20 20 20 20  software on.    
18960 20 20 2a 2a 20 57 69 6e 64 6f 77 73 20 73 79 73    ** Windows sys
18970 74 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tems..      ** I
18980 66 20 79 6f 75 20 61 72 65 20 75 73 69 6e 67 20  f you are using 
18990 74 68 69 73 20 63 6f 64 65 20 61 73 20 61 20 6d  this code as a m
189a0 6f 64 65 6c 20 66 6f 72 20 61 6c 74 65 72 6e 61  odel for alterna
189b0 74 69 76 65 20 56 46 53 65 73 2c 20 64 6f 20 6e  tive VFSes, do n
189c0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  ot.      ** copy
189d0 20 74 68 69 73 20 72 65 74 72 79 20 6c 6f 67 69   this retry logi
189e0 63 2e 20 20 49 74 20 69 73 20 61 20 68 61 63 6b  c.  It is a hack
189f0 20 69 6e 74 65 6e 64 65 64 20 66 6f 72 20 57 69   intended for Wi
18a00 6e 64 6f 77 73 20 6f 6e 6c 79 2e 0a 20 20 20 20  ndows only..    
18a10 20 20 2a 2f 0a 20 20 20 20 20 20 6c 61 73 74 45    */.      lastE
18a20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
18a30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
18a40 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 2d 50 45  STRACE(("LOCK-PE
18a50 4e 44 49 4e 47 2d 46 41 49 4c 20 66 69 6c 65 3d  NDING-FAIL file=
18a60 25 70 2c 20 63 6f 75 6e 74 3d 25 64 2c 20 72 65  %p, count=%d, re
18a70 73 75 6c 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  sult=%d\n",.    
18a80 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
18a90 2d 3e 68 2c 20 63 6e 74 2c 20 72 65 73 29 29 3b  ->h, cnt, res));
18aa0 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73 74 45  .      if( lastE
18ab0 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 49 4e 56 41  rrno==ERROR_INVA
18ac0 4c 49 44 5f 48 41 4e 44 4c 45 20 29 7b 0a 20 20  LID_HANDLE ){.  
18ad0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
18ae0 74 45 72 72 6e 6f 20 3d 20 6c 61 73 74 45 72 72  tErrno = lastErr
18af0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  no;.        rc =
18b00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
18b10 43 4b 3b 0a 20 20 20 20 20 20 20 20 4f 53 54 52  CK;.        OSTR
18b20 41 43 45 28 28 22 4c 4f 43 4b 2d 46 41 49 4c 20  ACE(("LOCK-FAIL 
18b30 66 69 6c 65 3d 25 70 2c 20 63 6f 75 6e 74 3d 25  file=%p, count=%
18b40 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20  d, rc=%s\n",.   
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 46                pF
18b60 69 6c 65 2d 3e 68 2c 20 63 6e 74 2c 20 73 71 6c  ile->h, cnt, sql
18b70 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 29  ite3ErrName(rc))
18b80 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
18b90 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18ba0 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 73 71      if( cnt ) sq
18bb0 6c 69 74 65 33 5f 77 69 6e 33 32 5f 73 6c 65 65  lite3_win32_slee
18bc0 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
18bd0 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
18be0 20 72 65 73 3b 0a 20 20 20 20 69 66 28 20 21 72   res;.    if( !r
18bf0 65 73 20 29 7b 0a 20 20 20 20 20 20 6c 61 73 74  es ){.      last
18c00 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
18c10 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 7d 0a  tError();.    }.
18c20 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72    }..  /* Acquir
18c30 65 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a  e a shared lock.
18c40 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
18c50 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18c60 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61   && res ){.    a
18c70 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
18c80 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20  cktype==NO_LOCK 
18c90 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e  );.    res = win
18ca0 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
18cb0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20  e);.    if( res 
18cc0 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
18cd0 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c 4f  type = SHARED_LO
18ce0 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
18cf0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
18d00 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
18d10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18d20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
18d30 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a  ERVED lock.  */.
18d40 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
18d50 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18d60 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65   res ){.    asse
18d70 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  rt( pFile->lockt
18d80 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ype==SHARED_LOCK
18d90 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77 69   );.    res = wi
18da0 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c 65  nLockFile(&pFile
18db0 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  ->h, SQLITE_LOCK
18dc0 46 49 4c 45 5f 46 4c 41 47 53 2c 20 52 45 53 45  FILE_FLAGS, RESE
18dd0 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20 31 2c  RVED_BYTE, 0, 1,
18de0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
18df0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
18e00 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
18e10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
18e20 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72 6e  {.      lastErrn
18e30 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72 72  o = osGetLastErr
18e40 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  or();.    }.  }.
18e50 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20  .  /* Acquire a 
18e60 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20 2a  PENDING lock.  *
18e70 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
18e80 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18e90 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 6e   && res ){.    n
18ea0 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45 4e  ewLocktype = PEN
18eb0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 67  DING_LOCK;.    g
18ec0 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d 20  otPendingLock = 
18ed0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  0;.  }..  /* Acq
18ee0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
18ef0 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
18f00 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
18f10 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
18f20 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  s ){.    assert(
18f30 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
18f40 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  >=SHARED_LOCK );
18f50 0a 20 20 20 20 72 65 73 20 3d 20 77 69 6e 55 6e  .    res = winUn
18f60 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69  lockReadLock(pFi
18f70 6c 65 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 77  le);.    res = w
18f80 69 6e 4c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  inLockFile(&pFil
18f90 65 2d 3e 68 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  e->h, SQLITE_LOC
18fa0 4b 46 49 4c 45 5f 46 4c 41 47 53 2c 20 53 48 41  KFILE_FLAGS, SHA
18fb0 52 45 44 5f 46 49 52 53 54 2c 20 30 2c 0a 20 20  RED_FIRST, 0,.  
18fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18fd0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18fe0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73   0);.    if( res
18ff0 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
19000 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56  ktype = EXCLUSIV
19010 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  E_LOCK;.    }els
19020 65 7b 0a 20 20 20 20 20 20 6c 61 73 74 45 72 72  e{.      lastErr
19030 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
19040 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 77 69 6e  ror();.      win
19050 47 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  GetReadLock(pFil
19060 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
19070 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f   /* If we are ho
19080 6c 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20  lding a PENDING 
19090 6c 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20  lock that ought 
190a0 74 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20  to be released, 
190b0 74 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73  then.  ** releas
190c0 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  e it now..  */. 
190d0 20 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c   if( gotPendingL
190e0 6f 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  ock && locktype=
190f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
19100 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c      winUnlockFil
19110 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 50 45 4e  e(&pFile->h, PEN
19120 44 49 4e 47 5f 42 59 54 45 2c 20 30 2c 20 31 2c  DING_BYTE, 0, 1,
19130 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55   0);.  }..  /* U
19140 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65 20  pdate the state 
19150 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20  of the lock has 
19160 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c 65  held in the file
19170 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65 6e   descriptor then
19180 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  .  ** return the
19190 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65 73   appropriate res
191a0 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20  ult code..  */. 
191b0 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20   if( res ){.    
191c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
191d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
191e0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
191f0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 72  lastErrno;.    r
19200 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
19210 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
19220 4f 43 4b 2d 46 41 49 4c 20 66 69 6c 65 3d 25 70  OCK-FAIL file=%p
19230 2c 20 77 61 6e 74 65 64 3d 25 64 2c 20 67 6f 74  , wanted=%d, got
19240 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
19250 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 6c       pFile->h, l
19260 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b  ocktype, newLock
19270 74 79 70 65 29 29 3b 0a 20 20 7d 0a 20 20 70 46  type));.  }.  pF
19280 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20  ile->locktype = 
19290 28 75 38 29 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  (u8)newLocktype;
192a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
192b0 4b 20 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d  K file=%p, lock=
192c0 25 64 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  %d, rc=%s\n",.  
192d0 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
192e0 68 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  h, pFile->lockty
192f0 70 65 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  pe, sqlite3ErrNa
19300 6d 65 28 72 63 29 29 29 3b 0a 20 20 72 65 74 75  me(rc)));.  retu
19310 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19320 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
19330 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
19340 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
19350 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
19360 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
19370 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
19380 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
19390 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
193a0 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
193b0 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
193c0 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  e zero..*/.stati
193d0 63 20 69 6e 74 20 77 69 6e 43 68 65 63 6b 52 65  c int winCheckRe
193e0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
193f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19400 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
19410 74 20 72 65 73 3b 0a 20 20 77 69 6e 46 69 6c 65  t res;.  winFile
19420 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69   *pFile = (winFi
19430 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
19440 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
19450 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
19460 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
19470 4b 3b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  K; );.  OSTRACE(
19480 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20 66  ("TEST-WR-LOCK f
19490 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74 3d  ile=%p, pResOut=
194a0 25 70 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %p\n", pFile->h,
194b0 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20 61   pResOut));..  a
194c0 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
194d0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
194e0 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f  ktype>=RESERVED_
194f0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 20  LOCK ){.    res 
19500 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  = 1;.    OSTRACE
19510 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19520 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
19530 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22 2c 20 70  %d (local)\n", p
19540 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b 0a  File->h, res));.
19550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 73    }else{.    res
19560 20 3d 20 77 69 6e 4c 6f 63 6b 46 69 6c 65 28 26   = winLockFile(&
19570 70 46 69 6c 65 2d 3e 68 2c 20 53 51 4c 49 54 45  pFile->h, SQLITE
19580 5f 4c 4f 43 4b 46 49 4c 45 45 58 5f 46 4c 41 47  _LOCKFILEEX_FLAG
19590 53 2c 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  S,RESERVED_BYTE,
195a0 30 2c 31 2c 30 29 3b 0a 20 20 20 20 69 66 28 20  0,1,0);.    if( 
195b0 72 65 73 20 29 7b 0a 20 20 20 20 20 20 77 69 6e  res ){.      win
195c0 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
195d0 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
195e0 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
195f0 20 20 20 7d 0a 20 20 20 20 72 65 73 20 3d 20 21     }.    res = !
19600 72 65 73 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  res;.    OSTRACE
19610 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19620 66 69 6c 65 3d 25 70 2c 20 72 65 73 75 6c 74 3d  file=%p, result=
19630 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c 20  %d (remote)\n", 
19640 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 29 29 3b  pFile->h, res));
19650 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f 75 74 20  .  }.  *pResOut 
19660 3d 20 72 65 73 3b 0a 20 20 4f 53 54 52 41 43 45  = res;.  OSTRACE
19670 28 28 22 54 45 53 54 2d 57 52 2d 4c 4f 43 4b 20  (("TEST-WR-LOCK 
19680 66 69 6c 65 3d 25 70 2c 20 70 52 65 73 4f 75 74  file=%p, pResOut
19690 3d 25 70 2c 20 2a 70 52 65 73 4f 75 74 3d 25 64  =%p, *pResOut=%d
196a0 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e  , rc=SQLITE_OK\n
196b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
196c0 69 6c 65 2d 3e 68 2c 20 70 52 65 73 4f 75 74 2c  ile->h, pResOut,
196d0 20 2a 70 52 65 73 4f 75 74 29 29 3b 0a 20 20 72   *pResOut));.  r
196e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
196f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
19700 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
19710 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
19720 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
19730 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
19740 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
19750 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
19760 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
19770 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
19780 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
19790 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
197a0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
197b0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
197c0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
197d0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
197e0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
197f0 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
19800 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
19810 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
19820 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19830 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
19840 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
19850 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
19860 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
19870 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
19880 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
19890 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
198a0 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
198b0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
198c0 69 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65  id, int locktype
198d0 29 7b 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20  ){.  int type;. 
198e0 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
198f0 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
19900 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
19910 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
19920 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
19930 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
19940 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19950 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
19960 4b 20 66 69 6c 65 3d 25 70 2c 20 6f 6c 64 4c 6f  K file=%p, oldLo
19970 63 6b 3d 25 64 28 25 64 29 2c 20 6e 65 77 4c 6f  ck=%d(%d), newLo
19980 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ck=%d\n",.      
19990 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 70       pFile->h, p
199a0 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c 20  File->locktype, 
199b0 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63  pFile->sharedLoc
199c0 6b 42 79 74 65 2c 20 6c 6f 63 6b 74 79 70 65 29  kByte, locktype)
199d0 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69 6c  );.  type = pFil
199e0 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
199f0 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53 49  f( type>=EXCLUSI
19a00 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  VE_LOCK ){.    w
19a10 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46  inUnlockFile(&pF
19a20 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46  ile->h, SHARED_F
19a30 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45 44 5f  IRST, 0, SHARED_
19a40 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 69 66  SIZE, 0);.    if
19a50 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
19a60 45 44 5f 4c 4f 43 4b 20 26 26 20 21 77 69 6e 47  ED_LOCK && !winG
19a70 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
19a80 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
19a90 69 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  is should never 
19aa0 68 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75  happen.  We shou
19ab0 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c  ld always be abl
19ac0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65  e to.      ** re
19ad0 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
19ae0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72   lock */.      r
19af0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
19b00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
19b10 4f 43 4b 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  OCK, osGetLastEr
19b20 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
19b40 69 6e 55 6e 6c 6f 63 6b 22 2c 20 70 46 69 6c 65  inUnlock", pFile
19b50 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  ->zPath);.    }.
19b60 20 20 7d 0a 20 20 69 66 28 20 74 79 70 65 3e 3d    }.  if( type>=
19b70 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
19b80 0a 20 20 20 20 77 69 6e 55 6e 6c 6f 63 6b 46 69  .    winUnlockFi
19b90 6c 65 28 26 70 46 69 6c 65 2d 3e 68 2c 20 52 45  le(&pFile->h, RE
19ba0 53 45 52 56 45 44 5f 42 59 54 45 2c 20 30 2c 20  SERVED_BYTE, 0, 
19bb0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  1, 0);.  }.  if(
19bc0 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f   locktype==NO_LO
19bd0 43 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52  CK && type>=SHAR
19be0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77  ED_LOCK ){.    w
19bf0 69 6e 55 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b  inUnlockReadLock
19c00 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
19c10 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
19c20 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 77 69 6e  _LOCK ){.    win
19c30 55 6e 6c 6f 63 6b 46 69 6c 65 28 26 70 46 69 6c  UnlockFile(&pFil
19c40 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f 42 59  e->h, PENDING_BY
19c50 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  TE, 0, 1, 0);.  
19c60 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74  }.  pFile->lockt
19c70 79 70 65 20 3d 20 28 75 38 29 6c 6f 63 6b 74 79  ype = (u8)lockty
19c80 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  pe;.  OSTRACE(("
19c90 55 4e 4c 4f 43 4b 20 66 69 6c 65 3d 25 70 2c 20  UNLOCK file=%p, 
19ca0 6c 6f 63 6b 3d 25 64 2c 20 72 63 3d 25 73 5c 6e  lock=%d, rc=%s\n
19cb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  ",.           pF
19cc0 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
19cd0 6f 63 6b 74 79 70 65 2c 20 73 71 6c 69 74 65 33  ocktype, sqlite3
19ce0 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
19cf0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d00 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
19d10 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
19d20 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
19d30 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
19d40 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
19d50 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
19d60 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
19d70 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
19d80 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
19d90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
19da0 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
19db0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
19dc0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
19dd0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
19de0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19df0 77 69 6e 4d 6f 64 65 42 69 74 28 77 69 6e 46 69  winModeBit(winFi
19e00 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67  le *pFile, unsig
19e10 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69  ned char mask, i
19e20 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28  nt *pArg){.  if(
19e30 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20   *pArg<0 ){.    
19e40 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e  *pArg = (pFile->
19e50 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b  ctrlFlags & mask
19e60 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  )!=0;.  }else if
19e70 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a  ( (*pArg)==0 ){.
19e80 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
19e90 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  lags &= ~mask;. 
19ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c   }else{.    pFil
19eb0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
19ec0 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  mask;.  }.}../* 
19ed0 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
19ee0 65 73 20 74 6f 20 56 46 53 20 68 65 6c 70 65 72  es to VFS helper
19ef0 20 6d 65 74 68 6f 64 73 20 75 73 65 64 20 66 6f   methods used fo
19f00 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
19f10 73 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s */.static int 
19f20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28 73  winGetTempname(s
19f30 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c 20 63 68  qlite3_vfs *, ch
19f40 61 72 20 2a 2a 29 3b 0a 73 74 61 74 69 63 20 69  ar **);.static i
19f50 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e 73  nt winIsDir(cons
19f60 74 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74 69  t void *);.stati
19f70 63 20 42 4f 4f 4c 20 77 69 6e 49 73 44 72 69 76  c BOOL winIsDriv
19f80 65 4c 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28  eLetterAndColon(
19f90 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
19fa0 2f 2a 0a 2a 2a 20 43 6f 6e 74 72 6f 6c 20 61 6e  /*.** Control an
19fb0 64 20 71 75 65 72 79 20 6f 66 20 74 68 65 20 6f  d query of the o
19fc0 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  pen file handle.
19fd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
19fe0 69 6e 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  inFileControl(sq
19ff0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1a000 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1a010 72 67 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  rg){.  winFile *
1a020 70 46 69 6c 65 20 3d 20 28 77 69 6e 46 69 6c 65  pFile = (winFile
1a030 2a 29 69 64 3b 0a 20 20 4f 53 54 52 41 43 45 28  *)id;.  OSTRACE(
1a040 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a050 20 6f 70 3d 25 64 2c 20 70 41 72 67 3d 25 70 5c   op=%d, pArg=%p\
1a060 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6f 70  n", pFile->h, op
1a070 2c 20 70 41 72 67 29 29 3b 0a 20 20 73 77 69 74  , pArg));.  swit
1a080 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61  ch( op ){.    ca
1a090 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1a0a0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
1a0b0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
1a0c0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
1a0d0 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
1a0e0 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a0f0 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a100 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a110 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a120 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1a130 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a140 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  L_LAST_ERRNO: {.
1a150 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
1a160 67 20 3d 20 28 69 6e 74 29 70 46 69 6c 65 2d 3e  g = (int)pFile->
1a170 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
1a180 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a190 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a1a0 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a1b0 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a1c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a1d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a1e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
1a1f0 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70  _SIZE: {.      p
1a200 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20  File->szChunk = 
1a210 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20  *(int *)pArg;.  
1a220 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a230 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a240 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46  SQLITE_OK\n", pF
1a250 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
1a260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a280 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1a290 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
1a2a0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
1a2b0 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  unk>0 ){.       
1a2c0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1a2d0 6c 64 53 7a 3b 0a 20 20 20 20 20 20 20 20 69 6e  ldSz;.        in
1a2e0 74 20 72 63 20 3d 20 77 69 6e 46 69 6c 65 53 69  t rc = winFileSi
1a2f0 7a 65 28 69 64 2c 20 26 6f 6c 64 53 7a 29 3b 0a  ze(id, &oldSz);.
1a300 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1a310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69         sqlite3_i
1a330 6e 74 36 34 20 6e 65 77 53 7a 20 3d 20 2a 28 73  nt64 newSz = *(s
1a340 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29 70 41  qlite3_int64*)pA
1a350 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  rg;.          if
1a360 28 20 6e 65 77 53 7a 3e 6f 6c 64 53 7a 20 29 7b  ( newSz>oldSz ){
1a370 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d  .            Sim
1a380 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1a390 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 20 20 20  gn(1);.         
1a3a0 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63     rc = winTrunc
1a3b0 61 74 65 28 69 64 2c 20 6e 65 77 53 7a 29 3b 0a  ate(id, newSz);.
1a3c0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 6d 75              Simu
1a3d0 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1a3e0 6e 28 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n(0);.          
1a3f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a400 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46 43      OSTRACE(("FC
1a410 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d  NTL file=%p, rc=
1a420 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %s\n", pFile->h,
1a430 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28   sqlite3ErrName(
1a440 72 63 29 29 29 3b 0a 20 20 20 20 20 20 20 20 72  rc)));.        r
1a450 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1a460 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
1a470 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a480 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a490 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a4a0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a4b0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1a4c0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1a4d0 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b  L_PERSIST_WAL: {
1a4e0 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42 69  .      winModeBi
1a4f0 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c 45  t(pFile, WINFILE
1a500 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69  _PERSIST_WAL, (i
1a510 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  nt*)pArg);.     
1a520 20 4f 53 54 52 41 43 45 28 28 22 46 43 4e 54 4c   OSTRACE(("FCNTL
1a530 20 66 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c   file=%p, rc=SQL
1a540 49 54 45 5f 4f 4b 5c 6e 22 2c 20 70 46 69 6c 65  ITE_OK\n", pFile
1a550 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ->h));.      ret
1a560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a570 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1a580 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52  LITE_FCNTL_POWER
1a590 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20  SAFE_OVERWRITE: 
1a5a0 7b 0a 20 20 20 20 20 20 77 69 6e 4d 6f 64 65 42  {.      winModeB
1a5b0 69 74 28 70 46 69 6c 65 2c 20 57 49 4e 46 49 4c  it(pFile, WINFIL
1a5c0 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
1a5d0 72 67 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  rg);.      OSTRA
1a5e0 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d  CE(("FCNTL file=
1a5f0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b  %p, rc=SQLITE_OK
1a600 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
1a610 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a620 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1a630 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a640 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a  CNTL_VFSNAME: {.
1a650 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1a660 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Arg = sqlite3_mp
1a670 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c  rintf("%s", pFil
1a680 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b  e->pVfs->zName);
1a690 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
1a6a0 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20  "FCNTL file=%p, 
1a6b0 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c  rc=SQLITE_OK\n",
1a6c0 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20   pFile->h));.   
1a6d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a6e0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1a6f0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1a700 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 3a  _WIN32_AV_RETRY:
1a710 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 20   {.      int *a 
1a720 3d 20 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20  = (int*)pArg;.  
1a730 20 20 20 20 69 66 28 20 61 5b 30 5d 3e 30 20 29      if( a[0]>0 )
1a740 7b 0a 20 20 20 20 20 20 20 20 77 69 6e 49 6f 65  {.        winIoe
1a750 72 72 52 65 74 72 79 20 3d 20 61 5b 30 5d 3b 0a  rrRetry = a[0];.
1a760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a770 20 20 20 20 20 61 5b 30 5d 20 3d 20 77 69 6e 49       a[0] = winI
1a780 6f 65 72 72 52 65 74 72 79 3b 0a 20 20 20 20 20  oerrRetry;.     
1a790 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 5b 31   }.      if( a[1
1a7a0 5d 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  ]>0 ){.        w
1a7b0 69 6e 49 6f 65 72 72 52 65 74 72 79 44 65 6c 61  inIoerrRetryDela
1a7c0 79 20 3d 20 61 5b 31 5d 3b 0a 20 20 20 20 20 20  y = a[1];.      
1a7d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
1a7e0 5b 31 5d 20 3d 20 77 69 6e 49 6f 65 72 72 52 65  [1] = winIoerrRe
1a7f0 74 72 79 44 65 6c 61 79 3b 0a 20 20 20 20 20 20  tryDelay;.      
1a800 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
1a810 28 22 46 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c  ("FCNTL file=%p,
1a820 20 72 63 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22   rc=SQLITE_OK\n"
1a830 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
1a840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a850 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  E_OK;.    }.#ifd
1a860 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1a870 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1a880 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48  CNTL_WIN32_SET_H
1a890 41 4e 44 4c 45 3a 20 7b 0a 20 20 20 20 20 20 4c  ANDLE: {.      L
1a8a0 50 48 41 4e 44 4c 45 20 70 68 46 69 6c 65 20 3d  PHANDLE phFile =
1a8b0 20 28 4c 50 48 41 4e 44 4c 45 29 70 41 72 67 3b   (LPHANDLE)pArg;
1a8c0 0a 20 20 20 20 20 20 48 41 4e 44 4c 45 20 68 4f  .      HANDLE hO
1a8d0 6c 64 46 69 6c 65 20 3d 20 70 46 69 6c 65 2d 3e  ldFile = pFile->
1a8e0 68 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  h;.      pFile->
1a8f0 68 20 3d 20 2a 70 68 46 69 6c 65 3b 0a 20 20 20  h = *phFile;.   
1a900 20 20 20 2a 70 68 46 69 6c 65 20 3d 20 68 4f 6c     *phFile = hOl
1a910 64 46 69 6c 65 3b 0a 20 20 20 20 20 20 4f 53 54  dFile;.      OST
1a920 52 41 43 45 28 28 22 46 43 4e 54 4c 20 6f 6c 64  RACE(("FCNTL old
1a930 46 69 6c 65 3d 25 70 2c 20 6e 65 77 46 69 6c 65  File=%p, newFile
1a940 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
1a950 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
1a960 20 20 20 20 20 68 4f 6c 64 46 69 6c 65 2c 20 70       hOldFile, p
1a970 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20  File->h));.     
1a980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a990 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
1a9a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1a9b0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
1a9c0 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
1a9d0 20 2a 7a 54 46 69 6c 65 20 3d 20 30 3b 0a 20 20   *zTFile = 0;.  
1a9e0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 77 69 6e      int rc = win
1a9f0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
1aa00 65 2d 3e 70 56 66 73 2c 20 26 7a 54 46 69 6c 65  e->pVfs, &zTFile
1aa10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1aa20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1aa30 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1aa40 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
1aa50 20 20 20 20 7d 0a 20 20 20 20 20 20 4f 53 54 52      }.      OSTR
1aa60 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1aa70 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 70  =%p, rc=%s\n", p
1aa80 46 69 6c 65 2d 3e 68 2c 20 73 71 6c 69 74 65 33  File->h, sqlite3
1aa90 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20  ErrName(rc)));. 
1aaa0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1aab0 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1aac0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1aad0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1aae0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1aaf0 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
1ab00 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
1ab10 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
1ab20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ab30 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1ab40 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
1ab50 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
1ab60 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
1ab70 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
1ab80 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
1ab90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28        }.      *(
1aba0 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
1abb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
1abc0 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1abd0 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
1abe0 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
1abf0 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
1ac00 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
1ac10 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
1ac20 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
1ac30 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
1ac40 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1ac50 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
1ac60 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
1ac70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1ac80 20 72 63 20 3d 20 77 69 6e 4d 61 70 66 69 6c 65   rc = winMapfile
1ac90 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20  (pFile, -1);.   
1aca0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1acb0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 46       OSTRACE(("F
1acc0 43 4e 54 4c 20 66 69 6c 65 3d 25 70 2c 20 72 63  CNTL file=%p, rc
1acd0 3d 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%s\n", pFile->h
1ace0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1acf0 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65  (rc)));.      re
1ad00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1ad10 65 6e 64 69 66 0a 20 20 7d 0a 20 20 4f 53 54 52  endif.  }.  OSTR
1ad20 41 43 45 28 28 22 46 43 4e 54 4c 20 66 69 6c 65  ACE(("FCNTL file
1ad30 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4e  =%p, rc=SQLITE_N
1ad40 4f 54 46 4f 55 4e 44 5c 6e 22 2c 20 70 46 69 6c  OTFOUND\n", pFil
1ad50 65 2d 3e 68 29 29 3b 0a 20 20 72 65 74 75 72 6e  e->h));.  return
1ad60 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
1ad70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ad80 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
1ad90 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
1ada0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
1adb0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
1adc0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
1add0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
1ade0 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
1adf0 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
1ae00 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
1ae10 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
1ae20 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
1ae30 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
1ae40 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
1ae50 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
1ae60 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
1ae70 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
1ae80 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
1ae90 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
1aea0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
1aeb0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
1aec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
1aed0 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
1aee0 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
1aef0 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
1af00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1af10 77 69 6e 53 65 63 74 6f 72 53 69 7a 65 28 73 71  winSectorSize(sq
1af20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1af30 0a 20 20 28 76 6f 69 64 29 69 64 3b 0a 20 20 72  .  (void)id;.  r
1af40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46  eturn SQLITE_DEF
1af50 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1af60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1af70 6e 20 61 20 76 65 63 74 6f 72 20 6f 66 20 64 65  n a vector of de
1af80 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1af90 74 69 63 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tics..*/.static 
1afa0 69 6e 74 20 77 69 6e 44 65 76 69 63 65 43 68 61  int winDeviceCha
1afb0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
1afc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
1afd0 20 20 77 69 6e 46 69 6c 65 20 2a 70 20 3d 20 28    winFile *p = (
1afe0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 72  winFile*)id;.  r
1aff0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1b000 41 50 5f 55 4e 44 45 4c 45 54 41 42 4c 45 5f 57  AP_UNDELETABLE_W
1b010 48 45 4e 5f 4f 50 45 4e 20 7c 0a 20 20 20 20 20  HEN_OPEN |.     
1b020 20 20 20 20 28 28 70 2d 3e 63 74 72 6c 46 6c 61      ((p->ctrlFla
1b030 67 73 20 26 20 57 49 4e 46 49 4c 45 5f 50 53 4f  gs & WINFILE_PSO
1b040 57 29 3f 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  W)?SQLITE_IOCAP_
1b050 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
1b060 49 54 45 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE:0);.}../*.**
1b070 20 57 69 6e 64 6f 77 73 20 77 69 6c 6c 20 6f 6e   Windows will on
1b080 6c 79 20 6c 65 74 20 79 6f 75 20 63 72 65 61 74  ly let you creat
1b090 65 20 66 69 6c 65 20 76 69 65 77 20 6d 61 70 70  e file view mapp
1b0a0 69 6e 67 73 0a 2a 2a 20 6f 6e 20 61 6c 6c 6f 63  ings.** on alloc
1b0b0 61 74 69 6f 6e 20 73 69 7a 65 20 67 72 61 6e 75  ation size granu
1b0c0 6c 61 72 69 74 79 20 62 6f 75 6e 64 61 72 69 65  larity boundarie
1b0d0 73 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 73 71 6c  s..** During sql
1b0e0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1b0f0 65 20 64 6f 20 61 20 47 65 74 53 79 73 74 65 6d  e do a GetSystem
1b100 49 6e 66 6f 28 29 0a 2a 2a 20 74 6f 20 67 65 74  Info().** to get
1b110 20 74 68 65 20 67 72 61 6e 75 6c 61 72 69 74 79   the granularity
1b120 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   size..*/.static
1b130 20 53 59 53 54 45 4d 5f 49 4e 46 4f 20 77 69 6e   SYSTEM_INFO win
1b140 53 79 73 49 6e 66 6f 3b 0a 0a 23 69 66 6e 64 65  SysInfo;..#ifnde
1b150 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1b160 4c 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  L../*.** Helper 
1b170 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
1b180 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
1b190 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
1b1a0 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
1b1b0 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
1b1c0 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
1b1d0 77 69 6e 4c 6f 63 6b 49 6e 66 6f 20 6f 62 6a 65  winLockInfo obje
1b1e0 63 74 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  cts used by.** t
1b1f0 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
1b200 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 73 68   which may be sh
1b210 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70 6c 65  ared by multiple
1b220 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a 2a 20   threads..**.** 
1b230 46 75 6e 63 74 69 6f 6e 20 77 69 6e 53 68 6d 4d  Function winShmM
1b240 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
1b250 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
1b260 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
1b270 75 74 65 78 0a 2a 2a 20 69 73 20 68 65 6c 64 20  utex.** is held 
1b280 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20 54  when required. T
1b290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b2a0 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61 72  only used as par
1b2b0 74 20 6f 66 20 61 73 73 65 72 74 28 29 0a 2a 2a  t of assert().**
1b2c0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65 2e 67   statements. e.g
1b2d0 2e 0a 2a 2a 0a 2a 2a 20 20 20 77 69 6e 53 68 6d  ..**.**   winShm
1b2e0 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
1b2f0 20 20 20 20 61 73 73 65 72 74 28 20 77 69 6e 53      assert( winS
1b300 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  hmMutexHeld() );
1b310 0a 2a 2a 20 20 20 77 69 6e 53 68 6d 4c 65 61 76  .**   winShmLeav
1b320 65 4d 75 74 65 78 28 29 0a 2a 2f 0a 73 74 61 74  eMutex().*/.stat
1b330 69 63 20 76 6f 69 64 20 77 69 6e 53 68 6d 45 6e  ic void winShmEn
1b340 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
1b350 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b360 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
1b370 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
1b380 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
1b390 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
1b3a0 64 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74  d winShmLeaveMut
1b3b0 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
1b3c0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1b3d0 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1b3e0 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1b3f0 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
1b400 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
1b410 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d  tatic int winShm
1b420 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20  MutexHeld(void) 
1b430 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
1b440 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71  e3_mutex_held(sq
1b450 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
1b460 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1b470 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65  TIC_VFS1));.}.#e
1b480 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  ndif../*.** Obje
1b490 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
1b4a0 73 65 6e 74 20 61 20 73 69 6e 67 6c 65 20 66 69  sent a single fi
1b4b0 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64 20 6d 6d  le opened and mm
1b4c0 61 70 70 65 64 20 74 6f 20 70 72 6f 76 69 64 65  apped to provide
1b4d0 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  .** shared memor
1b4e0 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c  y.  When multipl
1b4f0 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65  e threads all re
1b500 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65  ference the same
1b510 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 2c  .** log-summary,
1b520 20 65 61 63 68 20 74 68 72 65 61 64 20 68 61 73   each thread has
1b530 20 69 74 73 20 6f 77 6e 20 77 69 6e 46 69 6c 65   its own winFile
1b540 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
1b550 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 20 74  y all.** point t
1b560 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61  o a single insta
1b570 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
1b580 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
1b590 72 64 73 2c 20 65 61 63 68 0a 2a 2a 20 6c 6f 67  rds, each.** log
1b5a0 2d 73 75 6d 6d 61 72 79 20 69 73 20 6f 70 65 6e  -summary is open
1b5b0 65 64 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ed only once per
1b5c0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
1b5d0 77 69 6e 53 68 6d 4d 75 74 65 78 48 65 6c 64 28  winShmMutexHeld(
1b5e0 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77  ) must be true w
1b5f0 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20  hen creating or 
1b600 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68  destroying.** th
1b610 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69  is object or whi
1b620 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  le reading or wr
1b630 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  iting the follow
1b640 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a  ing fields:.**.*
1b650 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 20 20  *      nRef.**  
1b660 20 20 20 20 70 4e 65 78 74 0a 2a 2a 0a 2a 2a 20      pNext.**.** 
1b670 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
1b680 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
1b690 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
1b6a0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
1b6b0 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a  **.**      fid.*
1b6c0 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  *      zFilename
1b6d0 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 77 69  .**.** Either wi
1b6e0 6e 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d  nShmNode.mutex m
1b6f0 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 77  ust be held or w
1b700 69 6e 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  inShmNode.nRef==
1b710 30 20 61 6e 64 0a 2a 2a 20 77 69 6e 53 68 6d 4d  0 and.** winShmM
1b720 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74 72  utexHeld() is tr
1b730 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20  ue when reading 
1b740 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f  or writing any o
1b750 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e  ther field.** in
1b760 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
1b770 0a 2a 2a 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  .**.*/.struct wi
1b780 6e 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 73 71 6c  nShmNode {.  sql
1b790 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
1b7a0 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
1b7b0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
1b7c0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
1b7d0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
1b7e0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1b7f0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1b800 77 69 6e 46 69 6c 65 20 68 46 69 6c 65 3b 20 20  winFile hFile;  
1b810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1b820 6c 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 77  le handle from w
1b830 69 6e 4f 70 65 6e 20 2a 2f 0a 0a 20 20 69 6e 74  inOpen */..  int
1b840 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
1b850 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b860 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
1b870 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   regions */.  in
1b880 74 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  t nRegion;      
1b890 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1b8a0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
1b8b0 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  on */.  struct S
1b8c0 68 6d 52 65 67 69 6f 6e 20 7b 0a 20 20 20 20 48  hmRegion {.    H
1b8d0 41 4e 44 4c 45 20 68 4d 61 70 3b 20 20 20 20 20  ANDLE hMap;     
1b8e0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1b8f0 68 61 6e 64 6c 65 20 66 72 6f 6d 20 43 72 65 61  handle from Crea
1b900 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 20 2a 2f  teFileMapping */
1b910 0a 20 20 20 20 76 6f 69 64 20 2a 70 4d 61 70 3b  .    void *pMap;
1b920 0a 20 20 7d 20 2a 61 52 65 67 69 6f 6e 3b 0a 20  .  } *aRegion;. 
1b930 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f   DWORD lastErrno
1b940 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
1b950 68 65 20 57 69 6e 64 6f 77 73 20 65 72 72 6e 6f  he Windows errno
1b960 20 66 72 6f 6d 20 74 68 65 20 6c 61 73 74 20 49   from the last I
1b970 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 69  /O error */..  i
1b980 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1b990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b9a0 62 65 72 20 6f 66 20 77 69 6e 53 68 6d 20 6f 62  ber of winShm ob
1b9b0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
1b9c0 6f 20 74 68 69 73 20 2a 2f 0a 20 20 77 69 6e 53  o this */.  winS
1b9d0 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
1b9e0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 77 69         /* All wi
1b9f0 6e 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  nShm objects poi
1ba00 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
1ba10 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1ba20 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  Next;         /*
1ba30 20 4e 65 78 74 20 69 6e 20 6c 69 73 74 20 6f 66   Next in list of
1ba40 20 61 6c 6c 20 77 69 6e 53 68 6d 4e 6f 64 65 20   all winShmNode 
1ba50 6f 62 6a 65 63 74 73 20 2a 2f 0a 23 69 66 20 64  objects */.#if d
1ba60 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
1ba70 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
1ba80 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
1ba90 52 41 43 45 29 0a 20 20 75 38 20 6e 65 78 74 53  RACE).  u8 nextS
1baa0 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
1bab0 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
1bac0 61 62 6c 65 20 77 69 6e 53 68 6d 2e 69 64 20 76  able winShm.id v
1bad0 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  alue */.#endif.}
1bae0 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61  ;../*.** A globa
1baf0 6c 20 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 77  l array of all w
1bb00 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  inShmNode object
1bb10 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 77 69 6e  s..**.** The win
1bb20 53 68 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 6d  ShmMutexHeld() m
1bb30 75 73 74 20 62 65 20 74 72 75 65 20 77 68 69 6c  ust be true whil
1bb40 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
1bb50 74 69 6e 67 20 74 68 69 73 20 6c 69 73 74 2e 0a  ting this list..
1bb60 2a 2f 0a 73 74 61 74 69 63 20 77 69 6e 53 68 6d  */.static winShm
1bb70 4e 6f 64 65 20 2a 77 69 6e 53 68 6d 4e 6f 64 65  Node *winShmNode
1bb80 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  List = 0;../*.**
1bb90 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20   Structure used 
1bba0 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68  internally by th
1bbb0 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64  is VFS to record
1bbc0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e   the state of an
1bbd0 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20  .** open shared 
1bbe0 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f  memory connectio
1bbf0 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  n..**.** The fol
1bc00 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
1bc10 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68  e initialized wh
1bc20 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  en this object i
1bc30 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a  s created and.**
1bc40 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74   are read-only t
1bc50 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a  hereafter:.**.**
1bc60 20 20 20 20 77 69 6e 53 68 6d 2e 70 53 68 6d 4e      winShm.pShmN
1bc70 6f 64 65 0a 2a 2a 20 20 20 20 77 69 6e 53 68 6d  ode.**    winShm
1bc80 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
1bc90 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
1bca0 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
1bcb0 77 69 6e 53 68 6d 2e 70 53 68 6d 4e 6f 64 65 2d  winShm.pShmNode-
1bcc0 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68  >mutex must be h
1bcd0 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63  eld.** while acc
1bce0 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f  essing any read/
1bcf0 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f  write fields..*/
1bd00 0a 73 74 72 75 63 74 20 77 69 6e 53 68 6d 20 7b  .struct winShm {
1bd10 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70  .  winShmNode *p
1bd20 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 2f 2a  ShmNode;      /*
1bd30 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
1bd40 77 69 6e 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  winShmNode objec
1bd50 74 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a 70  t */.  winShm *p
1bd60 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
1bd70 20 20 2f 2a 20 4e 65 78 74 20 77 69 6e 53 68 6d    /* Next winShm
1bd80 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 77   with the same w
1bd90 69 6e 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  inShmNode */.  u
1bda0 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
1bdb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1bdc0 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
1bdd0 20 77 69 6e 53 68 6d 4e 6f 64 65 20 6d 75 74 65   winShmNode mute
1bde0 78 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  x */.  u16 share
1bdf0 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
1be00 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
1be10 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
1be20 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
1be30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1be40 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
1be50 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
1be60 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
1be70 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1be80 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1be90 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 75  VE_OS_TRACE).  u
1bea0 38 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  8 id;           
1beb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20            /* Id 
1bec0 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69  of this connecti
1bed0 6f 6e 20 77 69 74 68 20 69 74 73 20 77 69 6e 53  on with its winS
1bee0 68 6d 4e 6f 64 65 20 2a 2f 0a 23 65 6e 64 69 66  hmNode */.#endif
1bef0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
1bf00 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
1bf10 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
1bf20 20 57 49 4e 5f 53 48 4d 5f 42 41 53 45 20 20 20   WIN_SHM_BASE   
1bf30 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
1bf40 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
1bf50 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62   /* first lock b
1bf60 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  yte */.#define W
1bf70 49 4e 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 57  IN_SHM_DMS    (W
1bf80 49 4e 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IN_SHM_BASE+SQLI
1bf90 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
1bfa0 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
1bfb0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
1bfc0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
1bfd0 66 6f 72 20 61 6c 6c 20 6e 20 62 79 74 65 73 20  for all n bytes 
1bfe0 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 6f 66 73  beginning at ofs
1bff0 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 5f 53  t..*/.#define _S
1c000 48 4d 5f 55 4e 4c 43 4b 20 20 31 0a 23 64 65 66  HM_UNLCK  1.#def
1c010 69 6e 65 20 5f 53 48 4d 5f 52 44 4c 43 4b 20 20  ine _SHM_RDLCK  
1c020 32 0a 23 64 65 66 69 6e 65 20 5f 53 48 4d 5f 57  2.#define _SHM_W
1c030 52 4c 43 4b 20 20 33 0a 73 74 61 74 69 63 20 69  RLCK  3.static i
1c040 6e 74 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c  nt winShmSystemL
1c050 6f 63 6b 28 0a 20 20 77 69 6e 53 68 6d 4e 6f 64  ock(.  winShmNod
1c060 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 2f 2a 20  e *pFile,    /* 
1c070 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
1c080 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
1c090 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
1c0a0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
1c0b0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 5f 53 48  ,         /* _SH
1c0c0 4d 5f 55 4e 4c 43 4b 2c 20 5f 53 48 4d 5f 52 44  M_UNLCK, _SHM_RD
1c0d0 4c 43 4b 2c 20 6f 72 20 5f 53 48 4d 5f 57 52 4c  LCK, or _SHM_WRL
1c0e0 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
1c0f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1c100 20 4f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   Offset to first
1c110 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
1c120 65 64 2f 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  ed/unlocked */. 
1c130 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
1c140 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c150 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
1c160 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a 2f 0a 29  k or unlock */.)
1c170 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20  {.  int rc = 0; 
1c180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1c190 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 4c 6f  ult code form Lo
1c1a0 63 6b 2f 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28  ck/UnlockFileEx(
1c1b0 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65 73  ) */..  /* Acces
1c1c0 73 20 74 6f 20 74 68 65 20 77 69 6e 53 68 6d 4e  s to the winShmN
1c1d0 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 73 65  ode object is se
1c1e0 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68 65 20  rialized by the 
1c1f0 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65  caller */.  asse
1c200 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1c210 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
1c220 74 65 78 29 20 7c 7c 20 70 46 69 6c 65 2d 3e 6e  tex) || pFile->n
1c230 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 4f 53 54  Ref==0 );..  OST
1c240 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
1c250 66 69 6c 65 3d 25 70 2c 20 6c 6f 63 6b 3d 25 64  file=%p, lock=%d
1c260 2c 20 6f 66 66 73 65 74 3d 25 64 2c 20 73 69 7a  , offset=%d, siz
1c270 65 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  e=%d\n",.       
1c280 20 20 20 20 70 46 69 6c 65 2d 3e 68 46 69 6c 65      pFile->hFile
1c290 2e 68 2c 20 6c 6f 63 6b 54 79 70 65 2c 20 6f 66  .h, lockType, of
1c2a0 73 74 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20  st, nByte));..  
1c2b0 2f 2a 20 52 65 6c 65 61 73 65 2f 41 63 71 75 69  /* Release/Acqui
1c2c0 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  re the system-le
1c2d0 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  vel lock */.  if
1c2e0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 5f 53 48 4d  ( lockType==_SHM
1c2f0 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _UNLCK ){.    rc
1c300 20 3d 20 77 69 6e 55 6e 6c 6f 63 6b 46 69 6c 65   = winUnlockFile
1c310 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68  (&pFile->hFile.h
1c320 2c 20 6f 66 73 74 2c 20 30 2c 20 6e 42 79 74 65  , ofst, 0, nByte
1c330 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
1c340 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1c350 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72   the locking par
1c360 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 44  ameters */.    D
1c370 57 4f 52 44 20 64 77 46 6c 61 67 73 20 3d 20 4c  WORD dwFlags = L
1c380 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
1c390 45 44 49 41 54 45 4c 59 3b 0a 20 20 20 20 69 66  EDIATELY;.    if
1c3a0 28 20 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53  ( lockType == _S
1c3b0 48 4d 5f 57 52 4c 43 4b 20 29 20 64 77 46 6c 61  HM_WRLCK ) dwFla
1c3c0 67 73 20 7c 3d 20 4c 4f 43 4b 46 49 4c 45 5f 45  gs |= LOCKFILE_E
1c3d0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3b 0a 20  XCLUSIVE_LOCK;. 
1c3e0 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 63 6b 46     rc = winLockF
1c3f0 69 6c 65 28 26 70 46 69 6c 65 2d 3e 68 46 69 6c  ile(&pFile->hFil
1c400 65 2e 68 2c 20 64 77 46 6c 61 67 73 2c 20 6f 66  e.h, dwFlags, of
1c410 73 74 2c 20 30 2c 20 6e 42 79 74 65 2c 20 30 29  st, 0, nByte, 0)
1c420 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
1c430 3d 20 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  = 0 ){.    rc = 
1c440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1c450 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c  se{.    pFile->l
1c460 61 73 74 45 72 72 6e 6f 20 3d 20 20 6f 73 47 65  astErrno =  osGe
1c470 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
1c480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1c490 53 59 3b 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41  SY;.  }..  OSTRA
1c4a0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 66 69  CE(("SHM-LOCK fi
1c4b0 6c 65 3d 25 70 2c 20 66 75 6e 63 3d 25 73 2c 20  le=%p, func=%s, 
1c4c0 65 72 72 6e 6f 3d 25 6c 75 2c 20 72 63 3d 25 73  errno=%lu, rc=%s
1c4d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c4e0 70 46 69 6c 65 2d 3e 68 46 69 6c 65 2e 68 2c 20  pFile->hFile.h, 
1c4f0 28 6c 6f 63 6b 54 79 70 65 20 3d 3d 20 5f 53 48  (lockType == _SH
1c500 4d 5f 55 4e 4c 43 4b 29 20 3f 20 22 77 69 6e 55  M_UNLCK) ? "winU
1c510 6e 6c 6f 63 6b 46 69 6c 65 22 20 3a 0a 20 20 20  nlockFile" :.   
1c520 20 20 20 20 20 20 20 20 22 77 69 6e 4c 6f 63 6b          "winLock
1c530 46 69 6c 65 22 2c 20 70 46 69 6c 65 2d 3e 6c 61  File", pFile->la
1c540 73 74 45 72 72 6e 6f 2c 20 73 71 6c 69 74 65 33  stErrno, sqlite3
1c550 45 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 0a  ErrName(rc)));..
1c560 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c570 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1c580 65 6e 63 65 73 20 74 6f 20 56 46 53 20 6d 65 74  ences to VFS met
1c590 68 6f 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 69  hods */.static i
1c5a0 6e 74 20 77 69 6e 4f 70 65 6e 28 73 71 6c 69 74  nt winOpen(sqlit
1c5b0 65 33 5f 76 66 73 2a 2c 63 6f 6e 73 74 20 63 68  e3_vfs*,const ch
1c5c0 61 72 2a 2c 73 71 6c 69 74 65 33 5f 66 69 6c 65  ar*,sqlite3_file
1c5d0 2a 2c 69 6e 74 2c 69 6e 74 2a 29 3b 0a 73 74 61  *,int,int*);.sta
1c5e0 74 69 63 20 69 6e 74 20 77 69 6e 44 65 6c 65 74  tic int winDelet
1c5f0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2c  e(sqlite3_vfs *,
1c600 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29  const char*,int)
1c610 3b 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74  ;../*.** Purge t
1c620 68 65 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73  he winShmNodeLis
1c630 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
1c640 74 72 69 65 73 20 77 69 74 68 20 77 69 6e 53 68  tries with winSh
1c650 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
1c660 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
1c670 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
1c680 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
1c690 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
1c6a0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
1c6b0 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
1c6c0 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
1c6d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e  .static void win
1c6e0 53 68 6d 50 75 72 67 65 28 73 71 6c 69 74 65 33  ShmPurge(sqlite3
1c6f0 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
1c700 64 65 6c 65 74 65 46 6c 61 67 29 7b 0a 20 20 77  deleteFlag){.  w
1c710 69 6e 53 68 6d 4e 6f 64 65 20 2a 2a 70 70 3b 0a  inShmNode **pp;.
1c720 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 3b    winShmNode *p;
1c730 0a 20 20 61 73 73 65 72 74 28 20 77 69 6e 53 68  .  assert( winSh
1c740 6d 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  mMutexHeld() );.
1c750 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1c760 50 55 52 47 45 20 70 69 64 3d 25 6c 75 2c 20 64  PURGE pid=%lu, d
1c770 65 6c 65 74 65 46 6c 61 67 3d 25 64 5c 6e 22 2c  eleteFlag=%d\n",
1c780 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
1c790 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
1c7a0 64 28 29 2c 20 64 65 6c 65 74 65 46 6c 61 67 29  d(), deleteFlag)
1c7b0 29 3b 0a 20 20 70 70 20 3d 20 26 77 69 6e 53 68  );.  pp = &winSh
1c7c0 6d 4e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  mNodeList;.  whi
1c7d0 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
1c7e0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
1c7f0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
1c800 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28  int i;.      if(
1c810 20 70 2d 3e 6d 75 74 65 78 20 29 7b 20 73 71 6c   p->mutex ){ sql
1c820 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
1c830 70 2d 3e 6d 75 74 65 78 29 3b 20 7d 0a 20 20 20  p->mutex); }.   
1c840 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
1c850 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  >nRegion; i++){.
1c860 20 20 20 20 20 20 20 20 42 4f 4f 4c 20 62 52 63          BOOL bRc
1c870 20 3d 20 6f 73 55 6e 6d 61 70 56 69 65 77 4f 66   = osUnmapViewOf
1c880 46 69 6c 65 28 70 2d 3e 61 52 65 67 69 6f 6e 5b  File(p->aRegion[
1c890 69 5d 2e 70 4d 61 70 29 3b 0a 20 20 20 20 20 20  i].pMap);.      
1c8a0 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1c8b0 50 55 52 47 45 2d 55 4e 4d 41 50 20 70 69 64 3d  PURGE-UNMAP pid=
1c8c0 25 6c 75 2c 20 72 65 67 69 6f 6e 3d 25 64 2c 20  %lu, region=%d, 
1c8d0 72 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rc=%s\n",.      
1c8e0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
1c8f0 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
1c900 28 29 2c 20 69 2c 20 62 52 63 20 3f 20 22 6f 6b  (), i, bRc ? "ok
1c910 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
1c920 20 20 20 20 20 20 20 20 55 4e 55 53 45 44 5f 56          UNUSED_V
1c930 41 52 49 41 42 4c 45 5f 56 41 4c 55 45 28 62 52  ARIABLE_VALUE(bR
1c940 63 29 3b 0a 20 20 20 20 20 20 20 20 62 52 63 20  c);.        bRc 
1c950 3d 20 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28  = osCloseHandle(
1c960 70 2d 3e 61 52 65 67 69 6f 6e 5b 69 5d 2e 68 4d  p->aRegion[i].hM
1c970 61 70 29 3b 0a 20 20 20 20 20 20 20 20 4f 53 54  ap);.        OST
1c980 52 41 43 45 28 28 22 53 48 4d 2d 50 55 52 47 45  RACE(("SHM-PURGE
1c990 2d 43 4c 4f 53 45 20 70 69 64 3d 25 6c 75 2c 20  -CLOSE pid=%lu, 
1c9a0 72 65 67 69 6f 6e 3d 25 64 2c 20 72 63 3d 25 73  region=%d, rc=%s
1c9b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c9c0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
1c9d0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 69  ntProcessId(), i
1c9e0 2c 20 62 52 63 20 3f 20 22 6f 6b 22 20 3a 20 22  , bRc ? "ok" : "
1c9f0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20 20 20  failed"));.     
1ca00 20 20 20 55 4e 55 53 45 44 5f 56 41 52 49 41 42     UNUSED_VARIAB
1ca10 4c 45 5f 56 41 4c 55 45 28 62 52 63 29 3b 0a 20  LE_VALUE(bRc);. 
1ca20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1ca30 20 70 2d 3e 68 46 69 6c 65 2e 68 21 3d 4e 55 4c   p->hFile.h!=NUL
1ca40 4c 20 26 26 20 70 2d 3e 68 46 69 6c 65 2e 68 21  L && p->hFile.h!
1ca50 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
1ca60 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 20  VALUE ){.       
1ca70 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1ca80 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1ca90 20 20 20 77 69 6e 43 6c 6f 73 65 28 28 73 71 6c     winClose((sql
1caa0 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 2d 3e  ite3_file *)&p->
1cab0 68 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  hFile);.        
1cac0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1cad0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1cae0 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c 65  }.      if( dele
1caf0 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  teFlag ){.      
1cb00 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cb10 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
1cb20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
1cb30 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1cb40 20 20 20 20 20 20 20 20 77 69 6e 44 65 6c 65 74          winDelet
1cb50 65 28 70 56 66 73 2c 20 70 2d 3e 7a 46 69 6c 65  e(pVfs, p->zFile
1cb60 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  name, 0);.      
1cb70 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
1cb80 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
1cb90 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1cba0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1cbb0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
1cbc0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  = p->pNext;.    
1cbd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cbe0 2d 3e 61 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  ->aRegion);.    
1cbf0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1cc00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cc10 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e 65      pp = &p->pNe
1cc20 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
1cc30 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
1cc40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
1cc50 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
1cc60 74 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  th database file
1cc70 20 70 44 62 46 64 2e 0a 2a 2a 0a 2a 2a 20 57 68   pDbFd..**.** Wh
1cc80 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77  en opening a new
1cc90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
1cca0 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72  ile, if no other
1ccb0 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1ccc0 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63  at.** file are c
1ccd0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69  urrently open, i
1cce0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f  n this process o
1ccf0 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65  r in other proce
1cd00 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sses, then.** th
1cd10 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74  e file must be t
1cd20 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1cd30 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20   length or have 
1cd40 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61 72  its header clear
1cd50 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1cd60 74 20 77 69 6e 4f 70 65 6e 53 68 61 72 65 64 4d  t winOpenSharedM
1cd70 65 6d 6f 72 79 28 77 69 6e 46 69 6c 65 20 2a 70  emory(winFile *p
1cd80 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20  DbFd){.  struct 
1cd90 77 69 6e 53 68 6d 20 2a 70 3b 20 20 20 20 20 20  winShm *p;      
1cda0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1cdb0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
1cdc0 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
1cdd0 73 74 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64  struct winShmNod
1cde0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e *pShmNode = 0;
1cdf0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
1ce00 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
1ce10 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1ce20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
1ce40 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 73 74  ult code */.  st
1ce50 72 75 63 74 20 77 69 6e 53 68 6d 4e 6f 64 65 20  ruct winShmNode 
1ce60 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20  *pNew;          
1ce70 20 2f 2a 20 4e 65 77 6c 79 20 61 6c 6c 6f 63 61   /* Newly alloca
1ce80 74 65 64 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a  ted winShmNode *
1ce90 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
1cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ceb0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1cec0 66 20 7a 4e 61 6d 65 20 69 6e 20 62 79 74 65 73  f zName in bytes
1ced0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
1cee0 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b  DbFd->pShm==0 );
1cef0 20 20 20 20 2f 2a 20 4e 6f 74 20 70 72 65 76 69      /* Not previ
1cf00 6f 75 73 6c 79 20 6f 70 65 6e 65 64 20 2a 2f 0a  ously opened */.
1cf10 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
1cf20 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
1cf30 20 73 71 6c 69 74 65 33 5f 73 68 6d 20 6f 62 6a   sqlite3_shm obj
1cf40 65 63 74 2e 20 20 41 6c 73 6f 20 73 70 65 63 75  ect.  Also specu
1cf50 6c 61 74 69 76 65 6c 79 0a 20 20 2a 2a 20 61 6c  latively.  ** al
1cf60 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1cf70 20 61 20 6e 65 77 20 77 69 6e 53 68 6d 4e 6f 64   a new winShmNod
1cf80 65 20 61 6e 64 20 66 69 6c 65 6e 61 6d 65 2e 0a  e and filename..
1cf90 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
1cfa0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
1cfb0 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
1cfc0 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1cfd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
1cfe0 45 4d 5f 42 4b 50 54 3b 0a 20 20 6e 4e 61 6d 65  EM_BKPT;.  nName
1cff0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
1d000 33 30 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  30(pDbFd->zPath)
1d010 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
1d020 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
1d030 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
1d040 2b 20 6e 4e 61 6d 65 20 2b 20 31 37 20 29 3b 0a  + nName + 17 );.
1d050 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1d060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1d070 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
1d080 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
1d090 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
1d0a0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  pNew->zFilename 
1d0b0 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31  = (char*)&pNew[1
1d0c0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ];.  sqlite3_snp
1d0d0 72 69 6e 74 66 28 6e 4e 61 6d 65 2b 31 35 2c 20  rintf(nName+15, 
1d0e0 70 4e 65 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  pNew->zFilename,
1d0f0 20 22 25 73 2d 73 68 6d 22 2c 20 70 44 62 46 64   "%s-shm", pDbFd
1d100 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 73 71 6c 69  ->zPath);.  sqli
1d110 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70  te3FileSuffix3(p
1d120 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 70 4e 65  DbFd->zPath, pNe
1d130 77 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 0a  w->zFilename);..
1d140 20 20 2f 2a 20 4c 6f 6f 6b 20 74 6f 20 73 65 65    /* Look to see
1d150 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1d160 65 78 69 73 74 69 6e 67 20 77 69 6e 53 68 6d 4e  existing winShmN
1d170 6f 64 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ode that can be 
1d180 75 73 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f  used..  ** If no
1d190 20 6d 61 74 63 68 69 6e 67 20 77 69 6e 53 68 6d   matching winShm
1d1a0 4e 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 65  Node currently e
1d1b0 78 69 73 74 73 2c 20 63 72 65 61 74 65 20 61 20  xists, create a 
1d1c0 6e 65 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20  new one..  */.  
1d1d0 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65 78  winShmEnterMutex
1d1e0 28 29 3b 0a 20 20 66 6f 72 28 70 53 68 6d 4e 6f  ();.  for(pShmNo
1d1f0 64 65 20 3d 20 77 69 6e 53 68 6d 4e 6f 64 65 4c  de = winShmNodeL
1d200 69 73 74 3b 20 70 53 68 6d 4e 6f 64 65 3b 20 70  ist; pShmNode; p
1d210 53 68 6d 4e 6f 64 65 3d 70 53 68 6d 4e 6f 64 65  ShmNode=pShmNode
1d220 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
1d230 20 54 42 44 20 6e 65 65 64 20 74 6f 20 63 6f 6d   TBD need to com
1d240 65 20 75 70 20 77 69 74 68 20 62 65 74 74 65 72  e up with better
1d250 20 6d 61 74 63 68 20 68 65 72 65 2e 20 20 50 65   match here.  Pe
1d260 72 68 61 70 73 0a 20 20 20 20 2a 2a 20 75 73 65  rhaps.    ** use
1d270 20 46 49 4c 45 5f 49 44 5f 42 4f 54 48 5f 44 49   FILE_ID_BOTH_DI
1d280 52 5f 49 4e 46 4f 20 53 74 72 75 63 74 75 72 65  R_INFO Structure
1d290 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1d2a0 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d2b0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
1d2c0 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 46 69 6c 65  ame, pNew->zFile
1d2d0 6e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  name)==0 ) break
1d2e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
1d2f0 4e 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Node ){.    sqli
1d300 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a  te3_free(pNew);.
1d310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 68    }else{.    pSh
1d320 6d 4e 6f 64 65 20 3d 20 70 4e 65 77 3b 0a 20 20  mNode = pNew;.  
1d330 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
1d340 28 28 77 69 6e 46 69 6c 65 2a 29 28 26 70 53 68  ((winFile*)(&pSh
1d350 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 29 29 2d 3e  mNode->hFile))->
1d360 68 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44  h = INVALID_HAND
1d370 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 20 20 70 53  LE_VALUE;.    pS
1d380 68 6d 4e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20  hmNode->pNext = 
1d390 77 69 6e 53 68 6d 4e 6f 64 65 4c 69 73 74 3b 0a  winShmNodeList;.
1d3a0 20 20 20 20 77 69 6e 53 68 6d 4e 6f 64 65 4c 69      winShmNodeLi
1d3b0 73 74 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 0a  st = pShmNode;..
1d3c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
1d3d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
1d3e0 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
1d3f0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20  pShmNode->mutex 
1d400 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
1d410 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1d420 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
1d430 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  if( pShmNode->mu
1d440 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
1d450 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1d460 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1d470 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
1d480 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20  _open_err;.     
1d490 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1d4a0 20 3d 20 77 69 6e 4f 70 65 6e 28 70 44 62 46 64   = winOpen(pDbFd
1d4b0 2d 3e 70 56 66 73 2c 0a 20 20 20 20 20 20 20 20  ->pVfs,.        
1d4c0 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
1d4d0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  e->zFilename,   
1d4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
1d4f0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 28 55  e of the file (U
1d500 54 46 2d 38 29 20 2a 2f 0a 20 20 20 20 20 20 20  TF-8) */.       
1d510 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
1d520 65 33 5f 66 69 6c 65 2a 29 26 70 53 68 6d 4e 6f  e3_file*)&pShmNo
1d530 64 65 2d 3e 68 46 69 6c 65 2c 20 20 2f 2a 20 46  de->hFile,  /* F
1d540 69 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20  ile handle here 
1d550 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1d560 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
1d570 57 41 4c 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  WAL | SQLITE_OPE
1d580 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
1d590 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1d5a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d5b0 20 20 20 30 29 3b 0a 20 20 20 20 69 66 28 20 53     0);.    if( S
1d5c0 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
1d5d0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1d5e0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
1d5f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
1d600 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70  see if another p
1d610 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
1d620 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73  g the dead-man s
1d630 77 69 74 63 68 2e 0a 20 20 20 20 2a 2a 20 49 66  witch..    ** If
1d640 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
1d650 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1d660 6c 65 6e 67 74 68 2e 0a 20 20 20 20 2a 2f 0a 20  length..    */. 
1d670 20 20 20 69 66 28 20 77 69 6e 53 68 6d 53 79 73     if( winShmSys
1d680 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65  temLock(pShmNode
1d690 2c 20 5f 53 48 4d 5f 57 52 4c 43 4b 2c 20 57 49  , _SHM_WRLCK, WI
1d6a0 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53  N_SHM_DMS, 1)==S
1d6b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d6c0 20 20 72 63 20 3d 20 77 69 6e 54 72 75 6e 63 61    rc = winTrunca
1d6d0 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
1d6e0 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d 3e 68 46   *)&pShmNode->hF
1d6f0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ile, 0);.      i
1d700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d710 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1d720 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
1d730 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
1d740 4e 2c 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f  N, osGetLastErro
1d750 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r(),.           
1d760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
1d770 69 6e 4f 70 65 6e 53 68 6d 22 2c 20 70 44 62 46  inOpenShm", pDbF
1d780 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  d->zPath);.     
1d790 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1d7a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1d7b0 7b 0a 20 20 20 20 20 20 77 69 6e 53 68 6d 53 79  {.      winShmSy
1d7c0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1d7d0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 57  e, _SHM_UNLCK, W
1d7e0 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a  IN_SHM_DMS, 1);.
1d7f0 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68        rc = winSh
1d800 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
1d810 4e 6f 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b  Node, _SHM_RDLCK
1d820 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d 53 2c 20 31  , WIN_SHM_DMS, 1
1d830 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1d840 20 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f   rc ) goto shm_o
1d850 70 65 6e 5f 65 72 72 3b 0a 20 20 7d 0a 0a 20 20  pen_err;.  }..  
1d860 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
1d870 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
1d880 6c 64 20 6f 66 20 74 68 65 20 77 69 6e 53 68 6d  ld of the winShm
1d890 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
1d8a0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
1d8b0 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ;.#if defined(SQ
1d8c0 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64  LITE_DEBUG) || d
1d8d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41  efined(SQLITE_HA
1d8e0 56 45 5f 4f 53 5f 54 52 41 43 45 29 0a 20 20 70  VE_OS_TRACE).  p
1d8f0 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  ->id = pShmNode-
1d900 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65  >nextShmId++;.#e
1d910 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d  ndif.  pShmNode-
1d920 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64  >nRef++;.  pDbFd
1d930 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 77 69  ->pShm = p;.  wi
1d940 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28 29  nShmLeaveMutex()
1d950 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66 65  ;..  /* The refe
1d960 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70  rence count on p
1d970 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72 65  ShmNode has alre
1d980 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d 65  ady been increme
1d990 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20  nted under.  ** 
1d9a0 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68 65  the cover of the
1d9b0 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74 65   winShmEnterMute
1d9c0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
1d9d0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
1d9e0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
1d9f0 75 63 74 20 77 69 6e 53 68 6d 29 20 6f 62 6a 65  uct winShm) obje
1da00 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
1da10 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
1da20 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
1da30 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
1da40 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
1da50 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
1da60 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
1da70 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
1da80 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
1da90 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
1daa0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
1dab0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
1dac0 65 78 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20  ex.  ** mutex.. 
1dad0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
1dae0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1daf0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d  de->mutex);.  p-
1db00 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64  >pNext = pShmNod
1db10 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53 68  e->pFirst;.  pSh
1db20 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d 20  mNode->pFirst = 
1db30 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  p;.  sqlite3_mut
1db40 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
1db50 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
1db60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1db70 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f    /* Jump here o
1db80 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73  n any error */.s
1db90 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 77  hm_open_err:.  w
1dba0 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  inShmSystemLock(
1dbb0 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48 4d 5f 55  pShmNode, _SHM_U
1dbc0 4e 4c 43 4b 2c 20 57 49 4e 5f 53 48 4d 5f 44 4d  NLCK, WIN_SHM_DM
1dbd0 53 2c 20 31 29 3b 0a 20 20 77 69 6e 53 68 6d 50  S, 1);.  winShmP
1dbe0 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66 73  urge(pDbFd->pVfs
1dbf0 2c 20 30 29 3b 20 20 20 20 20 20 2f 2a 20 54 68  , 0);      /* Th
1dc00 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
1dc10 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
1dc20 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1dc30 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
1dc40 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1dc50 20 77 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65   winShmLeaveMute
1dc60 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  x();.  return rc
1dc70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1dc80 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1dc90 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20   shared-memory. 
1dca0 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65   Delete the unde
1dcb0 72 6c 79 69 6e 67 0a 2a 2a 20 73 74 6f 72 61 67  rlying.** storag
1dcc0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
1dcd0 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
1dce0 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 55 6e 6d  ic int winShmUnm
1dcf0 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ap(.  sqlite3_fi
1dd00 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1dd10 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1dd20 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f  ding shared memo
1dd30 72 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  ry */.  int dele
1dd40 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
1dd50 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 66 74     /* Delete aft
1dd60 65 72 20 63 6c 6f 73 69 6e 67 20 69 66 20 74 72  er closing if tr
1dd70 75 65 20 2a 2f 0a 29 7b 0a 20 20 77 69 6e 46 69  ue */.){.  winFi
1dd80 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20  le *pDbFd;      
1dd90 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 6f 6c   /* Database hol
1dda0 64 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f  ding shared-memo
1ddb0 72 79 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 20 2a  ry */.  winShm *
1ddc0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p;            /*
1ddd0 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
1dde0 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
1ddf0 20 20 77 69 6e 53 68 6d 4e 6f 64 65 20 2a 70 53    winShmNode *pS
1de00 68 6d 4e 6f 64 65 3b 20 2f 2a 20 54 68 65 20 75  hmNode; /* The u
1de10 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
1de20 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
1de30 20 20 77 69 6e 53 68 6d 20 2a 2a 70 70 3b 20 20    winShm **pp;  
1de40 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1de50 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
1de60 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
1de70 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 77  */..  pDbFd = (w
1de80 69 6e 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  inFile*)fd;.  p 
1de90 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
1dea0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1deb0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1dec0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
1ded0 68 6d 4e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 52 65  hmNode;..  /* Re
1dee0 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  move connection 
1def0 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f  p from the set o
1df00 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73  f connections as
1df10 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69  sociated.  ** wi
1df20 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  th pShmNode */. 
1df30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1df40 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
1df50 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d  utex);.  for(pp=
1df60 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  &pShmNode->pFirs
1df70 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20  t; (*pp)!=p; pp 
1df80 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  = &(*pp)->pNext)
1df90 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  {}.  *pp = p->pN
1dfa0 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20  ext;..  /* Free 
1dfb0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  the connection p
1dfc0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
1dfd0 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e  ee(p);.  pDbFd->
1dfe0 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69  pShm = 0;.  sqli
1dff0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1e000 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
1e010 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e  ;..  /* If pShmN
1e020 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65  ode->nRef has re
1e030 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c  ached 0, then cl
1e040 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ose the underlyi
1e050 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d  ng.  ** shared-m
1e060 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20  emory file, too 
1e070 2a 2f 0a 20 20 77 69 6e 53 68 6d 45 6e 74 65 72  */.  winShmEnter
1e080 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
1e090 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  t( pShmNode->nRe
1e0a0 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64  f>0 );.  pShmNod
1e0b0 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  e->nRef--;.  if(
1e0c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d   pShmNode->nRef=
1e0d0 3d 30 20 29 7b 0a 20 20 20 20 77 69 6e 53 68 6d  =0 ){.    winShm
1e0e0 50 75 72 67 65 28 70 44 62 46 64 2d 3e 70 56 66  Purge(pDbFd->pVf
1e0f0 73 2c 20 64 65 6c 65 74 65 46 6c 61 67 29 3b 0a  s, deleteFlag);.
1e100 20 20 7d 0a 20 20 77 69 6e 53 68 6d 4c 65 61 76    }.  winShmLeav
1e110 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
1e120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e130 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
1e140 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
1e150 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
1e160 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  y segment..*/.st
1e170 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68 6d 4c  atic int winShmL
1e180 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ock(.  sqlite3_f
1e190 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
1e1a0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
1e1b0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
1e1c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
1e1d0 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20    int ofst,     
1e1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1f0 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63  First lock to ac
1e200 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65  quire or release
1e210 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20   */.  int n,    
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e230 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f   /* Number of lo
1e240 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f  cks to acquire o
1e250 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
1e260 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61            /* Wha
1e280 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65  t to do with the
1e290 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 77 69   lock */.){.  wi
1e2a0 6e 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  nFile *pDbFd = (
1e2b0 77 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  winFile*)fd;    
1e2c0 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f      /* Connectio
1e2d0 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64  n holding shared
1e2e0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 77 69 6e   memory */.  win
1e2f0 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
1e300 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1e310 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64     /* The shared
1e320 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f   memory being lo
1e330 63 6b 65 64 20 2a 2f 0a 20 20 77 69 6e 53 68 6d  cked */.  winShm
1e340 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
1e370 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73  ver all siblings
1e380 20 2a 2f 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65   */.  winShmNode
1e390 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
1e3a0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
1e3b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
1e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3d0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1e3e0 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1e410 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
1e420 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
1e430 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 66  */..  assert( of
1e440 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
1e450 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
1e460 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
1e470 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
1e480 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
1e490 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
1e4a0 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
1e4b0 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
1e4c0 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
1e4d0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
1e4e0 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
1e4f0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
1e500 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
1e510 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
1e520 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
1e530 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
1e540 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
1e550 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
1e560 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
1e570 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
1e580 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
1e590 21 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d  !=0 );..  mask =
1e5a0 20 28 75 31 36 29 28 28 31 55 3c 3c 28 6f 66 73   (u16)((1U<<(ofs
1e5b0 74 2b 6e 29 29 20 2d 20 28 31 55 3c 3c 6f 66 73  t+n)) - (1U<<ofs
1e5c0 74 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  t));.  assert( n
1e5d0 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c  >1 || mask==(1<<
1e5e0 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74  ofst) );.  sqlit
1e5f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
1e600 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
1e610 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  .  if( flags & S
1e620 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
1e630 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d   ){.    u16 allM
1e640 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b  ask = 0; /* Mask
1e650 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1e660 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20  y siblings */.. 
1e670 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79     /* See if any
1e680 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74   siblings hold t
1e690 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f  his same lock */
1e6a0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
1e6b0 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
1e6c0 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
1e6d0 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70  .      if( pX==p
1e6e0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e6f0 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e     assert( (pX->
1e700 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65  exclMask & (p->e
1e710 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65  xclMask|p->share
1e720 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20  dMask))==0 );.  
1e730 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70      allMask |= p
1e740 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
1e750 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c     }..    /* Unl
1e760 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ock the system-l
1e770 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  evel locks */.  
1e780 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c    if( (mask & al
1e790 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  lMask)==0 ){.   
1e7a0 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53 79     rc = winShmSy
1e7b0 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
1e7c0 65 2c 20 5f 53 48 4d 5f 55 4e 4c 43 4b 2c 20 6f  e, _SHM_UNLCK, o
1e7d0 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53 45  fst+WIN_SHM_BASE
1e7e0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
1e7f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1e800 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  TE_OK;.    }..  
1e810 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f    /* Undo the lo
1e820 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  cal locks */.   
1e830 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e840 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65  OK ){.      p->e
1e850 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  xclMask &= ~mask
1e860 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  ;.      p->share
1e870 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
1e880 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
1e890 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
1e8a0 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
1e8b0 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
1e8c0 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
1e8d0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
1e8e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
1e8f0 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
1e900 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
1e910 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
1e920 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
1e930 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
1e940 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
1e950 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
1e960 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
1e970 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
1e980 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
1e990 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
1e9a0 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
1e9b0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
1e9c0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
1e9d0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
1e9e0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
1e9f0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
1ea00 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ea10 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1ea20 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1ea30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1ea40 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
1ea50 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
1ea60 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
1ea70 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
1ea80 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
1ea90 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
1eaa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
1eac0 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
1ead0 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
1eae0 20 20 20 20 72 63 20 3d 20 77 69 6e 53 68 6d 53      rc = winShmS
1eaf0 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f  ystemLock(pShmNo
1eb00 64 65 2c 20 5f 53 48 4d 5f 52 44 4c 43 4b 2c 20  de, _SHM_RDLCK, 
1eb10 6f 66 73 74 2b 57 49 4e 5f 53 48 4d 5f 42 41 53  ofst+WIN_SHM_BAS
1eb20 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, n);.      }el
1eb30 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1eb40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1eb50 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1eb60 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20  * Get the local 
1eb70 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a  shared locks */.
1eb80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1eb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1eba0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20  ->sharedMask |= 
1ebb0 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  mask;.    }.  }e
1ebc0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65  lse{.    /* Make
1ebd0 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67   sure no sibling
1ebe0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c   connections hol
1ebf0 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c  d locks that wil
1ec00 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20  l block this.   
1ec10 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e   ** lock.  If an
1ec20 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c  y do, return SQL
1ec30 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61  ITE_BUSY right a
1ec40 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  way..    */.    
1ec50 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
1ec60 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
1ec70 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
1ec80 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
1ec90 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c  ask & mask)!=0 |
1eca0 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  | (pX->sharedMas
1ecb0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a  k & mask)!=0 ){.
1ecc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1ecd0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
1ece0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ecf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
1ed00 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1ed10 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
1ed20 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
1ed30 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
1ed40 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
1ed50 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
1ed60 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
1ed70 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
1ed80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ed90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1eda0 3d 20 77 69 6e 53 68 6d 53 79 73 74 65 6d 4c 6f  = winShmSystemLo
1edb0 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 5f 53 48  ck(pShmNode, _SH
1edc0 4d 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 57 49  M_WRLCK, ofst+WI
1edd0 4e 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  N_SHM_BASE, n);.
1ede0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1edf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ee00 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
1ee10 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
1ee20 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
1ee30 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
1ee40 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
1ee50 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ee60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
1ee70 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
1ee80 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
1ee90 4f 43 4b 20 70 69 64 3d 25 6c 75 2c 20 69 64 3d  OCK pid=%lu, id=
1eea0 25 64 2c 20 73 68 61 72 65 64 4d 61 73 6b 3d 25  %d, sharedMask=%
1eeb0 30 33 78 2c 20 65 78 63 6c 4d 61 73 6b 3d 25 30  03x, exclMask=%0
1eec0 33 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20 20  3x, rc=%s\n",.  
1eed0 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75           osGetCu
1eee0 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29  rrentProcessId()
1eef0 2c 20 70 2d 3e 69 64 2c 20 70 2d 3e 73 68 61 72  , p->id, p->shar
1ef00 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
1ef10 61 73 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ask,.           
1ef20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ef30 63 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  c)));.  return r
1ef40 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  c;.}../*.** Impl
1ef50 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62  ement a memory b
1ef60 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79  arrier or memory
1ef70 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64   fence on shared
1ef80 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 41   memory..**.** A
1ef90 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
1efa0 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
1efb0 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
1efc0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
1efd0 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
1efe0 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
1eff0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
1f000 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
1f010 69 6e 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  inShmBarrier(.  
1f020 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
1f030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f040 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
1f050 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
1f060 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
1f070 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
1f080 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72  sqlite3MemoryBar
1f090 72 69 65 72 28 29 3b 20 20 20 2f 2a 20 63 6f 6d  rier();   /* com
1f0a0 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65  piler-defined me
1f0b0 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a  mory barrier */.
1f0c0 20 20 77 69 6e 53 68 6d 45 6e 74 65 72 4d 75 74    winShmEnterMut
1f0d0 65 78 28 29 3b 20 20 20 20 20 20 20 2f 2a 20 41  ex();       /* A
1f0e0 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
1f0f0 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 77  edundancy */.  w
1f100 69 6e 53 68 6d 4c 65 61 76 65 4d 75 74 65 78 28  inShmLeaveMutex(
1f110 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1f120 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1f130 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
1f140 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
1f150 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
1f160 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  .** shared-memor
1f170 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
1f180 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  h the database f
1f190 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d  ile fd. Shared-m
1f1a0 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 0a 2a 2a  emory regions.**
1f1b0 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74   are numbered st
1f1c0 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f  arting from zero
1f1d0 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65  . Each shared-me
1f1e0 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73  mory region is s
1f1f0 7a 52 65 67 69 6f 6e 0a 2a 2a 20 62 79 74 65 73  zRegion.** bytes
1f200 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
1f210 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1f220 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
1f230 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
1f240 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
1f250 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
1f260 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 69 73  rwise, if the is
1f270 57 72 69 74 65 20 70 61 72 61 6d 65 74 65 72 20  Write parameter 
1f280 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
1f290 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
1f2a0 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
1f2b0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1f2c0 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
1f2d0 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
1f2e0 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
1f2f0 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
1f300 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
1f310 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
1f320 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
1f330 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20 69 73 57  urned. If.** isW
1f340 72 69 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rite is non-zero
1f350 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74   and the request
1f360 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ed shared-memory
1f370 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20   region has not 
1f380 79 65 74 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  yet.** been allo
1f390 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
1f3a0 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
1f3b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
1f3c0 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
1f3d0 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
1f3e0 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
1f3f0 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
1f400 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
1f410 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
1f420 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
1f430 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
1f440 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 0a   this processes.
1f450 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
1f460 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
1f470 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
1f480 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
1f490 74 68 65 20 6d 61 70 70 65 64 0a 2a 2a 20 6d 65  the mapped.** me
1f4a0 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
1f4b0 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OK returned..*/.
1f4c0 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53 68  static int winSh
1f4d0 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
1f4e0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1f4f0 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
1f500 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
1f510 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
1f520 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
1f530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f540 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
1f550 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
1f560 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
1f570 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1f580 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
1f590 69 6e 74 20 69 73 57 72 69 74 65 2c 20 20 20 20  int isWrite,    
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
1f5c0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
1f5d0 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
1f5e0 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
1f5f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1f600 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
1f610 2f 0a 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a  /.){.  winFile *
1f620 70 44 62 46 64 20 3d 20 28 77 69 6e 46 69 6c 65  pDbFd = (winFile
1f630 2a 29 66 64 3b 0a 20 20 77 69 6e 53 68 6d 20 2a  *)fd;.  winShm *
1f640 70 53 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53  pShm = pDbFd->pS
1f650 68 6d 3b 0a 20 20 77 69 6e 53 68 6d 4e 6f 64 65  hm;.  winShmNode
1f660 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
1f670 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f680 3b 0a 0a 20 20 69 66 28 20 21 70 53 68 6d 20 29  ;..  if( !pShm )
1f690 7b 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 4f 70  {.    rc = winOp
1f6a0 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
1f6b0 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
1f6c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f6d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 53  eturn rc;.    pS
1f6e0 68 6d 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  hm = pDbFd->pShm
1f6f0 3b 0a 20 20 7d 0a 20 20 70 53 68 6d 4e 6f 64 65  ;.  }.  pShmNode
1f700 20 3d 20 70 53 68 6d 2d 3e 70 53 68 6d 4e 6f 64   = pShm->pShmNod
1f710 65 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  e;..  sqlite3_mu
1f720 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
1f730 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  de->mutex);.  as
1f740 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
1f750 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
1f760 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
1f770 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 0a 20  nRegion==0 );.. 
1f780 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
1f790 52 65 67 69 6f 6e 3c 3d 69 52 65 67 69 6f 6e 20  Region<=iRegion 
1f7a0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 68  ){.    struct Sh
1f7b0 6d 52 65 67 69 6f 6e 20 2a 61 70 4e 65 77 3b 20  mRegion *apNew; 
1f7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1f7d0 20 61 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79   aRegion[] array
1f7e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
1f7f0 65 20 3d 20 28 69 52 65 67 69 6f 6e 2b 31 29 2a  e = (iRegion+1)*
1f800 73 7a 52 65 67 69 6f 6e 3b 20 20 2f 2a 20 4d 69  szRegion;  /* Mi
1f810 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66  nimum required f
1f820 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1f830 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a  sqlite3_int64 sz
1f840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f850 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 69     /* Current si
1f860 7a 65 20 6f 66 20 77 61 6c 2d 69 6e 64 65 78 20  ze of wal-index 
1f870 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 70 53 68  file */..    pSh
1f880 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
1f890 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
1f8a0 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65   /* The requeste
1f8b0 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20  d region is not 
1f8c0 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73  mapped into this
1f8d0 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65   processes addre
1f8e0 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a  ss space..    **
1f8f0 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
1f900 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
1f910 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
1f920 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
1f930 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 6c 61 72  le is.    ** lar
1f940 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
1f950 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
1f960 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
1f970 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 69 6e 46  */.    rc = winF
1f980 69 6c 65 53 69 7a 65 28 28 73 71 6c 69 74 65 33  ileSize((sqlite3
1f990 5f 66 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64  _file *)&pShmNod
1f9a0 65 2d 3e 68 46 69 6c 65 2c 20 26 73 7a 29 3b 0a  e->hFile, &sz);.
1f9b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f9c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1f9d0 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  c = winLogError(
1f9e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
1f9f0 53 49 5a 45 2c 20 6f 73 47 65 74 4c 61 73 74 45  SIZE, osGetLastE
1fa00 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20  rror(),.        
1fa10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1fa20 77 69 6e 53 68 6d 4d 61 70 31 22 2c 20 70 44 62  winShmMap1", pDb
1fa30 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  Fd->zPath);.    
1fa40 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
1fa50 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
1fa60 66 28 20 73 7a 3c 6e 42 79 74 65 20 29 7b 0a 20  f( sz<nByte ){. 
1fa70 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
1fa80 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
1fa90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
1faa0 73 74 2e 20 49 66 20 69 73 57 72 69 74 65 20 69  st. If isWrite i
1fab0 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 2a  s set to.      *
1fac0 2a 20 7a 65 72 6f 2c 20 65 78 69 74 20 65 61 72  * zero, exit ear
1fad0 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
1fae0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
1faf0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
1fb00 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
1fb10 20 20 20 2a 2a 20 41 6c 74 65 72 6e 61 74 69 76     ** Alternativ
1fb20 65 6c 79 2c 20 69 66 20 69 73 57 72 69 74 65 20  ely, if isWrite 
1fb30 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 75 73 65  is non-zero, use
1fb40 20 66 74 72 75 6e 63 61 74 65 28 29 20 74 6f 20   ftruncate() to 
1fb50 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 20 20 2a  allocate.      *
1fb60 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
1fb70 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 2e 0a 20  memory region.. 
1fb80 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
1fb90 28 20 21 69 73 57 72 69 74 65 20 29 20 67 6f 74  ( !isWrite ) got
1fba0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
1fbb0 20 20 20 20 20 72 63 20 3d 20 77 69 6e 54 72 75       rc = winTru
1fbc0 6e 63 61 74 65 28 28 73 71 6c 69 74 65 33 5f 66  ncate((sqlite3_f
1fbd0 69 6c 65 20 2a 29 26 70 53 68 6d 4e 6f 64 65 2d  ile *)&pShmNode-
1fbe0 3e 68 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a  >hFile, nByte);.
1fbf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fc10 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72     rc = winLogEr
1fc20 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1fc30 5f 53 48 4d 53 49 5a 45 2c 20 6f 73 47 65 74 4c  _SHMSIZE, osGetL
1fc40 61 73 74 45 72 72 6f 72 28 29 2c 0a 20 20 20 20  astError(),.    
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc60 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70 32       "winShmMap2
1fc70 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68 29  ", pDbFd->zPath)
1fc80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
1fc90 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
1fca0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1fcb0 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73  * Map the reques
1fcc0 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
1fcd0 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  n into this proc
1fce0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
1fcf0 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65  ace. */.    apNe
1fd00 77 20 3d 20 28 73 74 72 75 63 74 20 53 68 6d 52  w = (struct ShmR
1fd10 65 67 69 6f 6e 20 2a 29 73 71 6c 69 74 65 33 5f  egion *)sqlite3_
1fd20 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20  realloc64(.     
1fd30 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65     pShmNode->aRe
1fd40 67 69 6f 6e 2c 20 28 69 52 65 67 69 6f 6e 2b 31  gion, (iRegion+1
1fd50 29 2a 73 69 7a 65 6f 66 28 61 70 4e 65 77 5b 30  )*sizeof(apNew[0
1fd60 5d 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ]).    );.    if
1fd70 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
1fd80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
1fd90 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
1fda0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
1fdb0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
1fdc0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65 67    pShmNode->aReg
1fdd0 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 0a 20 20  ion = apNew;..  
1fde0 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64    while( pShmNod
1fdf0 65 2d 3e 6e 52 65 67 69 6f 6e 3c 3d 69 52 65 67  e->nRegion<=iReg
1fe00 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 48 41 4e  ion ){.      HAN
1fe10 44 4c 45 20 68 4d 61 70 20 3d 20 4e 55 4c 4c 3b  DLE hMap = NULL;
1fe20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
1fe30 2d 6d 61 70 70 69 6e 67 20 68 61 6e 64 6c 65 20  -mapping handle 
1fe40 2a 2f 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  */.      void *p
1fe50 4d 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Map = 0;        
1fe60 20 20 20 20 20 2f 2a 20 4d 61 70 70 65 64 20 6d       /* Mapped m
1fe70 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 2a 2f 0a  emory region */.
1fe80 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
1fe90 49 4e 52 54 0a 20 20 20 20 20 20 68 4d 61 70 20  INRT.      hMap 
1fea0 3d 20 6f 73 43 72 65 61 74 65 46 69 6c 65 4d 61  = osCreateFileMa
1feb0 70 70 69 6e 67 46 72 6f 6d 41 70 70 28 70 53 68  ppingFromApp(pSh
1fec0 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a  mNode->hFile.h,.
1fed0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20            NULL, 
1fee0 50 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20  PAGE_READWRITE, 
1fef0 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20 20 20  nByte, NULL.    
1ff00 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e    );.#elif defin
1ff10 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
1ff20 48 41 53 5f 57 49 44 45 29 0a 20 20 20 20 20 20  HAS_WIDE).      
1ff30 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46  hMap = osCreateF
1ff40 69 6c 65 4d 61 70 70 69 6e 67 57 28 70 53 68 6d  ileMappingW(pShm
1ff50 4e 6f 64 65 2d 3e 68 46 69 6c 65 2e 68 2c 0a 20  Node->hFile.h,. 
1ff60 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c 20 50           NULL, P
1ff70 41 47 45 5f 52 45 41 44 57 52 49 54 45 2c 20 30  AGE_READWRITE, 0
1ff80 2c 20 6e 42 79 74 65 2c 20 4e 55 4c 4c 0a 20 20  , nByte, NULL.  
1ff90 20 20 20 20 29 3b 0a 23 65 6c 69 66 20 64 65 66      );.#elif def
1ffa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33  ined(SQLITE_WIN3
1ffb0 32 5f 48 41 53 5f 41 4e 53 49 29 20 26 26 20 53  2_HAS_ANSI) && S
1ffc0 51 4c 49 54 45 5f 57 49 4e 33 32 5f 43 52 45 41  QLITE_WIN32_CREA
1ffd0 54 45 46 49 4c 45 4d 41 50 50 49 4e 47 41 0a 20  TEFILEMAPPINGA. 
1ffe0 20 20 20 20 20 68 4d 61 70 20 3d 20 6f 73 43 72       hMap = osCr
1fff0 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67 41  eateFileMappingA
20000 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 46 69 6c 65  (pShmNode->hFile
20010 2e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 55  .h,.          NU
20020 4c 4c 2c 20 50 41 47 45 5f 52 45 41 44 57 52 49  LL, PAGE_READWRI
20030 54 45 2c 20 30 2c 20 6e 42 79 74 65 2c 20 4e 55  TE, 0, nByte, NU
20040 4c 4c 0a 20 20 20 20 20 20 29 3b 0a 23 65 6e 64  LL.      );.#end
20050 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  if.      OSTRACE
20060 28 28 22 53 48 4d 2d 4d 41 50 2d 43 52 45 41 54  (("SHM-MAP-CREAT
20070 45 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  E pid=%lu, regio
20080 6e 3d 25 64 2c 20 73 69 7a 65 3d 25 64 2c 20 72  n=%d, size=%d, r
20090 63 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%s\n",.       
200a0 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
200b0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
200c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
200d0 6f 6e 2c 20 6e 42 79 74 65 2c 0a 20 20 20 20 20  on, nByte,.     
200e0 20 20 20 20 20 20 20 20 20 20 68 4d 61 70 20 3f            hMap ?
200f0 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
20100 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 68 4d  ));.      if( hM
20110 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ap ){.        in
20120 74 20 69 4f 66 66 73 65 74 20 3d 20 70 53 68 6d  t iOffset = pShm
20130 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2a 73 7a  Node->nRegion*sz
20140 52 65 67 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  Region;.        
20150 69 6e 74 20 69 4f 66 66 73 65 74 53 68 69 66 74  int iOffsetShift
20160 20 3d 20 69 4f 66 66 73 65 74 20 25 20 77 69 6e   = iOffset % win
20170 53 79 73 49 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61  SysInfo.dwAlloca
20180 74 69 6f 6e 47 72 61 6e 75 6c 61 72 69 74 79 3b  tionGranularity;
20190 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
201a0 49 4e 52 54 0a 20 20 20 20 20 20 20 20 70 4d 61  INRT.        pMa
201b0 70 20 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46  p = osMapViewOfF
201c0 69 6c 65 46 72 6f 6d 41 70 70 28 68 4d 61 70 2c  ileFromApp(hMap,
201d0 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54 45 20   FILE_MAP_WRITE 
201e0 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41 44 2c  | FILE_MAP_READ,
201f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66  .            iOf
20200 66 73 65 74 20 2d 20 69 4f 66 66 73 65 74 53 68  fset - iOffsetSh
20210 69 66 74 2c 20 73 7a 52 65 67 69 6f 6e 20 2b 20  ift, szRegion + 
20220 69 4f 66 66 73 65 74 53 68 69 66 74 0a 20 20 20  iOffsetShift.   
20230 20 20 20 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20       );.#else.  
20240 20 20 20 20 20 20 70 4d 61 70 20 3d 20 6f 73 4d        pMap = osM
20250 61 70 56 69 65 77 4f 66 46 69 6c 65 28 68 4d 61  apViewOfFile(hMa
20260 70 2c 20 46 49 4c 45 5f 4d 41 50 5f 57 52 49 54  p, FILE_MAP_WRIT
20270 45 20 7c 20 46 49 4c 45 5f 4d 41 50 5f 52 45 41  E | FILE_MAP_REA
20280 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 30  D,.            0
20290 2c 20 69 4f 66 66 73 65 74 20 2d 20 69 4f 66 66  , iOffset - iOff
202a0 73 65 74 53 68 69 66 74 2c 20 73 7a 52 65 67 69  setShift, szRegi
202b0 6f 6e 20 2b 20 69 4f 66 66 73 65 74 53 68 69 66  on + iOffsetShif
202c0 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 65 6e  t.        );.#en
202d0 64 69 66 0a 20 20 20 20 20 20 20 20 4f 53 54 52  dif.        OSTR
202e0 41 43 45 28 28 22 53 48 4d 2d 4d 41 50 2d 4d 41  ACE(("SHM-MAP-MA
202f0 50 20 70 69 64 3d 25 6c 75 2c 20 72 65 67 69 6f  P pid=%lu, regio
20300 6e 3d 25 64 2c 20 6f 66 66 73 65 74 3d 25 64 2c  n=%d, offset=%d,
20310 20 73 69 7a 65 3d 25 64 2c 20 72 63 3d 25 73 5c   size=%d, rc=%s\
20320 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
20330 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
20340 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 53  tProcessId(), pS
20350 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2c  hmNode->nRegion,
20360 20 69 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20   iOffset,.      
20370 20 20 20 20 20 20 20 20 20 20 20 73 7a 52 65 67             szReg
20380 69 6f 6e 2c 20 70 4d 61 70 20 3f 20 22 6f 6b 22  ion, pMap ? "ok"
20390 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
203a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
203b0 20 21 70 4d 61 70 20 29 7b 0a 20 20 20 20 20 20   !pMap ){.      
203c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6c 61 73 74    pShmNode->last
203d0 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73  Errno = osGetLas
203e0 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20  tError();.      
203f0 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45 72 72    rc = winLogErr
20400 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
20410 53 48 4d 4d 41 50 2c 20 70 53 68 6d 4e 6f 64 65  SHMMAP, pShmNode
20420 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 20 22 77 69 6e 53 68 6d 4d 61 70        "winShmMap
20450 33 22 2c 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  3", pDbFd->zPath
20460 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 68  );.        if( h
20470 4d 61 70 20 29 20 6f 73 43 6c 6f 73 65 48 61 6e  Map ) osCloseHan
20480 64 6c 65 28 68 4d 61 70 29 3b 0a 20 20 20 20 20  dle(hMap);.     
20490 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
204a0 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  out;.      }..  
204b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 52      pShmNode->aR
204c0 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e  egion[pShmNode->
204d0 6e 52 65 67 69 6f 6e 5d 2e 70 4d 61 70 20 3d 20  nRegion].pMap = 
204e0 70 4d 61 70 3b 0a 20 20 20 20 20 20 70 53 68 6d  pMap;.      pShm
204f0 4e 6f 64 65 2d 3e 61 52 65 67 69 6f 6e 5b 70 53  Node->aRegion[pS
20500 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 5d  hmNode->nRegion]
20510 2e 68 4d 61 70 20 3d 20 68 4d 61 70 3b 0a 20 20  .hMap = hMap;.  
20520 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
20530 65 67 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  egion++;.    }. 
20540 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
20550 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
20560 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
20570 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66   ){.    int iOff
20580 73 65 74 20 3d 20 69 52 65 67 69 6f 6e 2a 73 7a  set = iRegion*sz
20590 52 65 67 69 6f 6e 3b 0a 20 20 20 20 69 6e 74 20  Region;.    int 
205a0 69 4f 66 66 73 65 74 53 68 69 66 74 20 3d 20 69  iOffsetShift = i
205b0 4f 66 66 73 65 74 20 25 20 77 69 6e 53 79 73 49  Offset % winSysI
205c0 6e 66 6f 2e 64 77 41 6c 6c 6f 63 61 74 69 6f 6e  nfo.dwAllocation
205d0 47 72 61 6e 75 6c 61 72 69 74 79 3b 0a 20 20 20  Granularity;.   
205e0 20 63 68 61 72 20 2a 70 20 3d 20 28 63 68 61 72   char *p = (char
205f0 20 2a 29 70 53 68 6d 4e 6f 64 65 2d 3e 61 52 65   *)pShmNode->aRe
20600 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 2e 70 4d  gion[iRegion].pM
20610 61 70 3b 0a 20 20 20 20 2a 70 70 20 3d 20 28 76  ap;.    *pp = (v
20620 6f 69 64 20 2a 29 26 70 5b 69 4f 66 66 73 65 74  oid *)&p[iOffset
20630 53 68 69 66 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  Shift];.  }else{
20640 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
20650 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
20660 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
20670 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
20680 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  rn rc;.}..#else.
20690 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68 6d 4d  # define winShmM
206a0 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ap     0.# defin
206b0 65 20 77 69 6e 53 68 6d 4c 6f 63 6b 20 20 20 20  e winShmLock    
206c0 30 0a 23 20 64 65 66 69 6e 65 20 77 69 6e 53 68  0.# define winSh
206d0 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66  mBarrier 0.# def
206e0 69 6e 65 20 77 69 6e 53 68 6d 55 6e 6d 61 70 20  ine winShmUnmap 
206f0 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
20700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20710 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
20720 43 6c 65 61 6e 73 20 75 70 20 74 68 65 20 6d 61  Cleans up the ma
20730 70 70 65 64 20 72 65 67 69 6f 6e 20 6f 66 20 74  pped region of t
20740 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  he specified fil
20750 65 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23 69  e, if any..*/.#i
20760 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
20770 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20  P_SIZE>0.static 
20780 69 6e 74 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65  int winUnmapfile
20790 28 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 29  (winFile *pFile)
207a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  {.  assert( pFil
207b0 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
207c0 45 28 28 22 55 4e 4d 41 50 2d 46 49 4c 45 20 70  E(("UNMAP-FILE p
207d0 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70  id=%lu, pFile=%p
207e0 2c 20 68 4d 61 70 3d 25 70 2c 20 70 4d 61 70 52  , hMap=%p, pMapR
207f0 65 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20  egion=%p, ".    
20800 20 20 20 20 20 20 20 22 6d 6d 61 70 53 69 7a 65         "mmapSize
20810 3d 25 6c 6c 64 2c 20 6d 6d 61 70 53 69 7a 65 41  =%lld, mmapSizeA
20820 63 74 75 61 6c 3d 25 6c 6c 64 2c 20 6d 6d 61 70  ctual=%lld, mmap
20830 53 69 7a 65 4d 61 78 3d 25 6c 6c 64 5c 6e 22 2c  SizeMax=%lld\n",
20840 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65  .           osGe
20850 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49  tCurrentProcessI
20860 64 28 29 2c 20 70 46 69 6c 65 2c 20 70 46 69 6c  d(), pFile, pFil
20870 65 2d 3e 68 4d 61 70 2c 20 70 46 69 6c 65 2d 3e  e->hMap, pFile->
20880 70 4d 61 70 52 65 67 69 6f 6e 2c 0a 20 20 20 20  pMapRegion,.    
20890 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
208a0 61 70 53 69 7a 65 2c 20 70 46 69 6c 65 2d 3e 6d  apSize, pFile->m
208b0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 2c 20 70  mapSizeActual, p
208c0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
208d0 78 29 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x));.  if( pFile
208e0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
208f0 20 20 20 20 69 66 28 20 21 6f 73 55 6e 6d 61 70      if( !osUnmap
20900 56 69 65 77 4f 66 46 69 6c 65 28 70 46 69 6c 65  ViewOfFile(pFile
20910 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 20 29 7b  ->pMapRegion) ){
20920 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
20930 73 74 45 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c  stErrno = osGetL
20940 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 20 20  astError();.    
20950 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20960 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20970 70 46 69 6c 65 3d 25 70 2c 20 70 4d 61 70 52 65  pFile=%p, pMapRe
20980 67 69 6f 6e 3d 25 70 2c 20 22 0a 20 20 20 20 20  gion=%p, ".     
20990 20 20 20 20 20 20 20 20 20 20 22 72 63 3d 53 51            "rc=SQ
209a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 5c  LITE_IOERR_MMAP\
209b0 6e 22 2c 20 6f 73 47 65 74 43 75 72 72 65 6e 74  n", osGetCurrent
209c0 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46 69  ProcessId(), pFi
209d0 6c 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  le,.            
209e0 20 20 20 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65     pFile->pMapRe
209f0 67 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 72 65  gion));.      re
20a00 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
20a10 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d  (SQLITE_IOERR_MM
20a20 41 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  AP, pFile->lastE
20a30 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
20a50 77 69 6e 55 6e 6d 61 70 66 69 6c 65 31 22 2c 20  winUnmapfile1", 
20a60 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
20a70 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e     }.    pFile->
20a80 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a  pMapRegion = 0;.
20a90 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
20aa0 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ize = 0;.    pFi
20ab0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  le->mmapSizeActu
20ac0 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  al = 0;.  }.  if
20ad0 28 20 70 46 69 6c 65 2d 3e 68 4d 61 70 21 3d 4e  ( pFile->hMap!=N
20ae0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ULL ){.    if( !
20af0 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 46  osCloseHandle(pF
20b00 69 6c 65 2d 3e 68 4d 61 70 29 20 29 7b 0a 20 20  ile->hMap) ){.  
20b10 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
20b20 72 72 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74  rrno = osGetLast
20b30 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 4f  Error();.      O
20b40 53 54 52 41 43 45 28 28 22 55 4e 4d 41 50 2d 46  STRACE(("UNMAP-F
20b50 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20 70 46 69  ILE pid=%lu, pFi
20b60 6c 65 3d 25 70 2c 20 68 4d 61 70 3d 25 70 2c 20  le=%p, hMap=%p, 
20b70 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rc=SQLITE_IOERR_
20b80 4d 4d 41 50 5c 6e 22 2c 0a 20 20 20 20 20 20 20  MMAP\n",.       
20b90 20 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72          osGetCur
20ba0 72 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c  rentProcessId(),
20bb0 20 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68   pFile, pFile->h
20bc0 4d 61 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74  Map));.      ret
20bd0 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
20be0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
20bf0 50 2c 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  P, pFile->lastEr
20c00 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 77                "w
20c20 69 6e 55 6e 6d 61 70 66 69 6c 65 32 22 2c 20 70  inUnmapfile2", p
20c30 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20c40 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68    }.    pFile->h
20c50 4d 61 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a  Map = NULL;.  }.
20c60 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4d 41    OSTRACE(("UNMA
20c70 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
20c80 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
20c90 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
20ca0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
20cb0 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
20cc0 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
20cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
20ce0 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
20cf0 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
20d00 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
20d10 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
20d20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
20d30 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
20d40 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
20d50 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
20d60 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
20d70 20 4f 72 2c 20 69 66 0a 2a 2a 20 74 68 65 72 65   Or, if.** there
20d80 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
20d90 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
20da0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
20db0 72 65 20 61 72 65 20 73 74 69 6c 6c 0a 2a 2a 20  re are still.** 
20dc0 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
20dd0 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20  ch() references 
20de0 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63  to it, this func
20df0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
20e00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
20e10 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e  ter nByte is non
20e20 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20  -negative, then 
20e30 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73  it is the reques
20e40 74 65 64 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 74  ted size of.** t
20e50 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
20e60 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
20e70 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
20e80 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
20e90 6e 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74  n the.** request
20ea0 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20 73  ed size is the s
20eb0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
20ec0 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74  on disk. The act
20ed0 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  ual size of the.
20ee0 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70 69  ** created mappi
20ef0 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68 65  ng is either the
20f00 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
20f10 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e  or the value con
20f20 66 69 67 75 72 65 64 0a 2a 2a 20 75 73 69 6e 67  figured.** using
20f30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
20f40 41 50 5f 53 49 5a 45 2c 20 77 68 69 63 68 65 76  AP_SIZE, whichev
20f50 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
20f60 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
20f70 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
20f80 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
20f90 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
20fa0 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
20fb0 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
20fc0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
20fd0 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
20fe0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
20ff0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
21000 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
21010 74 20 77 69 6e 4d 61 70 66 69 6c 65 28 77 69 6e  t winMapfile(win
21020 46 69 6c 65 20 2a 70 46 64 2c 20 73 71 6c 69 74  File *pFd, sqlit
21030 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b  e3_int64 nByte){
21040 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
21050 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20   nMap = nByte;. 
21060 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
21070 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70  rt( nMap>=0 || p
21080 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
21090 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
210a0 4d 41 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75  MAP-FILE pid=%lu
210b0 2c 20 70 46 69 6c 65 3d 25 70 2c 20 73 69 7a 65  , pFile=%p, size
210c0 3d 25 6c 6c 64 5c 6e 22 2c 0a 20 20 20 20 20 20  =%lld\n",.      
210d0 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
210e0 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
210f0 64 2c 20 6e 42 79 74 65 29 29 3b 0a 0a 20 20 69  d, nByte));..  i
21100 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  f( pFd->nFetchOu
21110 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  t>0 ) return SQL
21120 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e  ITE_OK;..  if( n
21130 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  Map<0 ){.    rc 
21140 3d 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 28 73  = winFileSize((s
21150 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 46 64  qlite3_file*)pFd
21160 2c 20 26 6e 4d 61 70 29 3b 0a 20 20 20 20 69 66  , &nMap);.    if
21170 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 4f 53  ( rc ){.      OS
21180 54 52 41 43 45 28 28 22 4d 41 50 2d 46 49 4c 45  TRACE(("MAP-FILE
21190 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65 3d   pid=%lu, pFile=
211a0 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  %p, rc=SQLITE_IO
211b0 45 52 52 5f 46 53 54 41 54 5c 6e 22 2c 0a 20 20  ERR_FSTAT\n",.  
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 47               osG
211d0 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
211e0 49 64 28 29 2c 20 70 46 64 29 29 3b 0a 20 20 20  Id(), pFd));.   
211f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
21200 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
21210 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d    }.  }.  if( nM
21220 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
21230 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
21240 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
21250 61 78 3b 0a 20 20 7d 0a 20 20 6e 4d 61 70 20 26  ax;.  }.  nMap &
21260 3d 20 7e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  = ~(sqlite3_int6
21270 34 29 28 77 69 6e 53 79 73 49 6e 66 6f 2e 64 77  4)(winSysInfo.dw
21280 50 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 0a  PageSize - 1);..
21290 20 20 69 66 28 20 6e 4d 61 70 3d 3d 30 20 26 26    if( nMap==0 &&
212a0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30   pFd->mmapSize>0
212b0 20 29 7b 0a 20 20 20 20 77 69 6e 55 6e 6d 61 70   ){.    winUnmap
212c0 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 20  file(pFd);.  }. 
212d0 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e   if( nMap!=pFd->
212e0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
212f0 76 6f 69 64 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  void *pNew = 0;.
21300 20 20 20 20 44 57 4f 52 44 20 70 72 6f 74 65 63      DWORD protec
21310 74 20 3d 20 50 41 47 45 5f 52 45 41 44 4f 4e 4c  t = PAGE_READONL
21320 59 3b 0a 20 20 20 20 44 57 4f 52 44 20 66 6c 61  Y;.    DWORD fla
21330 67 73 20 3d 20 46 49 4c 45 5f 4d 41 50 5f 52 45  gs = FILE_MAP_RE
21340 41 44 3b 0a 0a 20 20 20 20 77 69 6e 55 6e 6d 61  AD;..    winUnma
21350 70 66 69 6c 65 28 70 46 64 29 3b 0a 23 69 66 64  pfile(pFd);.#ifd
21360 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ef SQLITE_MMAP_R
21370 45 41 44 57 52 49 54 45 0a 20 20 20 20 69 66 28  EADWRITE.    if(
21380 20 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73   (pFd->ctrlFlags
21390 20 26 20 57 49 4e 46 49 4c 45 5f 52 44 4f 4e 4c   & WINFILE_RDONL
213a0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  Y)==0 ){.      p
213b0 72 6f 74 65 63 74 20 3d 20 50 41 47 45 5f 52 45  rotect = PAGE_RE
213c0 41 44 57 52 49 54 45 3b 0a 20 20 20 20 20 20 66  ADWRITE;.      f
213d0 6c 61 67 73 20 7c 3d 20 46 49 4c 45 5f 4d 41 50  lags |= FILE_MAP
213e0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 23 65  _WRITE;.    }.#e
213f0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
21400 4f 53 5f 57 49 4e 52 54 0a 20 20 20 20 70 46 64  OS_WINRT.    pFd
21410 2d 3e 68 4d 61 70 20 3d 20 6f 73 43 72 65 61 74  ->hMap = osCreat
21420 65 46 69 6c 65 4d 61 70 70 69 6e 67 46 72 6f 6d  eFileMappingFrom
21430 41 70 70 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c  App(pFd->h, NULL
21440 2c 20 70 72 6f 74 65 63 74 2c 20 6e 4d 61 70 2c  , protect, nMap,
21450 20 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 64 65   NULL);.#elif de
21460 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e  fined(SQLITE_WIN
21470 33 32 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 20  32_HAS_WIDE).   
21480 20 70 46 64 2d 3e 68 4d 61 70 20 3d 20 6f 73 43   pFd->hMap = osC
21490 72 65 61 74 65 46 69 6c 65 4d 61 70 70 69 6e 67  reateFileMapping
214a0 57 28 70 46 64 2d 3e 68 2c 20 4e 55 4c 4c 2c 20  W(pFd->h, NULL, 
214b0 70 72 6f 74 65 63 74 2c 0a 20 20 20 20 20 20 20  protect,.       
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214d0 20 20 20 20 20 20 20 20 20 28 44 57 4f 52 44 29           (DWORD)
214e0 28 28 6e 4d 61 70 3e 3e 33 32 29 20 26 20 30 78  ((nMap>>32) & 0x
214f0 66 66 66 66 66 66 66 66 29 2c 0a 20 20 20 20 20  ffffffff),.     
21500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21510 20 20 20 20 20 20 20 20 20 20 20 28 44 57 4f 52             (DWOR
21520 44 29 28 6e 4d 61 70 20 26 20 30 78 66 66 66 66  D)(nMap & 0xffff
21530 66 66 66 66 29 2c 20 4e 55 4c 4c 29 3b 0a 23 65  ffff), NULL);.#e
21540 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  lif defined(SQLI
21550 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53  TE_WIN32_HAS_ANS
21560 49 29 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e  I) && SQLITE_WIN
21570 33 32 5f 43 52 45 41 54 45 46 49 4c 45 4d 41 50  32_CREATEFILEMAP
21580 50 49 4e 47 41 0a 20 20 20 20 70 46 64 2d 3e 68  PINGA.    pFd->h
21590 4d 61 70 20 3d 20 6f 73 43 72 65 61 74 65 46 69  Map = osCreateFi
215a0 6c 65 4d 61 70 70 69 6e 67 41 28 70 46 64 2d 3e  leMappingA(pFd->
215b0 68 2c 20 4e 55 4c 4c 2c 20 70 72 6f 74 65 63 74  h, NULL, protect
215c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
215d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
215e0 20 20 28 44 57 4f 52 44 29 28 28 6e 4d 61 70 3e    (DWORD)((nMap>
215f0 3e 33 32 29 20 26 20 30 78 66 66 66 66 66 66 66  >32) & 0xfffffff
21600 66 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  f),.            
21610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21620 20 20 20 20 28 44 57 4f 52 44 29 28 6e 4d 61 70      (DWORD)(nMap
21630 20 26 20 30 78 66 66 66 66 66 66 66 66 29 2c 20   & 0xffffffff), 
21640 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
21650 20 20 69 66 28 20 70 46 64 2d 3e 68 4d 61 70 3d    if( pFd->hMap=
21660 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70  =NULL ){.      p
21670 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  Fd->lastErrno = 
21680 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
21690 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69 6e  ;.      rc = win
216a0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
216b0 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64 2d  IOERR_MMAP, pFd-
216c0 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20 20  >lastErrno,.    
216d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216e0 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 31 22     "winMapfile1"
216f0 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20  , pFd->zPath);. 
21700 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65 20       /* Log the 
21710 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74 69  error, but conti
21720 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61  nue normal opera
21730 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61 64  tion using xRead
21740 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20  /xWrite */.     
21750 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d 46   OSTRACE(("MAP-F
21760 49 4c 45 2d 43 52 45 41 54 45 20 70 69 64 3d 25  ILE-CREATE pid=%
21770 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63  lu, pFile=%p, rc
21780 3d 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%s\n",.        
21790 20 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72         osGetCurr
217a0 65 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20  entProcessId(), 
217b0 70 46 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  pFd, sqlite3ErrN
217c0 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20  ame(rc)));.     
217d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
217e0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  K;.    }.    ass
217f0 65 72 74 28 20 28 6e 4d 61 70 20 25 20 77 69 6e  ert( (nMap % win
21800 53 79 73 49 6e 66 6f 2e 64 77 50 61 67 65 53 69  SysInfo.dwPageSi
21810 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ze)==0 );.    as
21820 73 65 72 74 28 20 73 69 7a 65 6f 66 28 53 49 5a  sert( sizeof(SIZ
21830 45 5f 54 29 3d 3d 73 69 7a 65 6f 66 28 73 71 6c  E_T)==sizeof(sql
21840 69 74 65 33 5f 69 6e 74 36 34 29 20 7c 7c 20 6e  ite3_int64) || n
21850 4d 61 70 3c 3d 30 78 66 66 66 66 66 66 66 66 20  Map<=0xffffffff 
21860 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  );.#if SQLITE_OS
21870 5f 57 49 4e 52 54 0a 20 20 20 20 70 4e 65 77 20  _WINRT.    pNew 
21880 3d 20 6f 73 4d 61 70 56 69 65 77 4f 66 46 69 6c  = osMapViewOfFil
21890 65 46 72 6f 6d 41 70 70 28 70 46 64 2d 3e 68 4d  eFromApp(pFd->hM
218a0 61 70 2c 20 66 6c 61 67 73 2c 20 30 2c 20 28 53  ap, flags, 0, (S
218b0 49 5a 45 5f 54 29 6e 4d 61 70 29 3b 0a 23 65 6c  IZE_T)nMap);.#el
218c0 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  se.    pNew = os
218d0 4d 61 70 56 69 65 77 4f 66 46 69 6c 65 28 70 46  MapViewOfFile(pF
218e0 64 2d 3e 68 4d 61 70 2c 20 66 6c 61 67 73 2c 20  d->hMap, flags, 
218f0 30 2c 20 30 2c 20 28 53 49 5a 45 5f 54 29 6e 4d  0, 0, (SIZE_T)nM
21900 61 70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ap);.#endif.    
21910 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20 29  if( pNew==NULL )
21920 7b 0a 20 20 20 20 20 20 6f 73 43 6c 6f 73 65 48  {.      osCloseH
21930 61 6e 64 6c 65 28 70 46 64 2d 3e 68 4d 61 70 29  andle(pFd->hMap)
21940 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 68 4d 61  ;.      pFd->hMa
21950 70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  p = NULL;.      
21960 70 46 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  pFd->lastErrno =
21970 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
21980 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 69  );.      rc = wi
21990 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  nLogError(SQLITE
219a0 5f 49 4f 45 52 52 5f 4d 4d 41 50 2c 20 70 46 64  _IOERR_MMAP, pFd
219b0 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 0a 20 20 20  ->lastErrno,.   
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 20 20 20 20 22 77 69 6e 4d 61 70 66 69 6c 65 32      "winMapfile2
219e0 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
219f0 20 20 20 20 20 20 2f 2a 20 4c 6f 67 20 74 68 65        /* Log the
21a00 20 65 72 72 6f 72 2c 20 62 75 74 20 63 6f 6e 74   error, but cont
21a10 69 6e 75 65 20 6e 6f 72 6d 61 6c 20 6f 70 65 72  inue normal oper
21a20 61 74 69 6f 6e 20 75 73 69 6e 67 20 78 52 65 61  ation using xRea
21a30 64 2f 78 57 72 69 74 65 20 2a 2f 0a 20 20 20 20  d/xWrite */.    
21a40 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41 50 2d    OSTRACE(("MAP-
21a50 46 49 4c 45 2d 4d 41 50 20 70 69 64 3d 25 6c 75  FILE-MAP pid=%lu
21a60 2c 20 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 25  , pFile=%p, rc=%
21a70 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
21a80 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e       osGetCurren
21a90 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70 46  tProcessId(), pF
21aa0 64 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  d, sqlite3ErrNam
21ab0 65 28 72 63 29 29 29 3b 0a 20 20 20 20 20 20 72  e(rc)));.      r
21ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21ad0 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 64 2d 3e  .    }.    pFd->
21ae0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 70 4e 65  pMapRegion = pNe
21af0 77 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  w;.    pFd->mmap
21b00 53 69 7a 65 20 3d 20 6e 4d 61 70 3b 0a 20 20 20  Size = nMap;.   
21b10 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
21b20 74 75 61 6c 20 3d 20 6e 4d 61 70 3b 0a 20 20 7d  tual = nMap;.  }
21b30 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4d 41  ..  OSTRACE(("MA
21b40 50 2d 46 49 4c 45 20 70 69 64 3d 25 6c 75 2c 20  P-FILE pid=%lu, 
21b50 70 46 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c  pFile=%p, rc=SQL
21b60 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20  ITE_OK\n",.     
21b70 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21b80 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 70  ntProcessId(), p
21b90 46 64 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  Fd));.  return S
21ba0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
21bb0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
21bc0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
21bd0 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62  ./*.** If possib
21be0 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  le, return a poi
21bf0 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e  nter to a mappin
21c00 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61  g of file fd sta
21c10 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a  rting at offset.
21c20 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70  ** iOff. The map
21c30 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c  ping must be val
21c40 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  id for at least 
21c50 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  nAmt bytes..**.*
21c60 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e  * If such a poin
21c70 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69  ter can be obtai
21c80 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e  ned, store it in
21c90 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20   *pp and return 
21ca0 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72  SQLITE_OK..** Or
21cb0 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20  , if one cannot 
21cc0 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
21cd0 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  urs, set *pp to 
21ce0 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  0 and return SQL
21cf0 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c  ITE_OK..** Final
21d00 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  ly, if an error 
21d10 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75  does occur, retu
21d20 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
21d30 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e  or code. The fin
21d40 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a  al.** value of *
21d50 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  pp is undefined 
21d60 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
21d70 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63  .** If this func
21d80 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e  tion does return
21d90 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20   a pointer, the 
21da0 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e  caller must even
21db0 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 6c 65 61 73  tually.** releas
21dc0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
21dd0 62 79 20 63 61 6c 6c 69 6e 67 20 77 69 6e 55 6e  by calling winUn
21de0 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
21df0 69 63 20 69 6e 74 20 77 69 6e 46 65 74 63 68 28  ic int winFetch(
21e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
21e10 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
21e20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
21e30 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
21e40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77  _MMAP_SIZE>0.  w
21e50 69 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77  inFile *pFd = (w
21e60 69 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a  inFile*)fd;   /*
21e70 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
21e90 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20  .#endif.  *pp = 
21ea0 30 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  0;..  OSTRACE(("
21eb0 46 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70  FETCH pid=%lu, p
21ec0 46 69 6c 65 3d 25 70 2c 20 6f 66 66 73 65 74 3d  File=%p, offset=
21ed0 25 6c 6c 64 2c 20 61 6d 6f 75 6e 74 3d 25 64 2c  %lld, amount=%d,
21ee0 20 70 70 3d 25 70 5c 6e 22 2c 0a 20 20 20 20 20   pp=%p\n",.     
21ef0 20 20 20 20 20 20 6f 73 47 65 74 43 75 72 72 65        osGetCurre
21f00 6e 74 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66  ntProcessId(), f
21f10 64 2c 20 69 4f 66 66 2c 20 6e 41 6d 74 2c 20 70  d, iOff, nAmt, p
21f20 70 29 29 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  p));..#if SQLITE
21f30 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
21f40 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70  .  if( pFd->mmap
21f50 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20  SizeMax>0 ){.   
21f60 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
21f70 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  gion==0 ){.     
21f80 20 69 6e 74 20 72 63 20 3d 20 77 69 6e 4d 61 70   int rc = winMap
21f90 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20  file(pFd, -1);. 
21fa0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21fb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21fc0 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54 43    OSTRACE(("FETC
21fd0 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c 65  H pid=%lu, pFile
21fe0 3d 25 70 2c 20 72 63 3d 25 73 5c 6e 22 2c 0a 20  =%p, rc=%s\n",. 
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22010 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 73 71  essId(), pFd, sq
22020 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
22030 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ));.        retu
22040 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
22050 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
22060 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
22070 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
22080 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
22090 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
220a0 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
220b0 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
220c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
220d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 46 45 54  .  OSTRACE(("FET
220e0 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46 69 6c  CH pid=%lu, pFil
220f0 65 3d 25 70 2c 20 70 70 3d 25 70 2c 20 2a 70 70  e=%p, pp=%p, *pp
22100 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54 45 5f 4f  =%p, rc=SQLITE_O
22110 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  K\n",.          
22120 20 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f   osGetCurrentPro
22130 63 65 73 73 49 64 28 29 2c 20 66 64 2c 20 70 70  cessId(), fd, pp
22140 2c 20 2a 70 70 29 29 3b 0a 20 20 72 65 74 75 72  , *pp));.  retur
22150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
22160 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
22170 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
22180 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
22190 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
221a0 61 73 65 73 20 61 0a 2a 2a 20 72 65 66 65 72 65  ases a.** refere
221b0 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
221c0 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
221d0 74 6f 20 77 69 6e 46 65 74 63 68 28 29 2e 20 54  to winFetch(). T
221e0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
221f0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
22200 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
22210 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
22220 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
22230 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
22240 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
22250 74 6f 20 74 68 65 20 77 69 6e 46 65 74 63 68 28  to the winFetch(
22260 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 0a 2a 2a  ) invocation..**
22270 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74  .** Or, if the t
22280 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73  hird argument is
22290 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
222a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
222b0 6e 67 20 63 61 6c 6c 65 64 0a 2a 2a 20 74 6f 20  ng called.** to 
222c0 69 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c  inform the VFS l
222d0 61 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72  ayer that, accor
222e0 64 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61  ding to POSIX, a
222f0 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
22300 69 6e 67 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ing.** may now b
22310 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
22320 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
22330 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22340 77 69 6e 55 6e 66 65 74 63 68 28 73 71 6c 69 74  winUnfetch(sqlit
22350 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
22360 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
22370 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
22380 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 77 69  MMAP_SIZE>0.  wi
22390 6e 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 77 69  nFile *pFd = (wi
223a0 6e 46 69 6c 65 2a 29 66 64 3b 20 20 20 2f 2a 20  nFile*)fd;   /* 
223b0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
223c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
223d0 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75  .  /* If p==0 (u
223e0 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72 65 20  nmap the entire 
223f0 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65  file) then there
22400 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73   must be no outs
22410 74 61 6e 64 69 6e 67 0a 20 20 2a 2a 20 78 46 65  tanding.  ** xFe
22420 74 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20  tch references. 
22430 4f 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61  Or, if p!=0 (mea
22440 6e 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46  ning it is an xF
22450 65 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c  etch reference),
22460 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65  .  ** then there
22470 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
22480 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e  t one outstandin
22490 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  g.  */.  assert(
224a0 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e   (p==0)==(pFd->n
224b0 46 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a  FetchOut==0) );.
224c0 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69  .  /* If p!=0, i
224d0 74 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65  t must match the
224e0 20 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a   iOff value. */.
224f0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
22500 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64  | p==&((u8 *)pFd
22510 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f  ->pMapRegion)[iO
22520 66 66 5d 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  ff] );..  OSTRAC
22530 45 28 28 22 55 4e 46 45 54 43 48 20 70 69 64 3d  E(("UNFETCH pid=
22540 25 6c 75 2c 20 70 46 69 6c 65 3d 25 70 2c 20 6f  %lu, pFile=%p, o
22550 66 66 73 65 74 3d 25 6c 6c 64 2c 20 70 3d 25 70  ffset=%lld, p=%p
22560 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22570 6f 73 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  osGetCurrentProc
22580 65 73 73 49 64 28 29 2c 20 70 46 64 2c 20 69 4f  essId(), pFd, iO
22590 66 66 2c 20 70 29 29 3b 0a 0a 20 20 69 66 28 20  ff, p));..  if( 
225a0 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46  p ){.    pFd->nF
225b0 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c  etchOut--;.  }el
225c0 73 65 7b 0a 20 20 20 20 2f 2a 20 46 49 58 4d 45  se{.    /* FIXME
225d0 3a 20 20 49 66 20 57 69 6e 64 6f 77 73 20 74 72  :  If Windows tr
225e0 75 6c 79 20 61 6c 77 61 79 73 20 70 72 65 76 65  uly always preve
225f0 6e 74 73 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  nts truncating o
22600 72 20 64 65 6c 65 74 69 6e 67 20 61 0a 20 20 20  r deleting a.   
22610 20 2a 2a 20 66 69 6c 65 20 77 68 69 6c 65 20 61   ** file while a
22620 20 6d 61 70 70 69 6e 67 20 69 73 20 68 65 6c 64   mapping is held
22630 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
22640 77 69 6e 67 20 77 69 6e 55 6e 6d 61 70 66 69 6c  wing winUnmapfil
22650 65 28 29 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  e() call.    ** 
22660 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 63  is unnecessary c
22670 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20 2d 20  an be omitted - 
22680 70 6f 74 65 6e 74 69 61 6c 6c 79 20 69 6d 70 72  potentially impr
22690 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 70 65 72  oving.    ** per
226a0 66 6f 72 6d 61 6e 63 65 2e 20 20 2a 2f 0a 20 20  formance.  */.  
226b0 20 20 77 69 6e 55 6e 6d 61 70 66 69 6c 65 28 70    winUnmapfile(p
226c0 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
226d0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
226e0 75 74 3e 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut>=0 );.#endif.
226f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 46  .  OSTRACE(("UNF
22700 45 54 43 48 20 70 69 64 3d 25 6c 75 2c 20 70 46  ETCH pid=%lu, pF
22710 69 6c 65 3d 25 70 2c 20 72 63 3d 53 51 4c 49 54  ile=%p, rc=SQLIT
22720 45 5f 4f 4b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  E_OK\n",.       
22730 20 20 20 20 6f 73 47 65 74 43 75 72 72 65 6e 74      osGetCurrent
22740 50 72 6f 63 65 73 73 49 64 28 29 2c 20 66 64 29  ProcessId(), fd)
22750 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22760 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22770 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
22780 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
22790 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
227a0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
227b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227c0 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
227d0 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
227e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
227f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
22800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
22850 0a 2a 2a 20 54 68 69 73 20 76 65 63 74 6f 72 20  .** This vector 
22860 64 65 66 69 6e 65 73 20 61 6c 6c 20 74 68 65 20  defines all the 
22870 6d 65 74 68 6f 64 73 20 74 68 61 74 20 63 61 6e  methods that can
22880 20 6f 70 65 72 61 74 65 20 6f 6e 20 61 6e 0a 2a   operate on an.*
22890 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 66  * sqlite3_file f
228a0 6f 72 20 77 69 6e 33 32 2e 0a 2a 2f 0a 73 74 61  or win32..*/.sta
228b0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
228c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 77 69 6e  3_io_methods win
228d0 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20 20 33  IoMethod = {.  3
228e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22900 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20  * iVersion */.  
22910 77 69 6e 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  winClose,       
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22930 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 77  /* xClose */.  w
22940 69 6e 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  inRead,         
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22960 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 77 69 6e  * xRead */.  win
22970 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22990 78 57 72 69 74 65 20 2a 2f 0a 20 20 77 69 6e 54  xWrite */.  winT
229a0 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
229b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
229c0 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 77 69  Truncate */.  wi
229d0 6e 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20  nSync,          
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
229f0 20 78 53 79 6e 63 20 2a 2f 0a 20 20 77 69 6e 46   xSync */.  winF
22a00 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ileSize,        
22a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22a20 46 69 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 77 69  FileSize */.  wi
22a30 6e 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nLock,          
22a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a50 20 78 4c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 55   xLock */.  winU
22a60 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
22a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22a80 55 6e 6c 6f 63 6b 20 2a 2f 0a 20 20 77 69 6e 43  Unlock */.  winC
22a90 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
22aa0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78  ,           /* x
22ab0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
22ac0 6b 20 2a 2f 0a 20 20 77 69 6e 46 69 6c 65 43 6f  k */.  winFileCo
22ad0 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
22ae0 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
22af0 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 77 69 6e 53  ontrol */.  winS
22b00 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20  ectorSize,      
22b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
22b20 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a 20 20  SectorSize */.  
22b30 77 69 6e 44 65 76 69 63 65 43 68 61 72 61 63 74  winDeviceCharact
22b40 65 72 69 73 74 69 63 73 2c 20 20 20 20 20 20 20  eristics,       
22b50 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61 63  /* xDeviceCharac
22b60 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 77  teristics */.  w
22b70 69 6e 53 68 6d 4d 61 70 2c 20 20 20 20 20 20 20  inShmMap,       
22b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22b90 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 0a 20 20 77  * xShmMap */.  w
22ba0 69 6e 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  inShmLock,      
22bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22bc0 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 0a 20 20  * xShmLock */.  
22bd0 77 69 6e 53 68 6d 42 61 72 72 69 65 72 2c 20 20  winShmBarrier,  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
22c00 2f 0a 20 20 77 69 6e 53 68 6d 55 6e 6d 61 70 2c  /.  winShmUnmap,
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
22c30 20 2a 2f 0a 20 20 77 69 6e 46 65 74 63 68 2c 20   */.  winFetch, 
22c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c50 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
22c60 2a 2f 0a 20 20 77 69 6e 55 6e 66 65 74 63 68 20  */.  winUnfetch 
22c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c80 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
22c90 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a   */.};../*******
22ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22ce0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
22cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d00 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
22d10 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
22d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
22d30 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
22d40 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
22d50 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
22d60 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
22d70 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
22d80 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
22d90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 43  .#if defined(__C
22da0 59 47 57 49 4e 5f 5f 29 0a 2f 2a 0a 2a 2a 20 43  YGWIN__)./*.** C
22db0 6f 6e 76 65 72 74 20 61 20 66 69 6c 65 6e 61 6d  onvert a filenam
22dc0 65 20 66 72 6f 6d 20 77 68 61 74 65 76 65 72 20  e from whatever 
22dd0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f  the underlying o
22de0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 0a  perating system.
22df0 2a 2a 20 73 75 70 70 6f 72 74 73 20 66 6f 72 20  ** supports for 
22e00 66 69 6c 65 6e 61 6d 65 73 20 69 6e 74 6f 20 55  filenames into U
22e10 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
22e20 68 6f 6c 64 20 74 68 65 20 72 65 73 75 6c 74 20  hold the result 
22e30 69 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66  is.** obtained f
22e40 72 6f 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d  rom malloc and m
22e50 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22e60 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
22e70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
22e80 63 68 61 72 20 2a 77 69 6e 43 6f 6e 76 65 72 74  char *winConvert
22e90 54 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 63  ToUtf8Filename(c
22ea0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
22eb0 6e 61 6d 65 29 7b 0a 20 20 63 68 61 72 20 2a 7a  name){.  char *z
22ec0 43 6f 6e 76 65 72 74 65 64 20 3d 20 30 3b 0a 20  Converted = 0;. 
22ed0 20 69 66 28 20 6f 73 49 73 4e 54 28 29 20 29 7b   if( osIsNT() ){
22ee0 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74 65 64 20  .    zConverted 
22ef0 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74  = winUnicodeToUt
22f00 66 38 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  f8(zFilename);. 
22f10 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22f20 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a  _WIN32_HAS_ANSI.
22f30 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a 43 6f 6e    else{.    zCon
22f40 76 65 72 74 65 64 20 3d 20 77 69 6e 4d 62 63 73  verted = winMbcs
22f50 54 6f 55 74 66 38 28 7a 46 69 6c 65 6e 61 6d 65  ToUtf8(zFilename
22f60 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69 73 41  , osAreFileApisA
22f70 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  NSI());.  }.#end
22f80 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65 72 20 77  if.  /* caller w
22f90 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75 74 20 6f  ill handle out o
22fa0 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 72 65  f memory */.  re
22fb0 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74 65 64 3b  turn zConverted;
22fc0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
22fd0 20 43 6f 6e 76 65 72 74 20 61 20 55 54 46 2d 38   Convert a UTF-8
22fe0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 77   filename into w
22ff0 68 61 74 65 76 65 72 20 66 6f 72 6d 20 74 68 65  hatever form the
23000 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 6f   underlying.** o
23010 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
23020 77 61 6e 74 73 20 66 69 6c 65 6e 61 6d 65 73 20  wants filenames 
23030 69 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  in.  Space to ho
23040 6c 64 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ld the result.**
23050 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
23060 6d 20 6d 61 6c 6c 6f 63 20 61 6e 64 20 6d 75 73  m malloc and mus
23070 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
23080 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
23090 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
230a0 20 76 6f 69 64 20 2a 77 69 6e 43 6f 6e 76 65 72   void *winConver
230b0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
230c0 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
230d0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 76 6f 69 64  ilename){.  void
230e0 20 2a 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 30   *zConverted = 0
230f0 3b 0a 20 20 69 66 28 20 6f 73 49 73 4e 54 28 29  ;.  if( osIsNT()
23100 20 29 7b 0a 20 20 20 20 7a 43 6f 6e 76 65 72 74   ){.    zConvert
23110 65 64 20 3d 20 77 69 6e 55 74 66 38 54 6f 55 6e  ed = winUtf8ToUn
23120 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
23130 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  ;.  }.#ifdef SQL
23140 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
23150 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 7a  SI.  else{.    z
23160 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 55  Converted = winU
23170 74 66 38 54 6f 4d 62 63 73 28 7a 46 69 6c 65 6e  tf8ToMbcs(zFilen
23180 61 6d 65 2c 20 6f 73 41 72 65 46 69 6c 65 41 70  ame, osAreFileAp
23190 69 73 41 4e 53 49 28 29 29 3b 0a 20 20 7d 0a 23  isANSI());.  }.#
231a0 65 6e 64 69 66 0a 20 20 2f 2a 20 63 61 6c 6c 65  endif.  /* calle
231b0 72 20 77 69 6c 6c 20 68 61 6e 64 6c 65 20 6f 75  r will handle ou
231c0 74 20 6f 66 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  t of memory */. 
231d0 20 72 65 74 75 72 6e 20 7a 43 6f 6e 76 65 72 74   return zConvert
231e0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
231f0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
23200 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74  ns non-zero if t
23210 68 65 20 73 70 65 63 69 66 69 65 64 20 55 54 46  he specified UTF
23220 2d 38 20 73 74 72 69 6e 67 20 62 75 66 66 65 72  -8 string buffer
23230 0a 2a 2a 20 65 6e 64 73 20 77 69 74 68 20 61 20  .** ends with a 
23240 64 69 72 65 63 74 6f 72 79 20 73 65 70 61 72 61  directory separa
23250 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 6f 72  tor character or
23260 20 6f 6e 65 20 77 61 73 20 73 75 63 63 65 73 73   one was success
23270 66 75 6c 6c 79 0a 2a 2a 20 61 64 64 65 64 20 74  fully.** added t
23280 6f 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o it..*/.static 
23290 69 6e 74 20 77 69 6e 4d 61 6b 65 45 6e 64 49 6e  int winMakeEndIn
232a0 44 69 72 53 65 70 28 69 6e 74 20 6e 42 75 66 2c  DirSep(int nBuf,
232b0 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
232c0 69 66 28 20 7a 42 75 66 20 29 7b 0a 20 20 20 20  if( zBuf ){.    
232d0 69 6e 74 20 6e 4c 65 6e 20 3d 20 73 71 6c 69 74  int nLen = sqlit
232e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
232f0 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 6e 3e 30  ;.    if( nLen>0
23300 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 77 69   ){.      if( wi
23310 6e 49 73 44 69 72 53 65 70 28 7a 42 75 66 5b 6e  nIsDirSep(zBuf[n
23320 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  Len-1]) ){.     
23330 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
23340 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 4c 65     }else if( nLe
23350 6e 2b 31 3c 6e 42 75 66 20 29 7b 0a 20 20 20 20  n+1<nBuf ){.    
23360 20 20 20 20 7a 42 75 66 5b 6e 4c 65 6e 5d 20 3d      zBuf[nLen] =
23370 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 3b   winGetDirSep();
23380 0a 20 20 20 20 20 20 20 20 7a 42 75 66 5b 6e 4c  .        zBuf[nL
23390 65 6e 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  en+1] = '\0';.  
233a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
233b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
233c0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
233d0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
233e0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
233f0 61 6d 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ame and store th
23400 65 20 72 65 73 75 6c 74 69 6e 67 20 70 6f 69 6e  e resulting poin
23410 74 65 72 20 69 6e 74 6f 20 70 7a 42 75 66 2e 0a  ter into pzBuf..
23420 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
23430 65 74 75 72 6e 65 64 20 69 6e 20 70 7a 42 75 66  eturned in pzBuf
23440 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 76   must be freed v
23450 69 61 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ia sqlite3_free(
23460 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23470 20 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d 65 28   winGetTempname(
23480 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
23490 73 2c 20 63 68 61 72 20 2a 2a 70 7a 42 75 66 29  s, char **pzBuf)
234a0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
234b0 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
234c0 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
234d0 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
234e0 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
234f0 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
23500 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
23510 20 73 69 7a 65 5f 74 20 69 2c 20 6a 3b 0a 20 20   size_t i, j;.  
23520 69 6e 74 20 6e 50 72 65 20 3d 20 73 71 6c 69 74  int nPre = sqlit
23530 65 33 53 74 72 6c 65 6e 33 30 28 53 51 4c 49 54  e3Strlen30(SQLIT
23540 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
23550 49 58 29 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 2c  IX);.  int nMax,
23560 20 6e 42 75 66 2c 20 6e 44 69 72 2c 20 6e 4c 65   nBuf, nDir, nLe
23570 6e 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  n;.  char *zBuf;
23580 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
23590 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
235a0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
235b0 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
235c0 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
235d0 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
235e0 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
235f0 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
23600 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
23610 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
23620 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75  ing..  */.  Simu
23630 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
23640 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
23650 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   );..  /* Alloca
23660 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62  te a temporary b
23670 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
23680 68 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  he fully qualifi
23690 65 64 20 66 69 6c 65 0a 20 20 2a 2a 20 6e 61 6d  ed file.  ** nam
236a0 65 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72  e for the tempor
236b0 61 72 79 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ary file.  If th
236c0 69 73 20 66 61 69 6c 73 2c 20 77 65 20 63 61 6e  is fails, we can
236d0 6e 6f 74 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20  not continue..  
236e0 2a 2f 0a 20 20 6e 4d 61 78 20 3d 20 70 56 66 73  */.  nMax = pVfs
236f0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3b 20 6e 42  ->mxPathname; nB
23700 75 66 20 3d 20 6e 4d 61 78 20 2b 20 32 3b 0a 20  uf = nMax + 2;. 
23710 20 7a 42 75 66 20 3d 20 73 71 6c 69 74 65 33 4d   zBuf = sqlite3M
23720 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 42 75 66 20  allocZero( nBuf 
23730 29 3b 0a 20 20 69 66 28 20 21 7a 42 75 66 20 29  );.  if( !zBuf )
23740 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
23750 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
23760 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
23770 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  MEM\n"));.    re
23780 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
23790 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  R_NOMEM_BKPT;.  
237a0 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  }..  /* Figure o
237b0 75 74 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ut the effective
237c0 20 74 65 6d 70 6f 72 61 72 79 20 64 69 72 65 63   temporary direc
237d0 74 6f 72 79 2e 20 20 46 69 72 73 74 2c 20 63 68  tory.  First, ch
237e0 65 63 6b 20 69 66 20 6f 6e 65 0a 20 20 2a 2a 20  eck if one.  ** 
237f0 68 61 73 20 62 65 65 6e 20 65 78 70 6c 69 63 69  has been explici
23800 74 6c 79 20 73 65 74 20 62 79 20 74 68 65 20 61  tly set by the a
23810 70 70 6c 69 63 61 74 69 6f 6e 3b 20 6f 74 68 65  pplication; othe
23820 72 77 69 73 65 2c 20 75 73 65 20 74 68 65 20 6f  rwise, use the o
23830 6e 65 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72  ne.  ** configur
23840 65 64 20 62 79 20 74 68 65 20 6f 70 65 72 61 74  ed by the operat
23850 69 6e 67 20 73 79 73 74 65 6d 2e 0a 20 20 2a 2f  ing system..  */
23860 0a 20 20 6e 44 69 72 20 3d 20 6e 4d 61 78 20 2d  .  nDir = nMax -
23870 20 28 6e 50 72 65 20 2b 20 31 35 29 3b 0a 20 20   (nPre + 15);.  
23880 61 73 73 65 72 74 28 20 6e 44 69 72 3e 30 20 29  assert( nDir>0 )
23890 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
238a0 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 29  temp_directory )
238b0 7b 0a 20 20 20 20 69 6e 74 20 6e 44 69 72 4c 65  {.    int nDirLe
238c0 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
238d0 6e 33 30 28 73 71 6c 69 74 65 33 5f 74 65 6d 70  n30(sqlite3_temp
238e0 5f 64 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 20  _directory);.   
238f0 20 69 66 28 20 6e 44 69 72 4c 65 6e 3e 30 20 29   if( nDirLen>0 )
23900 7b 0a 20 20 20 20 20 20 69 66 28 20 21 77 69 6e  {.      if( !win
23910 49 73 44 69 72 53 65 70 28 73 71 6c 69 74 65 33  IsDirSep(sqlite3
23920 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 5b  _temp_directory[
23930 6e 44 69 72 4c 65 6e 2d 31 5d 29 20 29 7b 0a 20  nDirLen-1]) ){. 
23940 20 20 20 20 20 20 20 6e 44 69 72 4c 65 6e 2b 2b         nDirLen++
23950 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23960 69 66 28 20 6e 44 69 72 4c 65 6e 3e 6e 44 69 72  if( nDirLen>nDir
23970 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
23980 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
23990 20 20 20 20 20 20 20 20 4f 53 54 52 41 43 45 28          OSTRACE(
239a0 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20  ("TEMP-FILENAME 
239b0 72 63 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 5c  rc=SQLITE_ERROR\
239c0 6e 22 29 29 3b 0a 20 20 20 20 20 20 20 20 72 65  n"));.        re
239d0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
239e0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
239f0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
23a00 65 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  e1", 0);.      }
23a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
23a20 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c 20 7a 42  nprintf(nMax, zB
23a30 75 66 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65  uf, "%s", sqlite
23a40 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
23a50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66  );.    }.  }.#if
23a60 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
23a70 4e 5f 5f 29 0a 20 20 65 6c 73 65 7b 0a 20 20 20  N__).  else{.   
23a80 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
23a90 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b  ar *azDirs[] = {
23aa0 0a 20 20 20 20 20 20 20 30 2c 20 2f 2a 20 67 65  .       0, /* ge
23ab0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
23ac0 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20 20  DIR") */.       
23ad0 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 4d  0, /* getenv("TM
23ae0 50 44 49 52 22 29 20 2a 2f 0a 20 20 20 20 20 20  PDIR") */.      
23af0 20 30 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54   0, /* getenv("T
23b00 4d 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30  MP") */.       0
23b10 2c 20 2f 2a 20 67 65 74 65 6e 76 28 22 54 45 4d  , /* getenv("TEM
23b20 50 22 29 20 2a 2f 0a 20 20 20 20 20 20 20 30 2c  P") */.       0,
23b30 20 2f 2a 20 67 65 74 65 6e 76 28 22 55 53 45 52   /* getenv("USER
23b40 50 52 4f 46 49 4c 45 22 29 20 2a 2f 0a 20 20 20  PROFILE") */.   
23b50 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
23b60 20 20 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70         "/usr/tmp
23b70 22 2c 0a 20 20 20 20 20 20 20 22 2f 74 6d 70 22  ",.       "/tmp"
23b80 2c 0a 20 20 20 20 20 20 20 22 2e 22 2c 0a 20 20  ,.       ".",.  
23b90 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a       0        /*
23ba0 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72   List terminator
23bb0 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20 75   */.    };.    u
23bc0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
23bd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
23be0 44 69 72 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Dir = 0;..    if
23bf0 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
23c00 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
23c10 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
23c20 22 29 3b 0a 20 20 20 20 69 66 28 20 21 61 7a 44  ");.    if( !azD
23c30 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
23c40 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
23c50 44 49 52 22 29 3b 0a 20 20 20 20 69 66 28 20 21  DIR");.    if( !
23c60 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a 44 69  azDirs[2] ) azDi
23c70 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[2] = getenv("
23c80 54 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20 21  TMP");.    if( !
23c90 61 7a 44 69 72 73 5b 33 5d 20 29 20 61 7a 44 69  azDirs[3] ) azDi
23ca0 72 73 5b 33 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[3] = getenv("
23cb0 54 45 4d 50 22 29 3b 0a 20 20 20 20 69 66 28 20  TEMP");.    if( 
23cc0 21 61 7a 44 69 72 73 5b 34 5d 20 29 20 61 7a 44  !azDirs[4] ) azD
23cd0 69 72 73 5b 34 5d 20 3d 20 67 65 74 65 6e 76 28  irs[4] = getenv(
23ce0 22 55 53 45 52 50 52 4f 46 49 4c 45 22 29 3b 0a  "USERPROFILE");.
23cf0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
23d00 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
23d10 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
23d20 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b   zDir=azDirs[i++
23d30 5d 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  ]){.      void *
23d40 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20 20 20  zConverted;.    
23d50 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
23d60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
23d70 2f 2a 20 49 66 20 74 68 65 20 70 61 74 68 20 73  /* If the path s
23d80 74 61 72 74 73 20 77 69 74 68 20 61 20 64 72 69  tarts with a dri
23d90 76 65 20 6c 65 74 74 65 72 20 66 6f 6c 6c 6f 77  ve letter follow
23da0 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6f 6e 0a  ed by the colon.
23db0 20 20 20 20 20 20 2a 2a 20 63 68 61 72 61 63 74        ** charact
23dc0 65 72 2c 20 61 73 73 75 6d 65 20 69 74 20 69 73  er, assume it is
23dd0 20 61 6c 72 65 61 64 79 20 61 20 6e 61 74 69 76   already a nativ
23de0 65 20 57 69 6e 33 32 20 70 61 74 68 3b 20 6f 74  e Win32 path; ot
23df0 68 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a  herwise,.      *
23e00 2a 20 69 74 20 6d 75 73 74 20 62 65 20 63 6f 6e  * it must be con
23e10 76 65 72 74 65 64 20 74 6f 20 61 20 6e 61 74 69  verted to a nati
23e20 76 65 20 57 69 6e 33 32 20 70 61 74 68 20 76 69  ve Win32 path vi
23e30 61 20 74 68 65 20 43 79 67 77 69 6e 20 41 50 49  a the Cygwin API
23e40 0a 20 20 20 20 20 20 2a 2a 20 70 72 69 6f 72 20  .      ** prior 
23e50 74 6f 20 75 73 69 6e 67 20 69 74 2e 0a 20 20 20  to using it..   
23e60 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
23e70 77 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72  winIsDriveLetter
23e80 41 6e 64 43 6f 6c 6f 6e 28 7a 44 69 72 29 20 29  AndColon(zDir) )
23e90 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6e 76 65  {.        zConve
23ea0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
23eb0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
23ec0 65 28 7a 44 69 72 29 3b 0a 20 20 20 20 20 20 20  e(zDir);.       
23ed0 20 69 66 28 20 21 7a 43 6f 6e 76 65 72 74 65 64   if( !zConverted
23ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
23ef0 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29  lite3_free(zBuf)
23f00 3b 0a 20 20 20 20 20 20 20 20 20 20 4f 53 54 52  ;.          OSTR
23f10 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
23f20 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
23f30 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
23f40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23f50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
23f60 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
23f70 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
23f80 77 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72  winIsDir(zConver
23f90 74 65 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ted) ){.        
23fa0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
23fb0 74 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22  tf(nMax, zBuf, "
23fc0 25 73 22 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20  %s", zDir);.    
23fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
23fe0 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a  ee(zConverted);.
23ff0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24000 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
24010 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
24020 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
24030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24040 20 20 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 73    zConverted = s
24050 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
24060 28 20 6e 4d 61 78 2b 31 20 29 3b 0a 20 20 20 20  ( nMax+1 );.    
24070 20 20 20 20 69 66 28 20 21 7a 43 6f 6e 76 65 72      if( !zConver
24080 74 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ted ){.         
24090 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
240a0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 4f  uf);.          O
240b0 53 54 52 41 43 45 28 28 22 54 45 4d 50 2d 46 49  STRACE(("TEMP-FI
240c0 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c 49 54 45  LENAME rc=SQLITE
240d0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29  _IOERR_NOMEM\n")
240e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
240f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
24100 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
24110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
24120 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70  f( cygwin_conv_p
24130 61 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20  ath(.           
24140 20 20 20 20 20 6f 73 49 73 4e 54 28 29 20 3f 20       osIsNT() ? 
24150 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e  CCP_POSIX_TO_WIN
24160 5f 57 20 3a 20 43 43 50 5f 50 4f 53 49 58 5f 54  _W : CCP_POSIX_T
24170 4f 5f 57 49 4e 5f 41 2c 20 7a 44 69 72 2c 0a 20  O_WIN_A, zDir,. 
24180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
24190 43 6f 6e 76 65 72 74 65 64 2c 20 6e 4d 61 78 2b  Converted, nMax+
241a0 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1)<0 ){.        
241b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
241c0 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20  Converted);.    
241d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
241e0 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ee(zBuf);.      
241f0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45      OSTRACE(("TE
24200 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53  MP-FILENAME rc=S
24210 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
24220 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20 20 20  PATH\n"));.     
24230 20 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c       return winL
24240 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24250 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 2c 20 28  OERR_CONVPATH, (
24260 44 57 4f 52 44 29 65 72 72 6e 6f 2c 0a 20 20 20  DWORD)errno,.   
24270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24280 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47 65            "winGe
24290 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 7a 44 69  tTempname2", zDi
242a0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
242b0 20 20 20 20 20 20 69 66 28 20 77 69 6e 49 73 44        if( winIsD
242c0 69 72 28 7a 43 6f 6e 76 65 72 74 65 64 29 20 29  ir(zConverted) )
242d0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
242e0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
242f0 20 6b 6e 6f 77 20 74 68 65 20 63 61 6e 64 69 64   know the candid
24300 61 74 65 20 64 69 72 65 63 74 6f 72 79 20 65 78  ate directory ex
24310 69 73 74 73 20 61 6e 64 20 73 68 6f 75 6c 64 0a  ists and should.
24320 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20            ** be 
24330 75 73 65 64 2e 20 20 48 6f 77 65 76 65 72 2c 20  used.  However, 
24340 77 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 63  we may need to c
24350 6f 6e 76 65 72 74 20 74 68 65 20 73 74 72 69 6e  onvert the strin
24360 67 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20  g containing.   
24370 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6e 61         ** its na
24380 6d 65 20 69 6e 74 6f 20 55 54 46 2d 38 20 28 69  me into UTF-8 (i
24390 2e 65 2e 20 69 66 20 69 74 20 69 73 20 55 54 46  .e. if it is UTF
243a0 2d 31 36 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  -16 right now)..
243b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
243c0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 55 74         char *zUt
243d0 66 38 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 54  f8 = winConvertT
243e0 6f 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 43  oUtf8Filename(zC
243f0 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20  onverted);.     
24400 20 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20       if( !zUtf8 
24410 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
24420 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24430 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
24440 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24450 65 28 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 20  e(zBuf);.       
24460 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 54       OSTRACE(("T
24470 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d  EMP-FILENAME rc=
24480 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
24490 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 20  EM\n"));.       
244a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
244b0 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
244c0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
244d0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
244e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78  e3_snprintf(nMax
244f0 2c 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 55  , zBuf, "%s", zU
24500 74 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tf8);.          
24510 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55 74  sqlite3_free(zUt
24520 66 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  f8);.          s
24530 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
24540 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 20  verted);.       
24550 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
24560 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
24570 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
24580 74 65 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ted);.      }.  
24590 20 20 7d 0a 20 20 7d 0a 23 65 6c 69 66 20 21 53    }.  }.#elif !S
245a0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26  QLITE_OS_WINRT &
245b0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 43 59 47  & !defined(__CYG
245c0 57 49 4e 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66  WIN__).  else if
245d0 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
245e0 20 20 63 68 61 72 20 2a 7a 4d 75 6c 74 69 3b 0a    char *zMulti;.
245f0 20 20 20 20 4c 50 57 53 54 52 20 7a 57 69 64 65      LPWSTR zWide
24600 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 4d 61  Path = sqlite3Ma
24610 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d 61 78 2a 73  llocZero( nMax*s
24620 69 7a 65 6f 66 28 57 43 48 41 52 29 20 29 3b 0a  izeof(WCHAR) );.
24630 20 20 20 20 69 66 28 20 21 7a 57 69 64 65 50 61      if( !zWidePa
24640 74 68 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  th ){.      sqli
24650 74 65 33 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a  te3_free(zBuf);.
24660 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
24670 54 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63  TEMP-FILENAME rc
24680 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f  =SQLITE_IOERR_NO
24690 4d 45 4d 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20  MEM\n"));.      
246a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
246b0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
246c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 73      }.    if( os
246d0 47 65 74 54 65 6d 70 50 61 74 68 57 28 6e 4d 61  GetTempPathW(nMa
246e0 78 2c 20 7a 57 69 64 65 50 61 74 68 29 3d 3d 30  x, zWidePath)==0
246f0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24700 33 5f 66 72 65 65 28 7a 57 69 64 65 50 61 74 68  3_free(zWidePath
24710 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24720 5f 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20  _free(zBuf);.   
24730 20 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d     OSTRACE(("TEM
24740 50 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51  P-FILENAME rc=SQ
24750 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
24760 4d 50 50 41 54 48 5c 6e 22 29 29 3b 0a 20 20 20  MPPATH\n"));.   
24770 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
24780 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24790 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 2c 20  RR_GETTEMPPATH, 
247a0 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
247b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
247c0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 47             "winG
247d0 65 74 54 65 6d 70 6e 61 6d 65 32 22 2c 20 30 29  etTempname2", 0)
247e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d 75 6c  ;.    }.    zMul
247f0 74 69 20 3d 20 77 69 6e 55 6e 69 63 6f 64 65 54  ti = winUnicodeT
24800 6f 55 74 66 38 28 7a 57 69 64 65 50 61 74 68 29  oUtf8(zWidePath)
24810 3b 0a 20 20 20 20 69 66 28 20 7a 4d 75 6c 74 69  ;.    if( zMulti
24820 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
24830 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4d 61 78 2c  3_snprintf(nMax,
24840 20 7a 42 75 66 2c 20 22 25 73 22 2c 20 7a 4d 75   zBuf, "%s", zMu
24850 6c 74 69 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  lti);.      sqli
24860 74 65 33 5f 66 72 65 65 28 7a 4d 75 6c 74 69 29  te3_free(zMulti)
24870 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
24880 66 72 65 65 28 7a 57 69 64 65 50 61 74 68 29 3b  free(zWidePath);
24890 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
248a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
248b0 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20 20  WidePath);.     
248c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42   sqlite3_free(zB
248d0 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  uf);.      OSTRA
248e0 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41  CE(("TEMP-FILENA
248f0 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45  ME rc=SQLITE_IOE
24900 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a 20  RR_NOMEM\n"));. 
24910 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24920 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42  TE_IOERR_NOMEM_B
24930 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  KPT;.    }.  }.#
24940 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 49 4e  ifdef SQLITE_WIN
24950 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c  32_HAS_ANSI.  el
24960 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 55  se{.    char *zU
24970 74 66 38 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  tf8;.    char *z
24980 4d 62 63 73 50 61 74 68 20 3d 20 73 71 6c 69 74  MbcsPath = sqlit
24990 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 6e 4d  e3MallocZero( nM
249a0 61 78 20 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  ax );.    if( !z
249b0 4d 62 63 73 50 61 74 68 20 29 7b 0a 20 20 20 20  MbcsPath ){.    
249c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
249d0 42 75 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  Buf);.      OSTR
249e0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
249f0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f  AME rc=SQLITE_IO
24a00 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 29 29 3b 0a  ERR_NOMEM\n"));.
24a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24a20 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
24a30 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
24a40 69 66 28 20 6f 73 47 65 74 54 65 6d 70 50 61 74  if( osGetTempPat
24a50 68 41 28 6e 4d 61 78 2c 20 7a 4d 62 63 73 50 61  hA(nMax, zMbcsPa
24a60 74 68 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  th)==0 ){.      
24a70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 42 75  sqlite3_free(zBu
24a80 66 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  f);.      OSTRAC
24a90 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e 41 4d  E(("TEMP-FILENAM
24aa0 45 20 72 63 3d 53 51 4c 49 54 45 5f 49 4f 45 52  E rc=SQLITE_IOER
24ab0 52 5f 47 45 54 54 45 4d 50 50 41 54 48 5c 6e 22  R_GETTEMPPATH\n"
24ac0 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
24ad0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
24ae0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
24af0 50 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  PPATH, osGetLast
24b00 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
24b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b20 20 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d    "winGetTempnam
24b30 65 33 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  e3", 0);.    }. 
24b40 20 20 20 7a 55 74 66 38 20 3d 20 77 69 6e 4d 62     zUtf8 = winMb
24b50 63 73 54 6f 55 74 66 38 28 7a 4d 62 63 73 50 61  csToUtf8(zMbcsPa
24b60 74 68 2c 20 6f 73 41 72 65 46 69 6c 65 41 70 69  th, osAreFileApi
24b70 73 41 4e 53 49 28 29 29 3b 0a 20 20 20 20 69 66  sANSI());.    if
24b80 28 20 7a 55 74 66 38 20 29 7b 0a 20 20 20 20 20  ( zUtf8 ){.     
24b90 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24ba0 66 28 6e 4d 61 78 2c 20 7a 42 75 66 2c 20 22 25  f(nMax, zBuf, "%
24bb0 73 22 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20  s", zUtf8);.    
24bc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
24bd0 55 74 66 38 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Utf8);.    }else
24be0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24bf0 66 72 65 65 28 7a 42 75 66 29 3b 0a 20 20 20 20  free(zBuf);.    
24c00 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 4d 50    OSTRACE(("TEMP
24c10 2d 46 49 4c 45 4e 41 4d 45 20 72 63 3d 53 51 4c  -FILENAME rc=SQL
24c20 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c  ITE_IOERR_NOMEM\
24c30 6e 22 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n"));.      retu
24c40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
24c50 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24c60 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
24c70 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53  SQLITE_WIN32_HAS
24c80 5f 41 4e 53 49 20 2a 2f 0a 23 65 6e 64 69 66 20  _ANSI */.#endif 
24c90 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49  /* !SQLITE_OS_WI
24ca0 4e 52 54 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  NRT */..  /*.  *
24cb0 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20  * Check to make 
24cc0 73 75 72 65 20 74 68 65 20 74 65 6d 70 6f 72 61  sure the tempora
24cd0 72 79 20 64 69 72 65 63 74 6f 72 79 20 65 6e 64  ry directory end
24ce0 73 20 77 69 74 68 20 61 6e 20 61 70 70 72 6f 70  s with an approp
24cf0 72 69 61 74 65 0a 20 20 2a 2a 20 73 65 70 61 72  riate.  ** separ
24d00 61 74 6f 72 2e 20 20 49 66 20 69 74 20 64 6f 65  ator.  If it doe
24d10 73 20 6e 6f 74 20 61 6e 64 20 74 68 65 72 65 20  s not and there 
24d20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20 73 70  is not enough sp
24d30 61 63 65 20 6c 65 66 74 20 74 6f 20 61 64 64 0a  ace left to add.
24d40 20 20 2a 2a 20 6f 6e 65 2c 20 66 61 69 6c 2e 0a    ** one, fail..
24d50 20 20 2a 2f 0a 20 20 69 66 28 20 21 77 69 6e 4d    */.  if( !winM
24d60 61 6b 65 45 6e 64 49 6e 44 69 72 53 65 70 28 6e  akeEndInDirSep(n
24d70 44 69 72 2b 31 2c 20 7a 42 75 66 29 20 29 7b 0a  Dir+1, zBuf) ){.
24d80 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
24d90 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
24da0 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
24db0 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
24dc0 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
24dd0 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
24de0 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
24df0 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
24e00 65 34 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e4", 0);.  }..  
24e10 2f 2a 0a 20 20 2a 2a 20 43 68 65 63 6b 20 74 68  /*.  ** Check th
24e20 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  at the output bu
24e30 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e  ffer is large en
24e40 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d  ough for the tem
24e50 70 6f 72 61 72 79 20 66 69 6c 65 0a 20 20 2a 2a  porary file.  **
24e60 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 66 6f 6c   name in the fol
24e70 6c 6f 77 69 6e 67 20 66 6f 72 6d 61 74 3a 0a 20  lowing format:. 
24e80 20 2a 2a 0a 20 20 2a 2a 20 20 20 22 3c 74 65 6d   **.  **   "<tem
24e90 70 6f 72 61 72 79 5f 64 69 72 65 63 74 6f 72 79  porary_directory
24ea0 3e 2f 65 74 69 6c 71 73 5f 58 58 58 58 58 58 58  >/etilqs_XXXXXXX
24eb0 58 58 58 58 58 58 58 58 5c 30 5c 30 22 0a 20 20  XXXXXXXX\0\0".  
24ec0 2a 2a 0a 20 20 2a 2a 20 49 66 20 6e 6f 74 2c 20  **.  ** If not, 
24ed0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24ee0 52 4f 52 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  ROR.  The number
24ef0 20 31 37 20 69 73 20 75 73 65 64 20 68 65 72 65   17 is used here
24f00 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
24f10 2a 20 61 63 63 6f 75 6e 74 20 66 6f 72 20 74 68  * account for th
24f20 65 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20  e space used by 
24f30 74 68 65 20 31 35 20 63 68 61 72 61 63 74 65 72  the 15 character
24f40 20 72 61 6e 64 6f 6d 20 73 75 66 66 69 78 20 61   random suffix a
24f50 6e 64 20 74 68 65 0a 20 20 2a 2a 20 74 77 6f 20  nd the.  ** two 
24f60 74 72 61 69 6c 69 6e 67 20 4e 55 4c 20 63 68 61  trailing NUL cha
24f70 72 61 63 74 65 72 73 2e 20 20 54 68 65 20 66 69  racters.  The fi
24f80 6e 61 6c 20 64 69 72 65 63 74 6f 72 79 20 73 65  nal directory se
24f90 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
24fa0 72 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  r.  ** has alrea
24fb0 64 79 20 61 64 64 65 64 20 69 66 20 69 74 20 77  dy added if it w
24fc0 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 70  as not already p
24fd0 72 65 73 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e  resent..  */.  n
24fe0 4c 65 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Len = sqlite3Str
24ff0 6c 65 6e 33 30 28 7a 42 75 66 29 3b 0a 20 20 69  len30(zBuf);.  i
25000 66 28 20 28 6e 4c 65 6e 20 2b 20 6e 50 72 65 20  f( (nLen + nPre 
25010 2b 20 31 37 29 20 3e 20 6e 42 75 66 20 29 7b 0a  + 17) > nBuf ){.
25020 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
25030 28 7a 42 75 66 29 3b 0a 20 20 20 20 4f 53 54 52  (zBuf);.    OSTR
25040 41 43 45 28 28 22 54 45 4d 50 2d 46 49 4c 45 4e  ACE(("TEMP-FILEN
25050 41 4d 45 20 72 63 3d 53 51 4c 49 54 45 5f 45 52  AME rc=SQLITE_ER
25060 52 4f 52 5c 6e 22 29 29 3b 0a 20 20 20 20 72 65  ROR\n"));.    re
25070 74 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72  turn winLogError
25080 28 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 30  (SQLITE_ERROR, 0
25090 2c 20 22 77 69 6e 47 65 74 54 65 6d 70 6e 61 6d  , "winGetTempnam
250a0 65 35 22 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  e5", 0);.  }..  
250b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
250c0 28 6e 42 75 66 2d 31 36 2d 6e 4c 65 6e 2c 20 7a  (nBuf-16-nLen, z
250d0 42 75 66 2b 6e 4c 65 6e 2c 20 53 51 4c 49 54 45  Buf+nLen, SQLITE
250e0 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
250f0 58 29 3b 0a 0a 20 20 6a 20 3d 20 73 71 6c 69 74  X);..  j = sqlit
25100 65 33 53 74 72 6c 65 6e 33 30 28 7a 42 75 66 29  e3Strlen30(zBuf)
25110 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64  ;.  sqlite3_rand
25120 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
25130 5b 6a 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [j]);.  for(i=0;
25140 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29   i<15; i++, j++)
25150 7b 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  {.    zBuf[j] = 
25160 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28  (char)zChars[ ((
25170 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42  unsigned char)zB
25180 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a  uf[j])%(sizeof(z
25190 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 7d  Chars)-1) ];.  }
251a0 0a 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a  .  zBuf[j] = 0;.
251b0 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b    zBuf[j+1] = 0;
251c0 0a 20 20 2a 70 7a 42 75 66 20 3d 20 7a 42 75 66  .  *pzBuf = zBuf
251d0 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  ;..  OSTRACE(("T
251e0 45 4d 50 2d 46 49 4c 45 4e 41 4d 45 20 6e 61 6d  EMP-FILENAME nam
251f0 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
25200 4f 4b 5c 6e 22 2c 20 7a 42 75 66 29 29 3b 0a 20  OK\n", zBuf));. 
25210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
25220 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
25230 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
25240 61 6d 65 64 20 66 69 6c 65 20 69 73 20 72 65 61  amed file is rea
25250 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 2e  lly a directory.
25260 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
25270 66 0a 2a 2a 20 69 74 20 69 73 20 73 6f 6d 65 74  f.** it is somet
25280 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
25290 61 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 72 20  a directory, or 
252a0 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  if there is any 
252b0 6b 69 6e 64 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a  kind of memory.*
252c0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  * allocation fai
252d0 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lure..*/.static 
252e0 69 6e 74 20 77 69 6e 49 73 44 69 72 28 63 6f 6e  int winIsDir(con
252f0 73 74 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72  st void *zConver
25300 74 65 64 29 7b 0a 20 20 44 57 4f 52 44 20 61 74  ted){.  DWORD at
25310 74 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  tr;.  int rc = 0
25320 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72  ;.  DWORD lastEr
25330 72 6e 6f 3b 0a 0a 20 20 69 66 28 20 6f 73 49 73  rno;..  if( osIs
25340 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  NT() ){.    int 
25350 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57 49 4e  cnt = 0;.    WIN
25360 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  32_FILE_ATTRIBUT
25370 45 5f 44 41 54 41 20 73 41 74 74 72 44 61 74 61  E_DATA sAttrData
25380 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41  ;.    memset(&sA
25390 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65  ttrData, 0, size
253a0 6f 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a  of(sAttrData));.
253b0 20 20 20 20 77 68 69 6c 65 28 20 21 28 72 63 20      while( !(rc 
253c0 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74 72 69  = osGetFileAttri
253d0 62 75 74 65 73 45 78 57 28 28 4c 50 43 57 53 54  butesExW((LPCWST
253e0 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a 20 20  R)zConverted,.  
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 20 20 20 20 47 65 74 46 69             GetFi
25410 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61 72 64  leExInfoStandard
25420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
25440 73 41 74 74 72 44 61 74 61 29 29 20 26 26 20 77  sAttrData)) && w
25450 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e  inRetryIoerr(&cn
25460 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29  t, &lastErrno) )
25470 7b 7d 0a 20 20 20 20 69 66 28 20 21 72 63 20 29  {}.    if( !rc )
25480 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  {.      return 0
25490 3b 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6e 61 6d  ; /* Invalid nam
254a0 65 3f 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  e? */.    }.    
254b0 61 74 74 72 20 3d 20 73 41 74 74 72 44 61 74 61  attr = sAttrData
254c0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
254d0 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  s;.#if SQLITE_OS
254e0 5f 57 49 4e 43 45 3d 3d 30 0a 20 20 7d 65 6c 73  _WINCE==0.  }els
254f0 65 7b 0a 20 20 20 20 61 74 74 72 20 3d 20 6f 73  e{.    attr = os
25500 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
25510 73 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65  sA((char*)zConve
25520 72 74 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rted);.#endif.  
25530 7d 0a 20 20 72 65 74 75 72 6e 20 28 61 74 74 72  }.  return (attr
25540 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41  !=INVALID_FILE_A
25550 54 54 52 49 42 55 54 45 53 29 20 26 26 20 28 61  TTRIBUTES) && (a
25560 74 74 72 26 46 49 4c 45 5f 41 54 54 52 49 42 55  ttr&FILE_ATTRIBU
25570 54 45 5f 44 49 52 45 43 54 4f 52 59 29 3b 0a 7d  TE_DIRECTORY);.}
25580 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66  ../*.** Open a f
25590 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
255a0 6e 74 20 77 69 6e 4f 70 65 6e 28 0a 20 20 73 71  nt winOpen(.  sq
255b0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
255c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
255d0 74 6f 20 67 65 74 20 6d 61 78 69 6d 75 6d 20 70  to get maximum p
255e0 61 74 68 20 6e 61 6d 65 20 6c 65 6e 67 74 68 20  ath name length 
255f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
25600 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  *zName,        /
25610 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
25620 6c 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20  le (UTF-8) */.  
25630 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
25640 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ,         /* Wri
25650 74 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69  te the SQLite fi
25660 6c 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a  le handle here *
25670 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25690 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c 61 67 73   Open mode flags
256a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
256b0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
256c0 2f 2a 20 53 74 61 74 75 73 20 72 65 74 75 72 6e  /* Status return
256d0 20 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 48   flags */.){.  H
256e0 41 4e 44 4c 45 20 68 3b 0a 20 20 44 57 4f 52 44  ANDLE h;.  DWORD
256f0 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a   lastErrno = 0;.
25700 20 20 44 57 4f 52 44 20 64 77 44 65 73 69 72 65    DWORD dwDesire
25710 64 41 63 63 65 73 73 3b 0a 20 20 44 57 4f 52 44  dAccess;.  DWORD
25720 20 64 77 53 68 61 72 65 4d 6f 64 65 3b 0a 20 20   dwShareMode;.  
25730 44 57 4f 52 44 20 64 77 43 72 65 61 74 69 6f 6e  DWORD dwCreation
25740 44 69 73 70 6f 73 69 74 69 6f 6e 3b 0a 20 20 44  Disposition;.  D
25750 57 4f 52 44 20 64 77 46 6c 61 67 73 41 6e 64 41  WORD dwFlagsAndA
25760 74 74 72 69 62 75 74 65 73 20 3d 20 30 3b 0a 23  ttributes = 0;.#
25770 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
25780 43 45 0a 20 20 69 6e 74 20 69 73 54 65 6d 70 20  CE.  int isTemp 
25790 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 77 69  = 0;.#endif.  wi
257a0 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
257b0 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 76  winFile*)id;.  v
257c0 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b  oid *zConverted;
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
257e0 20 46 69 6c 65 6e 61 6d 65 20 69 6e 20 4f 53 20   Filename in OS 
257f0 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 63 6f  encoding */.  co
25800 6e 73 74 20 63 68 61 72 20 2a 7a 55 74 66 38 4e  nst char *zUtf8N
25810 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 20 2f 2a 20  ame = zName; /* 
25820 46 69 6c 65 6e 61 6d 65 20 69 6e 20 55 54 46 2d  Filename in UTF-
25830 38 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  8 encoding */.  
25840 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 0a 20 20  int cnt = 0;..  
25850 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a  /* If argument z
25860 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70  Path is a NULL p
25870 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e  ointer, this fun
25880 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65  ction is require
25890 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  d to open.  ** a
258a0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
258b0 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72   Use this buffer
258c0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
258d0 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f  le name in..  */
258e0 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 6e 61 6d  .  char *zTmpnam
258f0 65 20 3d 20 30 3b 20 2f 2a 20 46 6f 72 20 74 65  e = 0; /* For te
25900 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
25910 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  , if necessary. 
25920 2a 2f 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  */..  int rc = S
25930 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
25940 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
25950 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
25960 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
25970 42 55 47 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  BUG) || SQLITE_O
25980 53 5f 57 49 4e 43 45 0a 20 20 69 6e 74 20 65 54  S_WINCE.  int eT
25990 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
259a0 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  FFFF00;  /* Type
259b0 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
259c0 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 69 6e   */.#endif..  in
259d0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
259e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
259f0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
25a00 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
25a10 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
25a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
25a30 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
25a40 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
25a50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25a60 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
25a70 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
25a80 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
25a90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
25aa0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
25ab0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
25ac0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
25ad0 41 44 57 52 49 54 45 29 3b 0a 0a 23 69 66 6e 64  ADWRITE);..#ifnd
25ae0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
25af0 69 73 4f 70 65 6e 4a 6f 75 72 6e 61 6c 20 3d 20  isOpenJournal = 
25b00 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
25b10 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
25b20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
25b30 5f 4a 4f 55 52 4e 41 4c 0a 20 20 20 20 20 7c 7c  _JOURNAL.     ||
25b40 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25b50 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
25b60 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
25b70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
25b80 20 20 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20    ));.#endif..  
25b90 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 6e  OSTRACE(("OPEN n
25ba0 61 6d 65 3d 25 73 2c 20 70 46 69 6c 65 3d 25 70  ame=%s, pFile=%p
25bb0 2c 20 66 6c 61 67 73 3d 25 78 2c 20 70 4f 75 74  , flags=%x, pOut
25bc0 46 6c 61 67 73 3d 25 70 5c 6e 22 2c 0a 20 20 20  Flags=%p\n",.   
25bd0 20 20 20 20 20 20 20 20 7a 55 74 66 38 4e 61 6d          zUtf8Nam
25be0 65 2c 20 69 64 2c 20 66 6c 61 67 73 2c 20 70 4f  e, id, flags, pO
25bf0 75 74 46 6c 61 67 73 29 29 3b 0a 0a 20 20 2f 2a  utFlags));..  /*
25c00 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
25c10 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
25c20 61 72 65 20 74 72 75 65 3a 0a 20 20 2a 2a 0a 20  are true:.  **. 
25c30 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
25c40 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
25c50 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
25c60 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
25c70 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
25c80 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20    (b) if CREATE 
25c90 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41  is set, then REA
25ca0 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f  DWRITE must also
25cb0 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a   be set, and.  *
25cc0 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55  *   (c) if EXCLU
25cd0 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65  SIVE is set, the
25ce0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
25cf0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20  so be set..  ** 
25d00 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f    (d) if DELETEO
25d10 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74  NCLOSE is set, t
25d20 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
25d30 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
25d40 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65  /.  assert((isRe
25d50 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52  adonly==0 || isR
25d60 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20  eadWrite==0) && 
25d70 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20  (isReadWrite || 
25d80 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20  isReadonly));.  
25d90 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d  assert(isCreate=
25da0 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74  =0 || isReadWrit
25db0 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45  e);.  assert(isE
25dc0 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69  xclusive==0 || i
25dd0 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65  sCreate);.  asse
25de0 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c  rt(isDelete==0 |
25df0 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20  | isCreate);..  
25e00 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20  /* The main DB, 
25e10 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41  main journal, WA
25e20 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65  L file and maste
25e30 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65  r journal are ne
25e40 76 65 72 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  ver.  ** automat
25e50 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
25e60 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
25e70 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
25e80 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
25e90 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
25ea0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
25eb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25ec0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
25ed0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
25ee0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
25ef0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
25f00 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
25f10 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
25f20 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
25f30 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
25f40 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
25f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
25f60 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
25f70 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
25f80 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
25f90 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
25fa0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
25fb0 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
25fc0 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
25fd0 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
25fe0 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
25ff0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
26000 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
26010 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
26020 42 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70  B.       || eTyp
26030 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
26040 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
26050 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
26060 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 0a 20  N_TEMP_JOURNAL. 
26070 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
26080 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
26090 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70  OURNAL   || eTyp
260a0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
260b0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 0a 20 20  ASTER_JOURNAL.  
260c0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
260d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
260e0 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65  IENT_DB || eType
260f0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
26100 4c 0a 20 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  L.  );..  assert
26110 28 20 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20  ( pFile!=0 );.  
26120 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
26130 20 73 69 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29   sizeof(winFile)
26140 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  );.  pFile->h = 
26150 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
26160 41 4c 55 45 3b 0a 0a 23 69 66 20 53 51 4c 49 54  ALUE;..#if SQLIT
26170 45 5f 4f 53 5f 57 49 4e 52 54 0a 20 20 69 66 28  E_OS_WINRT.  if(
26180 20 21 7a 55 74 66 38 4e 61 6d 65 20 26 26 20 21   !zUtf8Name && !
26190 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
261a0 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 73 71  ectory ){.    sq
261b0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
261c0 5f 45 52 52 4f 52 2c 0a 20 20 20 20 20 20 20 20  _ERROR,.        
261d0 22 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69  "sqlite3_temp_di
261e0 72 65 63 74 6f 72 79 20 76 61 72 69 61 62 6c 65  rectory variable
261f0 20 73 68 6f 75 6c 64 20 62 65 20 73 65 74 20 66   should be set f
26200 6f 72 20 57 69 6e 52 54 22 29 3b 0a 20 20 7d 0a  or WinRT");.  }.
26210 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
26220 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
26230 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
26240 74 69 6f 6e 20 69 73 20 4e 55 4c 4c 2c 20 67 65  tion is NULL, ge
26250 6e 65 72 61 74 65 20 61 0a 20 20 2a 2a 20 74 65  nerate a.  ** te
26260 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
26270 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
26280 69 66 28 20 21 7a 55 74 66 38 4e 61 6d 65 20 29  if( !zUtf8Name )
26290 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  {.    assert( is
262a0 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f 70 65  Delete && !isOpe
262b0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
262c0 72 63 20 3d 20 77 69 6e 47 65 74 54 65 6d 70 6e  rc = winGetTempn
262d0 61 6d 65 28 70 56 66 73 2c 20 26 7a 54 6d 70 6e  ame(pVfs, &zTmpn
262e0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
262f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26300 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
26310 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
26320 25 73 22 2c 20 7a 55 74 66 38 4e 61 6d 65 2c 20  %s", zUtf8Name, 
26330 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
26340 63 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  c)));.      retu
26350 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
26360 20 7a 55 74 66 38 4e 61 6d 65 20 3d 20 7a 54 6d   zUtf8Name = zTm
26370 70 6e 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pname;.  }..  /*
26380 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
26390 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a  mes are double-z
263a0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69  ero terminated i
263b0 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20  f they are not. 
263c0 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
263d0 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
263e0 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
263f0 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
26400 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72  .  ** sqlite3_ur
26410 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 0a 20  i_parameter().. 
26420 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 65   */.  assert( (e
26430 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
26440 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 7c 20 28 66  N_MAIN_DB) || (f
26450 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
26460 45 4e 5f 55 52 49 29 20 7c 7c 0a 20 20 20 20 20  EN_URI) ||.     
26470 20 20 7a 55 74 66 38 4e 61 6d 65 5b 73 71 6c 69    zUtf8Name[sqli
26480 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 74 66  te3Strlen30(zUtf
26490 38 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a  8Name)+1]==0 );.
264a0 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68  .  /* Convert th
264b0 65 20 66 69 6c 65 6e 61 6d 65 20 74 6f 20 74 68  e filename to th
264c0 65 20 73 79 73 74 65 6d 20 65 6e 63 6f 64 69 6e  e system encodin
264d0 67 2e 20 2a 2f 0a 20 20 7a 43 6f 6e 76 65 72 74  g. */.  zConvert
264e0 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46  ed = winConvertF
264f0 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65 28  romUtf8Filename(
26500 7a 55 74 66 38 4e 61 6d 65 29 3b 0a 20 20 69 66  zUtf8Name);.  if
26510 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30 20  ( zConverted==0 
26520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
26530 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
26540 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45     OSTRACE(("OPE
26550 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51  N name=%s, rc=SQ
26560 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
26570 22 2c 20 7a 55 74 66 38 4e 61 6d 65 29 29 3b 0a  ", zUtf8Name));.
26580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26590 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
265a0 50 54 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 77  PT;.  }..  if( w
265b0 69 6e 49 73 44 69 72 28 7a 43 6f 6e 76 65 72 74  inIsDir(zConvert
265c0 65 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ed) ){.    sqlit
265d0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
265e0 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
265f0 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
26600 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
26610 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 72 63 3d  PEN name=%s, rc=
26620 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26630 49 53 44 49 52 22 2c 20 7a 55 74 66 38 4e 61 6d  ISDIR", zUtf8Nam
26640 65 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e));.    return 
26650 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
26660 49 53 44 49 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ISDIR;.  }..  if
26670 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b  ( isReadWrite ){
26680 0a 20 20 20 20 64 77 44 65 73 69 72 65 64 41 63  .    dwDesiredAc
26690 63 65 73 73 20 3d 20 47 45 4e 45 52 49 43 5f 52  cess = GENERIC_R
266a0 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
266b0 49 54 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ITE;.  }else{.  
266c0 20 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73    dwDesiredAcces
266d0 73 20 3d 20 47 45 4e 45 52 49 43 5f 52 45 41 44  s = GENERIC_READ
266e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 51 4c 49  ;.  }..  /* SQLI
266f0 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
26700 45 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61 6b  E is used to mak
26710 65 20 73 75 72 65 20 74 68 61 74 20 61 20 6e 65  e sure that a ne
26720 77 20 66 69 6c 65 20 69 73 0a 20 20 2a 2a 20 63  w file is.  ** c
26730 72 65 61 74 65 64 2e 20 53 51 4c 69 74 65 20 64  reated. SQLite d
26740 6f 65 73 6e 27 74 20 75 73 65 20 69 74 20 74 6f  oesn't use it to
26750 20 69 6e 64 69 63 61 74 65 20 22 65 78 63 6c 75   indicate "exclu
26760 73 69 76 65 20 61 63 63 65 73 73 22 0a 20 20 2a  sive access".  *
26770 2a 20 61 73 20 69 74 20 69 73 20 75 73 75 61 6c  * as it is usual
26780 6c 79 20 75 6e 64 65 72 73 74 6f 6f 64 2e 0a 20  ly understood.. 
26790 20 2a 2f 0a 20 20 69 66 28 20 69 73 45 78 63 6c   */.  if( isExcl
267a0 75 73 69 76 65 20 29 7b 0a 20 20 20 20 2f 2a 20  usive ){.    /* 
267b0 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 66 69  Creates a new fi
267c0 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 64  le, only if it d
267d0 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
267e0 65 78 69 73 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a  exist. */.    /*
267f0 20 49 66 20 74 68 65 20 66 69 6c 65 20 65 78 69   If the file exi
26800 73 74 73 2c 20 69 74 20 66 61 69 6c 73 2e 20 2a  sts, it fails. *
26810 2f 0a 20 20 20 20 64 77 43 72 65 61 74 69 6f 6e  /.    dwCreation
26820 44 69 73 70 6f 73 69 74 69 6f 6e 20 3d 20 43 52  Disposition = CR
26830 45 41 54 45 5f 4e 45 57 3b 0a 20 20 7d 65 6c 73  EATE_NEW;.  }els
26840 65 20 69 66 28 20 69 73 43 72 65 61 74 65 20 29  e if( isCreate )
26850 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 65 78  {.    /* Open ex
26860 69 73 74 69 6e 67 20 66 69 6c 65 2c 20 6f 72 20  isting file, or 
26870 63 72 65 61 74 65 20 69 66 20 69 74 20 64 6f 65  create if it doe
26880 73 6e 27 74 20 65 78 69 73 74 20 2a 2f 0a 20 20  sn't exist */.  
26890 20 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70    dwCreationDisp
268a0 6f 73 69 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 41  osition = OPEN_A
268b0 4c 57 41 59 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  LWAYS;.  }else{.
268c0 20 20 20 20 2f 2a 20 4f 70 65 6e 73 20 61 20 66      /* Opens a f
268d0 69 6c 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20  ile, only if it 
268e0 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 64  exists. */.    d
268f0 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f 73 69  wCreationDisposi
26900 74 69 6f 6e 20 3d 20 4f 50 45 4e 5f 45 58 49 53  tion = OPEN_EXIS
26910 54 49 4e 47 3b 0a 20 20 7d 0a 0a 20 20 64 77 53  TING;.  }..  dwS
26920 68 61 72 65 4d 6f 64 65 20 3d 20 46 49 4c 45 5f  hareMode = FILE_
26930 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c  SHARE_READ | FIL
26940 45 5f 53 48 41 52 45 5f 57 52 49 54 45 3b 0a 0a  E_SHARE_WRITE;..
26950 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
26960 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
26970 57 49 4e 43 45 0a 20 20 20 20 64 77 46 6c 61 67  WINCE.    dwFlag
26980 73 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d  sAndAttributes =
26990 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
269a0 48 49 44 44 45 4e 3b 0a 20 20 20 20 69 73 54 65  HIDDEN;.    isTe
269b0 6d 70 20 3d 20 31 3b 0a 23 65 6c 73 65 0a 20 20  mp = 1;.#else.  
269c0 20 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72    dwFlagsAndAttr
269d0 69 62 75 74 65 73 20 3d 20 46 49 4c 45 5f 41 54  ibutes = FILE_AT
269e0 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41 52  TRIBUTE_TEMPORAR
269f0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y.              
26a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a10 20 7c 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   | FILE_ATTRIBUT
26a20 45 5f 48 49 44 44 45 4e 0a 20 20 20 20 20 20 20  E_HIDDEN.       
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 20 20 20 20 20 20 20 7c 20 46 49 4c 45 5f 46          | FILE_F
26a50 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
26a60 4f 53 45 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  OSE;.#endif.  }e
26a70 6c 73 65 7b 0a 20 20 20 20 64 77 46 6c 61 67 73  lse{.    dwFlags
26a80 41 6e 64 41 74 74 72 69 62 75 74 65 73 20 3d 20  AndAttributes = 
26a90 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
26aa0 4f 52 4d 41 4c 3b 0a 20 20 7d 0a 20 20 2f 2a 20  ORMAL;.  }.  /* 
26ab0 52 65 70 6f 72 74 73 20 66 72 6f 6d 20 74 68 65  Reports from the
26ac0 20 69 6e 74 65 72 6e 65 74 20 61 72 65 20 74 68   internet are th
26ad0 61 74 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  at performance i
26ae0 73 20 61 6c 77 61 79 73 0a 20 20 2a 2a 20 62 65  s always.  ** be
26af0 74 74 65 72 20 69 66 20 46 49 4c 45 5f 46 4c 41  tter if FILE_FLA
26b00 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20  G_RANDOM_ACCESS 
26b10 69 73 20 75 73 65 64 2e 20 20 54 69 63 6b 65 74  is used.  Ticket
26b20 20 23 32 36 39 39 2e 20 2a 2f 0a 23 69 66 20 53   #2699. */.#if S
26b30 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 0a 20  QLITE_OS_WINCE. 
26b40 20 64 77 46 6c 61 67 73 41 6e 64 41 74 74 72 69   dwFlagsAndAttri
26b50 62 75 74 65 73 20 7c 3d 20 46 49 4c 45 5f 46 4c  butes |= FILE_FL
26b60 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
26b70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
26b80 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66 20  osIsNT() ){.#if 
26b90 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54 0a  SQLITE_OS_WINRT.
26ba0 20 20 20 20 43 52 45 41 54 45 46 49 4c 45 32 5f      CREATEFILE2_
26bb0 45 58 54 45 4e 44 45 44 5f 50 41 52 41 4d 45 54  EXTENDED_PARAMET
26bc0 45 52 53 20 65 78 74 65 6e 64 65 64 50 61 72 61  ERS extendedPara
26bd0 6d 65 74 65 72 73 3b 0a 20 20 20 20 65 78 74 65  meters;.    exte
26be0 6e 64 65 64 50 61 72 61 6d 65 74 65 72 73 2e 64  ndedParameters.d
26bf0 77 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 43  wSize = sizeof(C
26c00 52 45 41 54 45 46 49 4c 45 32 5f 45 58 54 45 4e  REATEFILE2_EXTEN
26c10 44 45 44 5f 50 41 52 41 4d 45 54 45 52 53 29 3b  DED_PARAMETERS);
26c20 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50 61 72  .    extendedPar
26c30 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65 41 74  ameters.dwFileAt
26c40 74 72 69 62 75 74 65 73 20 3d 0a 20 20 20 20 20  tributes =.     
26c50 20 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e         dwFlagsAn
26c60 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46 49  dAttributes & FI
26c70 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4d 41 53  LE_ATTRIBUTE_MAS
26c80 4b 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  K;.    extendedP
26c90 61 72 61 6d 65 74 65 72 73 2e 64 77 46 69 6c 65  arameters.dwFile
26ca0 46 6c 61 67 73 20 3d 20 64 77 46 6c 61 67 73 41  Flags = dwFlagsA
26cb0 6e 64 41 74 74 72 69 62 75 74 65 73 20 26 20 46  ndAttributes & F
26cc0 49 4c 45 5f 46 4c 41 47 5f 4d 41 53 4b 3b 0a 20  ILE_FLAG_MASK;. 
26cd0 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
26ce0 65 74 65 72 73 2e 64 77 53 65 63 75 72 69 74 79  eters.dwSecurity
26cf0 51 6f 73 46 6c 61 67 73 20 3d 20 53 45 43 55 52  QosFlags = SECUR
26d00 49 54 59 5f 41 4e 4f 4e 59 4d 4f 55 53 3b 0a 20  ITY_ANONYMOUS;. 
26d10 20 20 20 65 78 74 65 6e 64 65 64 50 61 72 61 6d     extendedParam
26d20 65 74 65 72 73 2e 6c 70 53 65 63 75 72 69 74 79  eters.lpSecurity
26d30 41 74 74 72 69 62 75 74 65 73 20 3d 20 4e 55 4c  Attributes = NUL
26d40 4c 3b 0a 20 20 20 20 65 78 74 65 6e 64 65 64 50  L;.    extendedP
26d50 61 72 61 6d 65 74 65 72 73 2e 68 54 65 6d 70 6c  arameters.hTempl
26d60 61 74 65 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  ateFile = NULL;.
26d70 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d 20      while( (h = 
26d80 6f 73 43 72 65 61 74 65 46 69 6c 65 32 28 28 4c  osCreateFile2((L
26d90 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
26da0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
26dd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26df0 64 77 53 68 61 72 65 4d 6f 64 65 2c 0a 20 20 20  dwShareMode,.   
26e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e10 20 20 20 20 20 20 20 20 20 20 20 64 77 43 72 65             dwCre
26e20 61 74 69 6f 6e 44 69 73 70 6f 73 69 74 69 6f 6e  ationDisposition
26e30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e50 26 65 78 74 65 6e 64 65 64 50 61 72 61 6d 65 74  &extendedParamet
26e60 65 72 73 29 29 3d 3d 49 4e 56 41 4c 49 44 5f 48  ers))==INVALID_H
26e70 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a 20  ANDLE_VALUE &&. 
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 20 20 20 77 69 6e               win
26ea0 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c  RetryIoerr(&cnt,
26eb0 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a   &lastErrno) ){.
26ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ed0 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d 0a  * Noop */.    }.
26ee0 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
26ef0 20 28 68 20 3d 20 6f 73 43 72 65 61 74 65 46 69   (h = osCreateFi
26f00 6c 65 57 28 28 4c 50 43 57 53 54 52 29 7a 43 6f  leW((LPCWSTR)zCo
26f10 6e 76 65 72 74 65 64 2c 0a 20 20 20 20 20 20 20  nverted,.       
26f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f30 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
26f40 41 63 63 65 73 73 2c 0a 20 20 20 20 20 20 20 20  Access,.        
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 20 20 20 20 20 20 64 77 53 68 61 72 65 4d 6f 64        dwShareMod
26f70 65 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20  e, NULL,.       
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 20 20 20 20 20 64 77 43 72 65 61 74 69 6f         dwCreatio
26fa0 6e 44 69 73 70 6f 73 69 74 69 6f 6e 2c 0a 20 20  nDisposition,.  
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fc0 20 20 20 20 20 20 20 20 20 20 20 20 64 77 46 6c              dwFl
26fd0 61 67 73 41 6e 64 41 74 74 72 69 62 75 74 65 73  agsAndAttributes
26fe0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
26ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27000 4e 55 4c 4c 29 29 3d 3d 49 4e 56 41 4c 49 44 5f  NULL))==INVALID_
27010 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 26 26 0a  HANDLE_VALUE &&.
27020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
27040 6e 52 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74  nRetryIoerr(&cnt
27050 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b  , &lastErrno) ){
27060 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27070 2f 2a 20 4e 6f 6f 70 20 2a 2f 0a 20 20 20 20 7d  /* Noop */.    }
27080 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 64  .#endif.  }.#ifd
27090 65 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ef SQLITE_WIN32_
270a0 48 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b  HAS_ANSI.  else{
270b0 0a 20 20 20 20 77 68 69 6c 65 28 20 28 68 20 3d  .    while( (h =
270c0 20 6f 73 43 72 65 61 74 65 46 69 6c 65 41 28 28   osCreateFileA((
270d0 4c 50 43 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  LPCSTR)zConverte
270e0 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
270f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27100 20 64 77 44 65 73 69 72 65 64 41 63 63 65 73 73   dwDesiredAccess
27110 2c 0a 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 20 20 20                  
27130 64 77 53 68 61 72 65 4d 6f 64 65 2c 20 4e 55 4c  dwShareMode, NUL
27140 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
27150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27160 20 64 77 43 72 65 61 74 69 6f 6e 44 69 73 70 6f   dwCreationDispo
27170 73 69 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  sition,.        
27180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27190 20 20 20 20 20 20 64 77 46 6c 61 67 73 41 6e 64        dwFlagsAnd
271a0 41 74 74 72 69 62 75 74 65 73 2c 0a 20 20 20 20  Attributes,.    
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 29 29            NULL))
271d0 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
271e0 5f 56 41 4c 55 45 20 26 26 0a 20 20 20 20 20 20  _VALUE &&.      
271f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27200 20 20 20 20 20 20 20 20 77 69 6e 52 65 74 72 79          winRetry
27210 49 6f 65 72 72 28 26 63 6e 74 2c 20 26 6c 61 73  Ioerr(&cnt, &las
27220 74 45 72 72 6e 6f 29 20 29 7b 0a 20 20 20 20 20  tErrno) ){.     
27230 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6f            /* Noo
27240 70 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  p */.    }.  }.#
27250 65 6e 64 69 66 0a 20 20 77 69 6e 4c 6f 67 49 6f  endif.  winLogIo
27260 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f  err(cnt, __LINE_
27270 5f 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28  _);..  OSTRACE((
27280 22 4f 50 45 4e 20 66 69 6c 65 3d 25 70 2c 20 6e  "OPEN file=%p, n
27290 61 6d 65 3d 25 73 2c 20 61 63 63 65 73 73 3d 25  ame=%s, access=%
272a0 6c 78 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 68 2c  lx, rc=%s\n", h,
272b0 20 7a 55 74 66 38 4e 61 6d 65 2c 0a 20 20 20 20   zUtf8Name,.    
272c0 20 20 20 20 20 20 20 64 77 44 65 73 69 72 65 64         dwDesired
272d0 41 63 63 65 73 73 2c 20 28 68 3d 3d 49 4e 56 41  Access, (h==INVA
272e0 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
272f0 29 20 3f 20 22 66 61 69 6c 65 64 22 20 3a 20 22  ) ? "failed" : "
27300 6f 6b 22 29 29 3b 0a 0a 20 20 69 66 28 20 68 3d  ok"));..  if( h=
27310 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f  =INVALID_HANDLE_
27320 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 70 46 69  VALUE ){.    pFi
27330 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
27340 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 77  lastErrno;.    w
27350 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
27360 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 70 46 69 6c  E_CANTOPEN, pFil
27370 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2c 20 22 77  e->lastErrno, "w
27380 69 6e 4f 70 65 6e 22 2c 20 7a 55 74 66 38 4e 61  inOpen", zUtf8Na
27390 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  me);.    sqlite3
273a0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
273b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
273c0 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  ree(zTmpname);. 
273d0 20 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69     if( isReadWri
273e0 74 65 20 26 26 20 21 69 73 45 78 63 6c 75 73 69  te && !isExclusi
273f0 76 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ve ){.      retu
27400 72 6e 20 77 69 6e 4f 70 65 6e 28 70 56 66 73 2c  rn winOpen(pVfs,
27410 20 7a 4e 61 6d 65 2c 20 69 64 2c 0a 20 20 20 20   zName, id,.    
27420 20 20 20 20 20 28 28 66 6c 61 67 73 7c 53 51 4c       ((flags|SQL
27430 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
27440 59 29 20 26 0a 20 20 20 20 20 20 20 20 20 20 20  Y) &.           
27450 20 20 20 20 20 20 20 20 20 20 7e 28 53 51 4c 49            ~(SQLI
27460 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 53  TE_OPEN_CREATE|S
27470 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
27480 52 49 54 45 29 29 2c 0a 20 20 20 20 20 20 20 20  RITE)),.        
27490 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 20   pOutFlags);.   
274a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
274b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
274c0 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OPEN_BKPT;.    }
274d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4f 75 74  .  }..  if( pOut
274e0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 69 66 28  Flags ){.    if(
274f0 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
27500 20 20 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73        *pOutFlags
27510 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
27520 45 41 44 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  EADWRITE;.    }e
27530 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 4f 75 74  lse{.      *pOut
27540 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
27550 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
27560 20 20 7d 0a 20 20 7d 0a 0a 20 20 4f 53 54 52 41    }.  }..  OSTRA
27570 43 45 28 28 22 4f 50 45 4e 20 66 69 6c 65 3d 25  CE(("OPEN file=%
27580 70 2c 20 6e 61 6d 65 3d 25 73 2c 20 61 63 63 65  p, name=%s, acce
27590 73 73 3d 25 6c 78 2c 20 70 4f 75 74 46 6c 61 67  ss=%lx, pOutFlag
275a0 73 3d 25 70 2c 20 2a 70 4f 75 74 46 6c 61 67 73  s=%p, *pOutFlags
275b0 3d 25 64 2c 20 22 0a 20 20 20 20 20 20 20 20 20  =%d, ".         
275c0 20 20 22 72 63 3d 25 73 5c 6e 22 2c 20 68 2c 20    "rc=%s\n", h, 
275d0 7a 55 74 66 38 4e 61 6d 65 2c 20 64 77 44 65 73  zUtf8Name, dwDes
275e0 69 72 65 64 41 63 63 65 73 73 2c 20 70 4f 75 74  iredAccess, pOut
275f0 46 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73  Flags, pOutFlags
27600 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 2a 70   ?.           *p
27610 4f 75 74 46 6c 61 67 73 20 3a 20 30 2c 20 28 68  OutFlags : 0, (h
27620 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
27630 5f 56 41 4c 55 45 29 20 3f 20 22 66 61 69 6c 65  _VALUE) ? "faile
27640 64 22 20 3a 20 22 6f 6b 22 29 29 3b 0a 0a 23 69  d" : "ok"));..#i
27650 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43  f SQLITE_OS_WINC
27660 45 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72  E.  if( isReadWr
27670 69 74 65 20 26 26 20 65 54 79 70 65 3d 3d 53 51  ite && eType==SQ
27680 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
27690 42 0a 20 20 20 20 20 20 20 26 26 20 28 72 63 20  B.       && (rc 
276a0 3d 20 77 69 6e 63 65 43 72 65 61 74 65 4c 6f 63  = winceCreateLoc
276b0 6b 28 7a 4e 61 6d 65 2c 20 70 46 69 6c 65 29 29  k(zName, pFile))
276c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 29 7b  !=SQLITE_OK.  ){
276d0 0a 20 20 20 20 6f 73 43 6c 6f 73 65 48 61 6e 64  .    osCloseHand
276e0 6c 65 28 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  le(h);.    sqlit
276f0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
27700 65 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ed);.    sqlite3
27710 5f 66 72 65 65 28 7a 54 6d 70 6e 61 6d 65 29 3b  _free(zTmpname);
27720 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f  .    OSTRACE(("O
27730 50 45 4e 2d 43 45 2d 4c 4f 43 4b 20 6e 61 6d 65  PEN-CE-LOCK name
27740 3d 25 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a  =%s, rc=%s\n", z
27750 4e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45 72 72  Name, sqlite3Err
27760 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20 20 20  Name(rc)));.    
27770 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
27780 20 69 66 28 20 69 73 54 65 6d 70 20 29 7b 0a 20   if( isTemp ){. 
27790 20 20 20 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74     pFile->zDelet
277a0 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 43 6f 6e 76  eOnClose = zConv
277b0 65 72 74 65 64 3b 0a 20 20 7d 65 6c 73 65 0a 23  erted;.  }else.#
277c0 65 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 73 71  endif.  {.    sq
277d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76  lite3_free(zConv
277e0 65 72 74 65 64 29 3b 0a 20 20 7d 0a 0a 20 20 73  erted);.  }..  s
277f0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 6d 70  qlite3_free(zTmp
27800 6e 61 6d 65 29 3b 0a 20 20 70 46 69 6c 65 2d 3e  name);.  pFile->
27810 70 4d 65 74 68 6f 64 20 3d 20 26 77 69 6e 49 6f  pMethod = &winIo
27820 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
27830 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20  >pVfs = pVfs;.  
27840 70 46 69 6c 65 2d 3e 68 20 3d 20 68 3b 0a 20 20  pFile->h = h;.  
27850 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20 29  if( isReadonly )
27860 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
27870 6c 46 6c 61 67 73 20 7c 3d 20 57 49 4e 46 49 4c  lFlags |= WINFIL
27880 45 5f 52 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20  E_RDONLY;.  }.  
27890 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
278a0 62 6f 6f 6c 65 61 6e 28 7a 4e 61 6d 65 2c 20 22  boolean(zName, "
278b0 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f  psow", SQLITE_PO
278c0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
278d0 45 29 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  E) ){.    pFile-
278e0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 57 49  >ctrlFlags |= WI
278f0 4e 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a  NFILE_PSOW;.  }.
27900 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
27910 6e 6f 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  no = NO_ERROR;. 
27920 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20   pFile->zPath = 
27930 7a 4e 61 6d 65 3b 0a 23 69 66 20 53 51 4c 49 54  zName;.#if SQLIT
27940 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
27950 30 0a 20 20 70 46 69 6c 65 2d 3e 68 4d 61 70 20  0.  pFile->hMap 
27960 3d 20 4e 55 4c 4c 3b 0a 20 20 70 46 69 6c 65 2d  = NULL;.  pFile-
27970 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
27980 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  .  pFile->mmapSi
27990 7a 65 20 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d  ze = 0;.  pFile-
279a0 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
279b0 3d 20 30 3b 0a 20 20 70 46 69 6c 65 2d 3e 6d 6d  = 0;.  pFile->mm
279c0 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69  apSizeMax = sqli
279d0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
279e0 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 0a  szMmap;.#endif..
279f0 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
27a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
27a10 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
27a20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a  the named file..
27a30 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
27a40 57 69 6e 64 6f 77 73 20 64 6f 65 73 20 6e 6f 74  Windows does not
27a50 20 61 6c 6c 6f 77 20 61 20 66 69 6c 65 20 74 6f   allow a file to
27a60 20 62 65 20 64 65 6c 65 74 65 64 20 69 66 20 73   be deleted if s
27a70 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
27a80 63 65 73 73 20 68 61 73 20 69 74 20 6f 70 65 6e  cess has it open
27a90 2e 20 20 53 6f 6d 65 74 69 6d 65 73 20 61 20 76  .  Sometimes a v
27aa0 69 72 75 73 20 73 63 61 6e 6e 65 72 20 6f 72 20  irus scanner or 
27ab0 69 6e 64 65 78 69 6e 67 20 70 72 6f 67 72 61 6d  indexing program
27ac0 0a 2a 2a 20 77 69 6c 6c 20 6f 70 65 6e 20 61 20  .** will open a 
27ad0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
27ae0 72 74 6c 79 20 61 66 74 65 72 20 69 74 20 69 73  rtly after it is
27af0 20 63 72 65 61 74 65 64 20 69 6e 20 6f 72 64 65   created in orde
27b00 72 20 74 6f 20 64 6f 0a 2a 2a 20 77 68 61 74 65  r to do.** whate
27b10 76 65 72 20 69 74 20 64 6f 65 73 2e 20 20 57 68  ver it does.  Wh
27b20 69 6c 65 20 74 68 69 73 20 6f 74 68 65 72 20 70  ile this other p
27b30 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
27b40 67 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 6f 70  g the.** file op
27b50 65 6e 2c 20 77 65 20 77 69 6c 6c 20 62 65 20 75  en, we will be u
27b60 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  nable to delete 
27b70 69 74 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  it.  To work aro
27b80 75 6e 64 20 74 68 69 73 0a 2a 2a 20 70 72 6f 62  und this.** prob
27b90 6c 65 6d 2c 20 77 65 20 64 65 6c 61 79 20 31 30  lem, we delay 10
27ba0 30 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 61  0 milliseconds a
27bb0 6e 64 20 74 72 79 20 74 6f 20 64 65 6c 65 74 65  nd try to delete
27bc0 20 61 67 61 69 6e 2e 20 20 55 70 0a 2a 2a 20 74   again.  Up.** t
27bd0 6f 20 4d 58 5f 44 45 4c 45 54 49 4f 4e 5f 41 54  o MX_DELETION_AT
27be0 54 45 4d 50 54 73 20 64 65 6c 65 74 69 6f 6e 20  TEMPTs deletion 
27bf0 61 74 74 65 6d 70 74 73 20 61 72 65 20 72 75 6e  attempts are run
27c00 20 62 65 66 6f 72 65 20 67 69 76 69 6e 67 0a 2a   before giving.*
27c10 2a 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 69  * up and returni
27c20 6e 67 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a  ng an error..*/.
27c30 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 44 65  static int winDe
27c40 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
27c50 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
27c60 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
27c70 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
27c80 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
27c90 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ame,      /* Nam
27ca0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 64 65 6c  e of file to del
27cb0 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e  ete */.  int syn
27cc0 63 44 69 72 20 20 20 20 20 20 20 20 20 20 20 20  cDir            
27cd0 20 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64       /* Not used
27ce0 20 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 29 7b 0a   on win32 */.){.
27cf0 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
27d00 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f 52 44   int rc;.  DWORD
27d10 20 61 74 74 72 3b 0a 20 20 44 57 4f 52 44 20 6c   attr;.  DWORD l
27d20 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  astErrno = 0;.  
27d30 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65 64  void *zConverted
27d40 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27d50 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 55 4e  ETER(pVfs);.  UN
27d60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 73  USED_PARAMETER(s
27d70 79 6e 63 44 69 72 29 3b 0a 0a 20 20 53 69 6d 75  yncDir);..  Simu
27d80 6c 61 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75  lateIOError(retu
27d90 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
27da0 44 45 4c 45 54 45 29 3b 0a 20 20 4f 53 54 52 41  DELETE);.  OSTRA
27db0 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65  CE(("DELETE name
27dc0 3d 25 73 2c 20 73 79 6e 63 44 69 72 3d 25 64 5c  =%s, syncDir=%d\
27dd0 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 73  n", zFilename, s
27de0 79 6e 63 44 69 72 29 29 3b 0a 0a 20 20 7a 43 6f  yncDir));..  zCo
27df0 6e 76 65 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e  nverted = winCon
27e00 76 65 72 74 46 72 6f 6d 55 74 66 38 46 69 6c 65  vertFromUtf8File
27e10 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
27e20 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65  .  if( zConverte
27e30 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d==0 ){.    OSTR
27e40 41 43 45 28 28 22 44 45 4c 45 54 45 20 6e 61 6d  ACE(("DELETE nam
27e50 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49 54 45 5f  e=%s, rc=SQLITE_
27e60 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e 22 2c 20  IOERR_NOMEM\n", 
27e70 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  zFilename));.   
27e80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
27e90 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  OERR_NOMEM_BKPT;
27ea0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 49 73 4e  .  }.  if( osIsN
27eb0 54 28 29 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a  T() ){.    do {.
27ec0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
27ed0 4e 52 54 0a 20 20 20 20 20 20 57 49 4e 33 32 5f  NRT.      WIN32_
27ee0 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44  FILE_ATTRIBUTE_D
27ef0 41 54 41 20 73 41 74 74 72 44 61 74 61 3b 0a 20  ATA sAttrData;. 
27f00 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 41 74       memset(&sAt
27f10 74 72 44 61 74 61 2c 20 30 2c 20 73 69 7a 65 6f  trData, 0, sizeo
27f20 66 28 73 41 74 74 72 44 61 74 61 29 29 3b 0a 20  f(sAttrData));. 
27f30 20 20 20 20 20 69 66 20 28 20 6f 73 47 65 74 46       if ( osGetF
27f40 69 6c 65 41 74 74 72 69 62 75 74 65 73 45 78 57  ileAttributesExW
27f50 28 7a 43 6f 6e 76 65 72 74 65 64 2c 20 47 65 74  (zConverted, Get
27f60 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
27f70 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
27f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f90 20 20 20 20 20 20 26 73 41 74 74 72 44 61 74 61        &sAttrData
27fa0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 74 74  ) ){.        att
27fb0 72 20 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77  r = sAttrData.dw
27fc0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a  FileAttributes;.
27fd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27fe0 20 20 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d       lastErrno =
27ff0 20 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28   osGetLastError(
28000 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  );.        if( l
28010 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
28020 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20  FILE_NOT_FOUND. 
28030 20 20 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45          || lastE
28040 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48  rrno==ERROR_PATH
28050 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20  _NOT_FOUND ){.  
28060 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
28070 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
28080 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61  _NOENT; /* Alrea
28090 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20  dy gone? */.    
280a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
280c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
280d0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
280e0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
280f0 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65       attr = osGe
28100 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
28110 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65  (zConverted);.#e
28120 6e 64 69 66 0a 20 20 20 20 20 20 69 66 20 28 20  ndif.      if ( 
28130 61 74 74 72 3d 3d 49 4e 56 41 4c 49 44 5f 46 49  attr==INVALID_FI
28140 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 7b  LE_ATTRIBUTES ){
28150 0a 20 20 20 20 20 20 20 20 6c 61 73 74 45 72 72  .        lastErr
28160 6e 6f 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72  no = osGetLastEr
28170 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 69  ror();.        i
28180 66 28 20 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 52  f( lastErrno==ER
28190 52 4f 52 5f 46 49 4c 45 5f 4e 4f 54 5f 46 4f 55  ROR_FILE_NOT_FOU
281a0 4e 44 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6c  ND.         || l
281b0 61 73 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f  astErrno==ERROR_
281c0 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20 29  PATH_NOT_FOUND )
281d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
281e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
281f0 4c 45 54 45 5f 4e 4f 45 4e 54 3b 20 2f 2a 20 41  LETE_NOENT; /* A
28200 6c 72 65 61 64 79 20 67 6f 6e 65 3f 20 2a 2f 0a  lready gone? */.
28210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
28220 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
28230 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
28240 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
28250 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
28260 20 20 20 69 66 20 28 20 61 74 74 72 26 46 49 4c     if ( attr&FIL
28270 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45  E_ATTRIBUTE_DIRE
28280 43 54 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 20  CTORY ){.       
28290 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
282a0 4f 52 3b 20 2f 2a 20 46 69 6c 65 73 20 6f 6e 6c  OR; /* Files onl
282b0 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  y. */.        br
282c0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
282d0 20 20 20 69 66 20 28 20 6f 73 44 65 6c 65 74 65     if ( osDelete
282e0 46 69 6c 65 57 28 7a 43 6f 6e 76 65 72 74 65 64  FileW(zConverted
282f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
28300 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f 2a 20  = SQLITE_OK; /* 
28310 44 65 6c 65 74 65 64 20 4f 4b 2e 20 2a 2f 0a 20  Deleted OK. */. 
28320 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28330 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20 28      }.      if (
28340 20 21 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28   !winRetryIoerr(
28350 26 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f  &cnt, &lastErrno
28360 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
28370 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  = SQLITE_ERROR; 
28380 2f 2a 20 4e 6f 20 6d 6f 72 65 20 72 65 74 72 69  /* No more retri
28390 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  es. */.        b
283a0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
283b0 20 20 7d 20 77 68 69 6c 65 28 31 29 3b 0a 20 20    } while(1);.  
283c0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
283d0 57 49 4e 33 32 5f 48 41 53 5f 41 4e 53 49 0a 20  WIN32_HAS_ANSI. 
283e0 20 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a   else{.    do {.
283f0 20 20 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47        attr = osG
28400 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73  etFileAttributes
28410 41 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  A(zConverted);. 
28420 20 20 20 20 20 69 66 20 28 20 61 74 74 72 3d 3d       if ( attr==
28430 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
28440 52 49 42 55 54 45 53 20 29 7b 0a 20 20 20 20 20  RIBUTES ){.     
28450 20 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 6f     lastErrno = o
28460 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b  sGetLastError();
28470 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 61 73  .        if( las
28480 74 45 72 72 6e 6f 3d 3d 45 52 52 4f 52 5f 46 49  tErrno==ERROR_FI
28490 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 0a 20 20 20  LE_NOT_FOUND.   
284a0 20 20 20 20 20 20 7c 7c 20 6c 61 73 74 45 72 72        || lastErr
284b0 6e 6f 3d 3d 45 52 52 4f 52 5f 50 41 54 48 5f 4e  no==ERROR_PATH_N
284c0 4f 54 5f 46 4f 55 4e 44 20 29 7b 0a 20 20 20 20  OT_FOUND ){.    
284d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
284e0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
284f0 4f 45 4e 54 3b 20 2f 2a 20 41 6c 72 65 61 64 79  OENT; /* Already
28500 20 67 6f 6e 65 3f 20 2a 2f 0a 20 20 20 20 20 20   gone? */.      
28510 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
28530 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  RROR;.        }.
28540 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
28550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
28560 28 20 61 74 74 72 26 46 49 4c 45 5f 41 54 54 52  ( attr&FILE_ATTR
28570 49 42 55 54 45 5f 44 49 52 45 43 54 4f 52 59 20  IBUTE_DIRECTORY 
28580 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
28590 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a  SQLITE_ERROR; /*
285a0 20 46 69 6c 65 73 20 6f 6e 6c 79 2e 20 2a 2f 0a   Files only. */.
285b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
285c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 20       }.      if 
285d0 28 20 6f 73 44 65 6c 65 74 65 46 69 6c 65 41 28  ( osDeleteFileA(
285e0 7a 43 6f 6e 76 65 72 74 65 64 29 20 29 7b 0a 20  zConverted) ){. 
285f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28600 54 45 5f 4f 4b 3b 20 2f 2a 20 44 65 6c 65 74 65  TE_OK; /* Delete
28610 64 20 4f 4b 2e 20 2a 2f 0a 20 20 20 20 20 20 20  d OK. */.       
28620 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28630 20 20 20 20 20 20 69 66 20 28 20 21 77 69 6e 52        if ( !winR
28640 65 74 72 79 49 6f 65 72 72 28 26 63 6e 74 2c 20  etryIoerr(&cnt, 
28650 26 6c 61 73 74 45 72 72 6e 6f 29 20 29 7b 0a 20  &lastErrno) ){. 
28660 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
28670 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 4e 6f 20  TE_ERROR; /* No 
28680 6d 6f 72 65 20 72 65 74 72 69 65 73 2e 20 2a 2f  more retries. */
28690 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
286a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77 68        }.    } wh
286b0 69 6c 65 28 31 29 3b 0a 20 20 7d 0a 23 65 6e 64  ile(1);.  }.#end
286c0 69 66 0a 20 20 69 66 28 20 72 63 20 26 26 20 72  if.  if( rc && r
286d0 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
286e0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 20 29 7b 0a  DELETE_NOENT ){.
286f0 20 20 20 20 72 63 20 3d 20 77 69 6e 4c 6f 67 45      rc = winLogE
28700 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
28710 52 5f 44 45 4c 45 54 45 2c 20 6c 61 73 74 45 72  R_DELETE, lastEr
28720 72 6e 6f 2c 20 22 77 69 6e 44 65 6c 65 74 65 22  rno, "winDelete"
28730 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
28740 7d 65 6c 73 65 7b 0a 20 20 20 20 77 69 6e 4c 6f  }else{.    winLo
28750 67 49 6f 65 72 72 28 63 6e 74 2c 20 5f 5f 4c 49  gIoerr(cnt, __LI
28760 4e 45 5f 5f 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  NE__);.  }.  sql
28770 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65  ite3_free(zConve
28780 72 74 65 64 29 3b 0a 20 20 4f 53 54 52 41 43 45  rted);.  OSTRACE
28790 28 28 22 44 45 4c 45 54 45 20 6e 61 6d 65 3d 25  (("DELETE name=%
287a0 73 2c 20 72 63 3d 25 73 5c 6e 22 2c 20 7a 46 69  s, rc=%s\n", zFi
287b0 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 45  lename, sqlite3E
287c0 72 72 4e 61 6d 65 28 72 63 29 29 29 3b 0a 20 20  rrName(rc)));.  
287d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
287e0 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65 20 65 78  .** Check the ex
287f0 69 73 74 65 6e 63 65 20 61 6e 64 20 73 74 61 74  istence and stat
28800 75 73 20 6f 66 20 61 20 66 69 6c 65 2e 0a 2a 2f  us of a file..*/
28810 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 41  .static int winA
28820 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33  ccess(.  sqlite3
28830 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
28840 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
28850 6f 6e 20 77 69 6e 33 32 20 2a 2f 0a 20 20 63 6f  on win32 */.  co
28860 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
28870 61 6d 65 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ame,     /* Name
28880 20 6f 66 20 66 69 6c 65 20 74 6f 20 63 68 65 63   of file to chec
28890 6b 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  k */.  int flags
288a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
288b0 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 73    /* Type of tes
288c0 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20 74 68 69  t to make on thi
288d0 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  s file */.  int 
288e0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
288f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
28900 65 73 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20 44 57  esult */.){.  DW
28910 4f 52 44 20 61 74 74 72 3b 0a 20 20 69 6e 74 20  ORD attr;.  int 
28920 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52 44 20  rc = 0;.  DWORD 
28930 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lastErrno = 0;. 
28940 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65 72 74 65   void *zConverte
28950 64 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  d;.  UNUSED_PARA
28960 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20  METER(pVfs);..  
28970 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
28980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
28990 4f 45 52 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a  OERR_ACCESS; );.
289a0 20 20 4f 53 54 52 41 43 45 28 28 22 41 43 43 45    OSTRACE(("ACCE
289b0 53 53 20 6e 61 6d 65 3d 25 73 2c 20 66 6c 61 67  SS name=%s, flag
289c0 73 3d 25 78 2c 20 70 52 65 73 4f 75 74 3d 25 70  s=%x, pResOut=%p
289d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
289e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 66 6c 61 67 73  zFilename, flags
289f0 2c 20 70 52 65 73 4f 75 74 29 29 3b 0a 0a 20 20  , pResOut));..  
28a00 7a 43 6f 6e 76 65 72 74 65 64 20 3d 20 77 69 6e  zConverted = win
28a10 43 6f 6e 76 65 72 74 46 72 6f 6d 55 74 66 38 46  ConvertFromUtf8F
28a20 69 6c 65 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d  ilename(zFilenam
28a30 65 29 3b 0a 20 20 69 66 28 20 7a 43 6f 6e 76 65  e);.  if( zConve
28a40 72 74 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  rted==0 ){.    O
28a50 53 54 52 41 43 45 28 28 22 41 43 43 45 53 53 20  STRACE(("ACCESS 
28a60 6e 61 6d 65 3d 25 73 2c 20 72 63 3d 53 51 4c 49  name=%s, rc=SQLI
28a70 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5c 6e  TE_IOERR_NOMEM\n
28a80 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a  ", zFilename));.
28a90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28aa0 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
28ab0 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73  PT;.  }.  if( os
28ac0 49 73 4e 54 28 29 20 29 7b 0a 20 20 20 20 69 6e  IsNT() ){.    in
28ad0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 57  t cnt = 0;.    W
28ae0 49 4e 33 32 5f 46 49 4c 45 5f 41 54 54 52 49 42  IN32_FILE_ATTRIB
28af0 55 54 45 5f 44 41 54 41 20 73 41 74 74 72 44 61  UTE_DATA sAttrDa
28b00 74 61 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ta;.    memset(&
28b10 73 41 74 74 72 44 61 74 61 2c 20 30 2c 20 73 69  sAttrData, 0, si
28b20 7a 65 6f 66 28 73 41 74 74 72 44 61 74 61 29 29  zeof(sAttrData))
28b30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 28 72  ;.    while( !(r
28b40 63 20 3d 20 6f 73 47 65 74 46 69 6c 65 41 74 74  c = osGetFileAtt
28b50 72 69 62 75 74 65 73 45 78 57 28 28 4c 50 43 57  ributesExW((LPCW
28b60 53 54 52 29 7a 43 6f 6e 76 65 72 74 65 64 2c 0a  STR)zConverted,.
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 47 65 74               Get
28b90 46 69 6c 65 45 78 49 6e 66 6f 53 74 61 6e 64 61  FileExInfoStanda
28ba0 72 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rd,.            
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 26 73 41 74 74 72 44 61 74 61 29 29 20 26 26   &sAttrData)) &&
28bd0 20 77 69 6e 52 65 74 72 79 49 6f 65 72 72 28 26   winRetryIoerr(&
28be0 63 6e 74 2c 20 26 6c 61 73 74 45 72 72 6e 6f 29  cnt, &lastErrno)
28bf0 20 29 7b 7d 0a 20 20 20 20 69 66 28 20 72 63 20   ){}.    if( rc 
28c00 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  ){.      /* For 
28c10 61 6e 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  an SQLITE_ACCESS
28c20 5f 45 58 49 53 54 53 20 71 75 65 72 79 2c 20 74  _EXISTS query, t
28c30 72 65 61 74 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  reat a zero-leng
28c40 74 68 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  th file.      **
28c50 20 61 73 20 69 66 20 69 74 20 64 6f 65 73 20 6e   as if it does n
28c60 6f 74 20 65 78 69 73 74 2e 0a 20 20 20 20 20 20  ot exist..      
28c70 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 20 20 20  */.      if(    
28c80 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
28c90 43 45 53 53 5f 45 58 49 53 54 53 0a 20 20 20 20  CESS_EXISTS.    
28ca0 20 20 20 20 20 20 26 26 20 73 41 74 74 72 44 61        && sAttrDa
28cb0 74 61 2e 6e 46 69 6c 65 53 69 7a 65 48 69 67 68  ta.nFileSizeHigh
28cc0 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  ==0.          &&
28cd0 20 73 41 74 74 72 44 61 74 61 2e 6e 46 69 6c 65   sAttrData.nFile
28ce0 53 69 7a 65 4c 6f 77 3d 3d 30 20 29 7b 0a 20 20  SizeLow==0 ){.  
28cf0 20 20 20 20 20 20 61 74 74 72 20 3d 20 49 4e 56        attr = INV
28d00 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42  ALID_FILE_ATTRIB
28d10 55 54 45 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73  UTES;.      }els
28d20 65 7b 0a 20 20 20 20 20 20 20 20 61 74 74 72 20  e{.        attr 
28d30 3d 20 73 41 74 74 72 44 61 74 61 2e 64 77 46 69  = sAttrData.dwFi
28d40 6c 65 41 74 74 72 69 62 75 74 65 73 3b 0a 20 20  leAttributes;.  
28d50 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
28d60 0a 20 20 20 20 20 20 77 69 6e 4c 6f 67 49 6f 65  .      winLogIoe
28d70 72 72 28 63 6e 74 2c 20 5f 5f 4c 49 4e 45 5f 5f  rr(cnt, __LINE__
28d80 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 61 73  );.      if( las
28d90 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 46 49  tErrno!=ERROR_FI
28da0 4c 45 5f 4e 4f 54 5f 46 4f 55 4e 44 20 26 26 20  LE_NOT_FOUND && 
28db0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52  lastErrno!=ERROR
28dc0 5f 50 41 54 48 5f 4e 4f 54 5f 46 4f 55 4e 44 20  _PATH_NOT_FOUND 
28dd0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
28de0 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74  e3_free(zConvert
28df0 65 64 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ed);.        ret
28e00 75 72 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28  urn winLogError(
28e10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
28e20 45 53 53 2c 20 6c 61 73 74 45 72 72 6e 6f 2c 20  ESS, lastErrno, 
28e30 22 77 69 6e 41 63 63 65 73 73 22 2c 0a 20 20 20  "winAccess",.   
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d          zFilenam
28e60 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
28e70 0a 20 20 20 20 20 20 20 20 61 74 74 72 20 3d 20  .        attr = 
28e80 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
28e90 52 49 42 55 54 45 53 3b 0a 20 20 20 20 20 20 7d  RIBUTES;.      }
28ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65  .    }.  }.#ifde
28eb0 66 20 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 48  f SQLITE_WIN32_H
28ec0 41 53 5f 41 4e 53 49 0a 20 20 65 6c 73 65 7b 0a  AS_ANSI.  else{.
28ed0 20 20 20 20 61 74 74 72 20 3d 20 6f 73 47 65 74      attr = osGet
28ee0 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
28ef0 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72 74 65  (char*)zConverte
28f00 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  d);.  }.#endif. 
28f10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
28f20 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 73 77 69  onverted);.  swi
28f30 74 63 68 28 20 66 6c 61 67 73 20 29 7b 0a 20 20  tch( flags ){.  
28f40 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 43    case SQLITE_AC
28f50 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20 63  CESS_READ:.    c
28f60 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
28f70 53 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20  S_EXISTS:.      
28f80 72 63 20 3d 20 61 74 74 72 21 3d 49 4e 56 41 4c  rc = attr!=INVAL
28f90 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55 54  ID_FILE_ATTRIBUT
28fa0 45 53 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ES;.      break;
28fb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
28fc0 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54  _ACCESS_READWRIT
28fd0 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 61 74  E:.      rc = at
28fe0 74 72 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45  tr!=INVALID_FILE
28ff0 5f 41 54 54 52 49 42 55 54 45 53 20 26 26 0a 20  _ATTRIBUTES &&. 
29000 20 20 20 20 20 20 20 20 20 20 20 20 28 61 74 74              (att
29010 72 20 26 20 46 49 4c 45 5f 41 54 54 52 49 42 55  r & FILE_ATTRIBU
29020 54 45 5f 52 45 41 44 4f 4e 4c 59 29 3d 3d 30 3b  TE_READONLY)==0;
29030 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
29040 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
29050 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
29060 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
29070 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
29080 75 74 20 3d 20 72 63 3b 0a 20 20 4f 53 54 52 41  ut = rc;.  OSTRA
29090 43 45 28 28 22 41 43 43 45 53 53 20 6e 61 6d 65  CE(("ACCESS name
290a0 3d 25 73 2c 20 70 52 65 73 4f 75 74 3d 25 70 2c  =%s, pResOut=%p,
290b0 20 2a 70 52 65 73 4f 75 74 3d 25 64 2c 20 72 63   *pResOut=%d, rc
290c0 3d 53 51 4c 49 54 45 5f 4f 4b 5c 6e 22 2c 0a 20  =SQLITE_OK\n",. 
290d0 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 6e            zFilen
290e0 61 6d 65 2c 20 70 52 65 73 4f 75 74 2c 20 2a 70  ame, pResOut, *p
290f0 52 65 73 4f 75 74 29 29 3b 0a 20 20 72 65 74 75  ResOut));.  retu
29100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
29110 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 6e  ./*.** Returns n
29120 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 73  on-zero if the s
29130 70 65 63 69 66 69 65 64 20 70 61 74 68 20 6e 61  pecified path na
29140 6d 65 20 73 74 61 72 74 73 20 77 69 74 68 20 61  me starts with a
29150 20 64 72 69 76 65 20 6c 65 74 74 65 72 0a 2a 2a   drive letter.**
29160 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 63   followed by a c
29170 6f 6c 6f 6e 20 63 68 61 72 61 63 74 65 72 2e 0a  olon character..
29180 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
29190 69 6e 49 73 44 72 69 76 65 4c 65 74 74 65 72 41  inIsDriveLetterA
291a0 6e 64 43 6f 6c 6f 6e 28 0a 20 20 63 6f 6e 73 74  ndColon(.  const
291b0 20 63 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65   char *zPathname
291c0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 20 73  .){.  return ( s
291d0 71 6c 69 74 65 33 49 73 61 6c 70 68 61 28 7a 50  qlite3Isalpha(zP
291e0 61 74 68 6e 61 6d 65 5b 30 5d 29 20 26 26 20 7a  athname[0]) && z
291f0 50 61 74 68 6e 61 6d 65 5b 31 5d 3d 3d 27 3a 27  Pathname[1]==':'
29200 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   );.}../*.** Ret
29210 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  urns non-zero if
29220 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
29230 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64 20  ath name should 
29240 62 65 20 75 73 65 64 20 76 65 72 62 61 74 69 6d  be used verbatim
29250 2e 20 20 49 66 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72  .  If.** non-zer
29260 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 66 72  o is returned fr
29270 6f 6d 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  om this function
29280 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
29290 6e 63 74 69 6f 6e 20 6d 75 73 74 20 73 69 6d 70  nction must simp
292a0 6c 79 0a 2a 2a 20 75 73 65 20 74 68 65 20 70 72  ly.** use the pr
292b0 6f 76 69 64 65 64 20 70 61 74 68 20 6e 61 6d 65  ovided path name
292c0 20 76 65 72 62 61 74 69 6d 20 2d 4f 52 2d 20 72   verbatim -OR- r
292d0 65 73 6f 6c 76 65 20 69 74 20 69 6e 74 6f 20 61  esolve it into a
292e0 20 66 75 6c 6c 20 70 61 74 68 20 6e 61 6d 65 0a   full path name.
292f0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 47 65 74  ** using the Get
29300 46 75 6c 6c 50 61 74 68 4e 61 6d 65 20 57 69 6e  FullPathName Win
29310 33 32 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  32 API function 
29320 28 69 66 20 61 76 61 69 6c 61 62 6c 65 29 2e 0a  (if available)..
29330 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 77  */.static BOOL w
29340 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61 74 68  inIsVerbatimPath
29350 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
29360 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 0a 29 7b  ar *zPathname.){
29370 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
29380 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61 72  e path name star
29390 74 73 20 77 69 74 68 20 61 20 66 6f 72 77 61 72  ts with a forwar
293a0 64 20 73 6c 61 73 68 20 6f 72 20 61 20 62 61 63  d slash or a bac
293b0 6b 73 6c 61 73 68 2c 20 69 74 20 69 73 20 65 69  kslash, it is ei
293c0 74 68 65 72 0a 20 20 2a 2a 20 61 20 6c 65 67 61  ther.  ** a lega
293d0 6c 20 55 4e 43 20 6e 61 6d 65 2c 20 61 20 76 6f  l UNC name, a vo
293e0 6c 75 6d 65 20 72 65 6c 61 74 69 76 65 20 70 61  lume relative pa
293f0 74 68 2c 20 6f 72 20 61 6e 20 61 62 73 6f 6c 75  th, or an absolu
29400 74 65 20 70 61 74 68 20 6e 61 6d 65 20 69 6e 20  te path name in 
29410 74 68 65 0a 20 20 2a 2a 20 22 55 6e 69 78 22 20  the.  ** "Unix" 
29420 66 6f 72 6d 61 74 20 6f 6e 20 57 69 6e 64 6f 77  format on Window
29430 73 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  s.  There is no 
29440 65 61 73 79 20 77 61 79 20 74 6f 20 64 69 66 66  easy way to diff
29450 65 72 65 6e 74 69 61 74 65 20 62 65 74 77 65 65  erentiate betwee
29460 6e 0a 20 20 2a 2a 20 74 68 65 20 66 69 6e 61 6c  n.  ** the final
29470 20 74 77 6f 20 63 61 73 65 73 3b 20 74 68 65 72   two cases; ther
29480 65 66 6f 72 65 2c 20 77 65 20 72 65 74 75 72 6e  efore, we return
29490 20 74 68 65 20 73 61 66 65 72 20 72 65 74 75 72   the safer retur
294a0 6e 20 76 61 6c 75 65 20 6f 66 20 54 52 55 45 0a  n value of TRUE.
294b0 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 63 61 6c    ** so that cal
294c0 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
294d0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 69 6d 70 6c  ction will simpl
294e0 79 20 75 73 65 20 69 74 20 76 65 72 62 61 74 69  y use it verbati
294f0 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 20 28 20 77  m..  */.  if ( w
29500 69 6e 49 73 44 69 72 53 65 70 28 7a 50 61 74 68  inIsDirSep(zPath
29510 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20 20  name[0]) ){.    
29520 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20 20 7d  return TRUE;.  }
29530 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  /*.  ** If t
29540 68 65 20 70 61 74 68 20 6e 61 6d 65 20 73 74 61  he path name sta
29550 72 74 73 20 77 69 74 68 20 61 20 6c 65 74 74 65  rts with a lette
29560 72 20 61 6e 64 20 61 20 63 6f 6c 6f 6e 20 69 74  r and a colon it
29570 20 69 73 20 65 69 74 68 65 72 20 61 20 76 6f 6c   is either a vol
29580 75 6d 65 0a 20 20 2a 2a 20 72 65 6c 61 74 69 76  ume.  ** relativ
29590 65 20 70 61 74 68 20 6f 72 20 61 6e 20 61 62 73  e path or an abs
295a0 6f 6c 75 74 65 20 70 61 74 68 2e 20 20 43 61 6c  olute path.  Cal
295b0 6c 65 72 73 20 6f 66 20 74 68 69 73 20 66 75 6e  lers of this fun
295c0 63 74 69 6f 6e 20 6d 75 73 74 20 6e 6f 74 0a 20  ction must not. 
295d0 20 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 74   ** attempt to t
295e0 72 65 61 74 20 69 74 20 61 73 20 61 20 72 65 6c  reat it as a rel
295f0 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20  ative path name 
29600 28 69 2e 65 2e 20 74 68 65 79 20 73 68 6f 75 6c  (i.e. they shoul
29610 64 20 73 69 6d 70 6c 79 20 75 73 65 0a 20 20 2a  d simply use.  *
29620 2a 20 69 74 20 76 65 72 62 61 74 69 6d 29 2e 0a  * it verbatim)..
29630 20 20 2a 2f 0a 20 20 69 66 20 28 20 77 69 6e 49    */.  if ( winI
29640 73 44 72 69 76 65 4c 65 74 74 65 72 41 6e 64 43  sDriveLetterAndC
29650 6f 6c 6f 6e 28 7a 50 61 74 68 6e 61 6d 65 29 20  olon(zPathname) 
29660 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52  ){.    return TR
29670 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  UE;.  }..  /*.  
29680 2a 2a 20 49 66 20 77 65 20 67 65 74 20 74 6f 20  ** If we get to 
29690 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
296a0 70 61 74 68 20 6e 61 6d 65 20 73 68 6f 75 6c 64  path name should
296b0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 6c   almost certainl
296c0 79 20 62 65 20 61 20 70 75 72 65 6c 79 0a 20 20  y be a purely.  
296d0 2a 2a 20 72 65 6c 61 74 69 76 65 20 6f 6e 65 20  ** relative one 
296e0 28 69 2e 65 2e 20 6e 6f 74 20 61 20 55 4e 43 20  (i.e. not a UNC 
296f0 6e 61 6d 65 2c 20 6e 6f 74 20 61 62 73 6f 6c 75  name, not absolu
29700 74 65 2c 20 61 6e 64 20 6e 6f 74 20 76 6f 6c 75  te, and not volu
29710 6d 65 20 72 65 6c 61 74 69 76 65 29 2e 0a 20 20  me relative)..  
29720 2a 2f 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53  */.  return FALS
29730 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e  E;.}../*.** Turn
29740 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
29750 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c  name into a full
29760 20 70 61 74 68 6e 61 6d 65 2e 20 20 57 72 69 74   pathname.  Writ
29770 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a 20 70 61  e the full.** pa
29780 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a 4f 75 74  thname into zOut
29790 5b 5d 2e 20 20 7a 4f 75 74 5b 5d 20 77 69 6c 6c  [].  zOut[] will
297a0 20 62 65 20 61 74 20 6c 65 61 73 74 20 70 56 66   be at least pVf
297b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 0a 2a 2a  s->mxPathname.**
297c0 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
297d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
297e0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  nFullPathname(. 
297f0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
29800 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
29810 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
29820 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
29830 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
29840 76 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  ve,        /* Po
29850 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
29860 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
29870 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20 20  int nFull,      
29880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29890 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
298a0 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
298b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  */.  char *zFull
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
298e0 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 53  fer */.){.#if !S
298f0 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26  QLITE_OS_WINCE &
29900 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  & !SQLITE_OS_WIN
29910 52 54 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  RT && !defined(_
29920 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 44 57 4f  _CYGWIN__).  DWO
29930 52 44 20 6e 42 79 74 65 3b 0a 20 20 76 6f 69 64  RD nByte;.  void
29940 20 2a 7a 43 6f 6e 76 65 72 74 65 64 3b 0a 20 20   *zConverted;.  
29950 63 68 61 72 20 2a 7a 4f 75 74 3b 0a 23 65 6e 64  char *zOut;.#end
29960 69 66 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  if..  /* If this
29970 20 70 61 74 68 20 6e 61 6d 65 20 62 65 67 69 6e   path name begin
29980 73 20 77 69 74 68 20 22 2f 58 3a 22 2c 20 77 68  s with "/X:", wh
29990 65 72 65 20 22 58 22 20 69 73 20 61 6e 79 20 61  ere "X" is any a
299a0 6c 70 68 61 62 65 74 69 63 0a 20 20 2a 2a 20 63  lphabetic.  ** c
299b0 68 61 72 61 63 74 65 72 2c 20 64 69 73 63 61 72  haracter, discar
299c0 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 22 2f  d the initial "/
299d0 22 20 66 72 6f 6d 20 74 68 65 20 70 61 74 68 6e  " from the pathn
299e0 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ame..  */.  if( 
299f0 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
29a00 27 20 26 26 20 77 69 6e 49 73 44 72 69 76 65 4c  ' && winIsDriveL
29a10 65 74 74 65 72 41 6e 64 43 6f 6c 6f 6e 28 7a 52  etterAndColon(zR
29a20 65 6c 61 74 69 76 65 2b 31 29 20 29 7b 0a 20 20  elative+1) ){.  
29a30 20 20 7a 52 65 6c 61 74 69 76 65 2b 2b 3b 0a 20    zRelative++;. 
29a40 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
29a50 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 53 69  __CYGWIN__).  Si
29a60 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
29a70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
29a80 4f 52 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  OR );.  UNUSED_P
29a90 41 52 41 4d 45 54 45 52 28 6e 46 75 6c 6c 29 3b  ARAMETER(nFull);
29aa0 0a 20 20 61 73 73 65 72 74 28 20 6e 46 75 6c 6c  .  assert( nFull
29ab0 3e 3d 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  >=pVfs->mxPathna
29ac0 6d 65 20 29 3b 0a 20 20 69 66 20 28 20 73 71 6c  me );.  if ( sql
29ad0 69 74 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74  ite3_data_direct
29ae0 6f 72 79 20 26 26 20 21 77 69 6e 49 73 56 65 72  ory && !winIsVer
29af0 62 61 74 69 6d 50 61 74 68 6e 61 6d 65 28 7a 52  batimPathname(zR
29b00 65 6c 61 74 69 76 65 29 20 29 7b 0a 20 20 20 20  elative) ){.    
29b10 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54 45 3a 20  /*.    ** NOTE: 
29b20 57 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  We are dealing w
29b30 69 74 68 20 61 20 72 65 6c 61 74 69 76 65 20 70  ith a relative p
29b40 61 74 68 20 6e 61 6d 65 20 61 6e 64 20 74 68 65  ath name and the
29b50 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 20 20 20   data.    **    
29b60 20 20 20 64 69 72 65 63 74 6f 72 79 20 68 61 73     directory has
29b70 20 62 65 65 6e 20 73 65 74 2e 20 20 54 68 65 72   been set.  Ther
29b80 65 66 6f 72 65 2c 20 75 73 65 20 69 74 20 61 73  efore, use it as
29b90 20 74 68 65 20 62 61 73 69 73 0a 20 20 20 20 2a   the basis.    *
29ba0 2a 20 20 20 20 20 20 20 66 6f 72 20 63 6f 6e 76  *       for conv
29bb0 65 72 74 69 6e 67 20 74 68 65 20 72 65 6c 61 74  erting the relat
29bc0 69 76 65 20 70 61 74 68 20 6e 61 6d 65 20 74 6f  ive path name to
29bd0 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a 20 20 20   an absolute.   
29be0 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65 20 62 79   **       one by
29bf0 20 70 72 65 70 65 6e 64 69 6e 67 20 74 68 65 20   prepending the 
29c00 64 61 74 61 20 64 69 72 65 63 74 6f 72 79 20 61  data directory a
29c10 6e 64 20 61 20 73 6c 61 73 68 2e 0a 20 20 20 20  nd a slash..    
29c20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 75  */.    char *zOu
29c30 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  t = sqlite3Mallo
29c40 63 5a 65 72 6f 28 20 70 56 66 73 2d 3e 6d 78 50  cZero( pVfs->mxP
29c50 61 74 68 6e 61 6d 65 2b 31 20 29 3b 0a 20 20 20  athname+1 );.   
29c60 20 69 66 28 20 21 7a 4f 75 74 20 29 7b 0a 20 20   if( !zOut ){.  
29c70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
29c80 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
29c90 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
29ca0 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f 70 61  ( cygwin_conv_pa
29cb0 74 68 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  th(.            
29cc0 28 6f 73 49 73 4e 54 28 29 20 3f 20 43 43 50 5f  (osIsNT() ? CCP_
29cd0 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a  POSIX_TO_WIN_W :
29ce0 20 43 43 50 5f 50 4f 53 49 58 5f 54 4f 5f 57 49   CCP_POSIX_TO_WI
29cf0 4e 5f 41 29 20 7c 0a 20 20 20 20 20 20 20 20 20  N_A) |.         
29d00 20 20 20 43 43 50 5f 52 45 4c 41 54 49 56 45 2c     CCP_RELATIVE,
29d10 20 7a 52 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74   zRelative, zOut
29d20 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
29d30 6d 65 2b 31 29 3c 30 20 29 7b 0a 20 20 20 20 20  me+1)<0 ){.     
29d40 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
29d50 75 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ut);.      retur
29d60 6e 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51  n winLogError(SQ
29d70 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f  LITE_CANTOPEN_CO
29d80 4e 56 50 41 54 48 2c 20 28 44 57 4f 52 44 29 65  NVPATH, (DWORD)e
29d90 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29db0 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 31  winFullPathname1
29dc0 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20  ", zRelative);. 
29dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29de0 63 68 61 72 20 2a 7a 55 74 66 38 20 3d 20 77 69  char *zUtf8 = wi
29df0 6e 43 6f 6e 76 65 72 74 54 6f 55 74 66 38 46 69  nConvertToUtf8Fi
29e00 6c 65 6e 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20  lename(zOut);.  
29e10 20 20 20 20 69 66 28 20 21 7a 55 74 66 38 20 29      if( !zUtf8 )
29e20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
29e30 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20  3_free(zOut);.  
29e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
29e50 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f  ITE_IOERR_NOMEM_
29e60 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
29e70 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29e80 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
29e90 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
29ea0 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
29eb0 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
29ec0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
29ed0 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29ee0 79 2c 20 77 69 6e 47 65 74 44 69 72 53 65 70 28  y, winGetDirSep(
29ef0 29 2c 20 7a 55 74 66 38 29 3b 0a 20 20 20 20 20  ), zUtf8);.     
29f00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 55   sqlite3_free(zU
29f10 74 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tf8);.      sqli
29f20 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29 3b 0a  te3_free(zOut);.
29f30 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
29f40 20 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 3d 20     char *zOut = 
29f50 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
29f60 6f 28 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  o( pVfs->mxPathn
29f70 61 6d 65 2b 31 20 29 3b 0a 20 20 20 20 69 66 28  ame+1 );.    if(
29f80 20 21 7a 4f 75 74 20 29 7b 0a 20 20 20 20 20 20   !zOut ){.      
29f90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
29fa0 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ERR_NOMEM_BKPT;.
29fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 79      }.    if( cy
29fc0 67 77 69 6e 5f 63 6f 6e 76 5f 70 61 74 68 28 0a  gwin_conv_path(.
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73 49              (osI
29fe0 73 4e 54 28 29 20 3f 20 43 43 50 5f 50 4f 53 49  sNT() ? CCP_POSI
29ff0 58 5f 54 4f 5f 57 49 4e 5f 57 20 3a 20 43 43 50  X_TO_WIN_W : CCP
2a000 5f 50 4f 53 49 58 5f 54 4f 5f 57 49 4e 5f 41 29  _POSIX_TO_WIN_A)
2a010 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 52  ,.            zR
2a020 65 6c 61 74 69 76 65 2c 20 7a 4f 75 74 2c 20 70  elative, zOut, p
2a030 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b  Vfs->mxPathname+
2a040 31 29 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 71  1)<0 ){.      sq
2a050 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 75 74 29  lite3_free(zOut)
2a060 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
2a070 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2a080 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
2a090 41 54 48 2c 20 28 44 57 4f 52 44 29 65 72 72 6e  ATH, (DWORD)errn
2a0a0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
2a0b0 20 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e              "win
2a0c0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 32 22 2c 20  FullPathname2", 
2a0d0 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20  zRelative);.    
2a0e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
2a0f0 72 20 2a 7a 55 74 66 38 20 3d 20 77 69 6e 43 6f  r *zUtf8 = winCo
2a100 6e 76 65 72 74 54 6f 55 74 66 38 46 69 6c 65 6e  nvertToUtf8Filen
2a110 61 6d 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ame(zOut);.     
2a120 20 69 66 28 20 21 7a 55 74 66 38 20 29 7b 0a 20   if( !zUtf8 ){. 
2a130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2a140 72 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 20  ree(zOut);.     
2a150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a160 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
2a170 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2a180 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2a190 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66  f(MIN(nFull, pVf
2a1a0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20  s->mxPathname), 
2a1b0 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20 7a 55 74  zFull, "%s", zUt
2a1c0 66 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  f8);.      sqlit
2a1d0 65 33 5f 66 72 65 65 28 7a 55 74 66 38 29 3b 0a  e3_free(zUtf8);.
2a1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2a1f0 65 65 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  ee(zOut);.    }.
2a200 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
2a210 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a  ITE_OK;.#endif..
2a220 23 69 66 20 28 53 51 4c 49 54 45 5f 4f 53 5f 57  #if (SQLITE_OS_W
2a230 49 4e 43 45 20 7c 7c 20 53 51 4c 49 54 45 5f 4f  INCE || SQLITE_O
2a240 53 5f 57 49 4e 52 54 29 20 26 26 20 21 64 65 66  S_WINRT) && !def
2a250 69 6e 65 64 28 5f 5f 43 59 47 57 49 4e 5f 5f 29  ined(__CYGWIN__)
2a260 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2a270 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2a280 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20 2f 2a 20  E_ERROR );.  /* 
2a290 57 69 6e 43 45 20 68 61 73 20 6e 6f 20 63 6f 6e  WinCE has no con
2a2a0 63 65 70 74 20 6f 66 20 61 20 72 65 6c 61 74 69  cept of a relati
2a2b0 76 65 20 70 61 74 68 6e 61 6d 65 2c 20 6f 72 20  ve pathname, or 
2a2c0 73 6f 20 49 20 61 6d 20 74 6f 6c 64 2e 20 2a 2f  so I am told. */
2a2d0 0a 20 20 2f 2a 20 57 69 6e 52 54 20 68 61 73 20  .  /* WinRT has 
2a2e0 6e 6f 20 77 61 79 20 74 6f 20 63 6f 6e 76 65 72  no way to conver
2a2f0 74 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  t a relative pat
2a300 68 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65  h to an absolute
2a310 20 6f 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28 20   one. */.  if ( 
2a320 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69 72  sqlite3_data_dir
2a330 65 63 74 6f 72 79 20 26 26 20 21 77 69 6e 49 73  ectory && !winIs
2a340 56 65 72 62 61 74 69 6d 50 61 74 68 6e 61 6d 65  VerbatimPathname
2a350 28 7a 52 65 6c 61 74 69 76 65 29 20 29 7b 0a 20  (zRelative) ){. 
2a360 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 4e 4f 54     /*.    ** NOT
2a370 45 3a 20 57 65 20 61 72 65 20 64 65 61 6c 69 6e  E: We are dealin
2a380 67 20 77 69 74 68 20 61 20 72 65 6c 61 74 69 76  g with a relativ
2a390 65 20 70 61 74 68 20 6e 61 6d 65 20 61 6e 64 20  e path name and 
2a3a0 74 68 65 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  the data.    ** 
2a3b0 20 20 20 20 20 20 64 69 72 65 63 74 6f 72 79 20        directory 
2a3c0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 20 54  has been set.  T
2a3d0 68 65 72 65 66 6f 72 65 2c 20 75 73 65 20 69 74  herefore, use it
2a3e0 20 61 73 20 74 68 65 20 62 61 73 69 73 0a 20 20   as the basis.  
2a3f0 20 20 2a 2a 20 20 20 20 20 20 20 66 6f 72 20 63    **       for c
2a400 6f 6e 76 65 72 74 69 6e 67 20 74 68 65 20 72 65  onverting the re
2a410 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d 65  lative path name
2a420 20 74 6f 20 61 6e 20 61 62 73 6f 6c 75 74 65 0a   to an absolute.
2a430 20 20 20 20 2a 2a 20 20 20 20 20 20 20 6f 6e 65      **       one
2a440 20 62 79 20 70 72 65 70 65 6e 64 69 6e 67 20 74   by prepending t
2a450 68 65 20 64 61 74 61 20 64 69 72 65 63 74 6f 72  he data director
2a460 79 20 61 6e 64 20 61 20 62 61 63 6b 73 6c 61 73  y and a backslas
2a470 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  h..    */.    sq
2a480 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
2a490 49 4e 28 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e  IN(nFull, pVfs->
2a4a0 6d 78 50 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75  mxPathname), zFu
2a4b0 6c 6c 2c 20 22 25 73 25 63 25 73 22 2c 0a 20 20  ll, "%s%c%s",.  
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4d0 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74 61 5f     sqlite3_data_
2a4e0 64 69 72 65 63 74 6f 72 79 2c 20 77 69 6e 47 65  directory, winGe
2a4f0 74 44 69 72 53 65 70 28 29 2c 20 7a 52 65 6c 61  tDirSep(), zRela
2a500 74 69 76 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tive);.  }else{.
2a510 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a520 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2a530 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a540 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 22 2c 20  ), zFull, "%s", 
2a550 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 7d 0a  zRelative);.  }.
2a560 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2a570 4f 4b 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  OK;.#endif..#if 
2a580 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 43 45  !SQLITE_OS_WINCE
2a590 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 53 5f 57   && !SQLITE_OS_W
2a5a0 49 4e 52 54 20 26 26 20 21 64 65 66 69 6e 65 64  INRT && !defined
2a5b0 28 5f 5f 43 59 47 57 49 4e 5f 5f 29 0a 20 20 2f  (__CYGWIN__).  /
2a5c0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2a5d0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2a5e0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2a5f0 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2a600 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2a610 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2a620 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2a630 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2a640 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2a650 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2a660 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
2a670 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
2a680 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
2a690 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
2a6a0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
2a6b0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
2a6c0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
2a6d0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2a6e0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
2a6f0 20 69 66 20 28 20 73 71 6c 69 74 65 33 5f 64 61   if ( sqlite3_da
2a700 74 61 5f 64 69 72 65 63 74 6f 72 79 20 26 26 20  ta_directory && 
2a710 21 77 69 6e 49 73 56 65 72 62 61 74 69 6d 50 61  !winIsVerbatimPa
2a720 74 68 6e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thname(zRelative
2a730 29 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ) ){.    /*.    
2a740 2a 2a 20 4e 4f 54 45 3a 20 57 65 20 61 72 65 20  ** NOTE: We are 
2a750 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 72  dealing with a r
2a760 65 6c 61 74 69 76 65 20 70 61 74 68 20 6e 61 6d  elative path nam
2a770 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 0a 20  e and the data. 
2a780 20 20 20 2a 2a 20 20 20 20 20 20 20 64 69 72 65     **       dire
2a790 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 73  ctory has been s
2a7a0 65 74 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 20  et.  Therefore, 
2a7b0 75 73 65 20 69 74 20 61 73 20 74 68 65 20 62 61  use it as the ba
2a7c0 73 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  sis.    **      
2a7d0 20 66 6f 72 20 63 6f 6e 76 65 72 74 69 6e 67 20   for converting 
2a7e0 74 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  the relative pat
2a7f0 68 20 6e 61 6d 65 20 74 6f 20 61 6e 20 61 62 73  h name to an abs
2a800 6f 6c 75 74 65 0a 20 20 20 20 2a 2a 20 20 20 20  olute.    **    
2a810 20 20 20 6f 6e 65 20 62 79 20 70 72 65 70 65 6e     one by prepen
2a820 64 69 6e 67 20 74 68 65 20 64 61 74 61 20 64 69  ding the data di
2a830 72 65 63 74 6f 72 79 20 61 6e 64 20 61 20 62 61  rectory and a ba
2a840 63 6b 73 6c 61 73 68 2e 0a 20 20 20 20 2a 2f 0a  ckslash..    */.
2a850 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a860 69 6e 74 66 28 4d 49 4e 28 6e 46 75 6c 6c 2c 20  intf(MIN(nFull, 
2a870 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2a880 29 2c 20 7a 46 75 6c 6c 2c 20 22 25 73 25 63 25  ), zFull, "%s%c%
2a890 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
2a8a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2a8b0 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c  _data_directory,
2a8c0 20 77 69 6e 47 65 74 44 69 72 53 65 70 28 29 2c   winGetDirSep(),
2a8d0 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20   zRelative);.   
2a8e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2a8f0 4b 3b 0a 20 20 7d 0a 20 20 7a 43 6f 6e 76 65 72  K;.  }.  zConver
2a900 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72 74  ted = winConvert
2a910 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d 65  FromUtf8Filename
2a920 28 7a 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 69  (zRelative);.  i
2a930 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d 3d 30  f( zConverted==0
2a940 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2a950 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
2a960 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
2a970 28 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 20 20  ( osIsNT() ){.  
2a980 20 20 4c 50 57 53 54 52 20 7a 54 65 6d 70 3b 0a    LPWSTR zTemp;.
2a990 20 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65      nByte = osGe
2a9a0 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28  tFullPathNameW((
2a9b0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2a9c0 65 64 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ed, 0, 0, 0);.  
2a9d0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
2a9e0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2a9f0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2aa00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 77  ;.      return w
2aa10 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  inLogError(SQLIT
2aa20 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50  E_CANTOPEN_FULLP
2aa30 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74 45 72  ATH, osGetLastEr
2aa40 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20 20 20  ror(),.         
2aa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa60 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65  "winFullPathname
2aa70 31 22 2c 20 7a 52 65 6c 61 74 69 76 65 29 3b 0a  1", zRelative);.
2aa80 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2aa90 2b 3d 20 33 3b 0a 20 20 20 20 7a 54 65 6d 70 20  += 3;.    zTemp 
2aaa0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
2aab0 65 72 6f 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  ero( nByte*sizeo
2aac0 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
2aad0 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
2aae0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2aaf0 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64  _free(zConverted
2ab00 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2ab10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2ab20 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
2ab30 20 20 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74     nByte = osGet
2ab40 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 28 4c  FullPathNameW((L
2ab50 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74 65  PCWSTR)zConverte
2ab60 64 2c 20 6e 42 79 74 65 2c 20 7a 54 65 6d 70 2c  d, nByte, zTemp,
2ab70 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79   0);.    if( nBy
2ab80 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  te==0 ){.      s
2ab90 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e  qlite3_free(zCon
2aba0 76 65 72 74 65 64 29 3b 0a 20 20 20 20 20 20 73  verted);.      s
2abb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d  qlite3_free(zTem
2abc0 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  p);.      return
2abd0 20 77 69 6e 4c 6f 67 45 72 72 6f 72 28 53 51 4c   winLogError(SQL
2abe0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
2abf0 4c 50 41 54 48 2c 20 6f 73 47 65 74 4c 61 73 74  LPATH, osGetLast
2ac00 45 72 72 6f 72 28 29 2c 0a 20 20 20 20 20 20 20  Error(),.       
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 20 22 77 69 6e 46 75 6c 6c 50 61 74 68 6e 61    "winFullPathna
2ac30 6d 65 32 22 2c 20 7a 52 65 6c 61 74 69 76 65 29  me2", zRelative)
2ac40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2ac50 74 65 33 5f 66 72 65 65 28 7a 43 6f 6e 76 65 72  te3_free(zConver
2ac60 74 65 64 29 3b 0a 20 20 20 20 7a 4f 75 74 20 3d  ted);.    zOut =
2ac70 20 77 69 6e 55 6e 69 63 6f 64 65 54 6f 55 74 66   winUnicodeToUtf
2ac80 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 73 71  8(zTemp);.    sq
2ac90 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 65 6d 70  lite3_free(zTemp
2aca0 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51  );.  }.#ifdef SQ
2acb0 4c 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41  LITE_WIN32_HAS_A
2acc0 4e 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  NSI.  else{.    
2acd0 63 68 61 72 20 2a 7a 54 65 6d 70 3b 0a 20 20 20  char *zTemp;.   
2ace0 20 6e 42 79 74 65 20 3d 20 6f 73 47 65 74 46 75   nByte = osGetFu
2acf0 6c 6c 50 61 74 68 4e 61 6d 65 41 28 28 63 68 61  llPathNameA((cha
2ad00 72 2a 29 7a 43 6f 6e 76 65 72 74 65 64 2c 20 30  r*)zConverted, 0
2ad10 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
2ad20 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
2ad30 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2ad40 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20 20  zConverted);.   
2ad50 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2ad60 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2ad70 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2ad80 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2ad90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ada0 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2adb0 75 6c 6c 50 61 74 68 6e 61 6d 65 33 22 2c 20 7a  ullPathname3", z
2adc0 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2add0 0a 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 33 3b  .    nByte += 3;
2ade0 0a 20 20 20 20 7a 54 65 6d 70 20 3d 20 73 71 6c  .    zTemp = sql
2adf0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
2ae00 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a 54 65  nByte*sizeof(zTe
2ae10 6d 70 5b 30 5d 29 20 29 3b 0a 20 20 20 20 69 66  mp[0]) );.    if
2ae20 28 20 7a 54 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  ( zTemp==0 ){.  
2ae30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2ae40 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2ae50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ae60 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b  E_IOERR_NOMEM_BK
2ae70 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42  PT;.    }.    nB
2ae80 79 74 65 20 3d 20 6f 73 47 65 74 46 75 6c 6c 50  yte = osGetFullP
2ae90 61 74 68 4e 61 6d 65 41 28 28 63 68 61 72 2a 29  athNameA((char*)
2aea0 7a 43 6f 6e 76 65 72 74 65 64 2c 20 6e 42 79 74  zConverted, nByt
2aeb0 65 2c 20 7a 54 65 6d 70 2c 20 30 29 3b 0a 20 20  e, zTemp, 0);.  
2aec0 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
2aed0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2aee0 66 72 65 65 28 7a 43 6f 6e 76 65 72 74 65 64 29  free(zConverted)
2aef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2af00 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  free(zTemp);.   
2af10 20 20 20 72 65 74 75 72 6e 20 77 69 6e 4c 6f 67     return winLog
2af20 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2af30 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 2c 20  TOPEN_FULLPATH, 
2af40 6f 73 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  osGetLastError()
2af50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2af60 20 20 20 20 20 20 20 20 20 20 20 22 77 69 6e 46             "winF
2af70 75 6c 6c 50 61 74 68 6e 61 6d 65 34 22 2c 20 7a  ullPathname4", z
2af80 52 65 6c 61 74 69 76 65 29 3b 0a 20 20 20 20 7d  Relative);.    }
2af90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2afa0 65 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20  e(zConverted);. 
2afb0 20 20 20 7a 4f 75 74 20 3d 20 77 69 6e 4d 62 63     zOut = winMbc
2afc0 73 54 6f 55 74 66 38 28 7a 54 65 6d 70 2c 20 6f  sToUtf8(zTemp, o
2afd0 73 41 72 65 46 69 6c 65 41 70 69 73 41 4e 53 49  sAreFileApisANSI
2afe0 28 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ());.    sqlite3
2aff0 5f 66 72 65 65 28 7a 54 65 6d 70 29 3b 0a 20 20  _free(zTemp);.  
2b000 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 7a  }.#endif.  if( z
2b010 4f 75 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Out ){.    sqlit
2b020 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 49 4e 28  e3_snprintf(MIN(
2b030 6e 46 75 6c 6c 2c 20 70 56 66 73 2d 3e 6d 78 50  nFull, pVfs->mxP
2b040 61 74 68 6e 61 6d 65 29 2c 20 7a 46 75 6c 6c 2c  athname), zFull,
2b050 20 22 25 73 22 2c 20 7a 4f 75 74 29 3b 0a 20 20   "%s", zOut);.  
2b060 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b070 4f 75 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Out);.    return
2b080 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
2b090 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2b0a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
2b0b0 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e  EM_BKPT;.  }.#en
2b0c0 64 69 66 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  dif.}..#ifndef S
2b0d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2b0e0 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20  EXTENSION./*.** 
2b0f0 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20 6f  Interfaces for o
2b100 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64 20  pening a shared 
2b110 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e 67  library, finding
2b120 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a   entry points.**
2b130 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61 72   within the shar
2b140 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64 20  ed library, and 
2b150 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61 72  closing the shar
2b160 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 73  ed library..*/.s
2b170 74 61 74 69 63 20 76 6f 69 64 20 2a 77 69 6e 44  tatic void *winD
2b180 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66  lOpen(sqlite3_vf
2b190 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63  s *pVfs, const c
2b1a0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
2b1b0 0a 20 20 48 41 4e 44 4c 45 20 68 3b 0a 23 69 66  .  HANDLE h;.#if
2b1c0 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57 49   defined(__CYGWI
2b1d0 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 46 75 6c 6c  N__).  int nFull
2b1e0 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
2b1f0 61 6d 65 2b 31 3b 0a 20 20 63 68 61 72 20 2a 7a  ame+1;.  char *z
2b200 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  Full = sqlite3Ma
2b210 6c 6c 6f 63 5a 65 72 6f 28 20 6e 46 75 6c 6c 20  llocZero( nFull 
2b220 29 3b 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76  );.  void *zConv
2b230 65 72 74 65 64 20 3d 20 30 3b 0a 20 20 69 66 28  erted = 0;.  if(
2b240 20 7a 46 75 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20   zFull==0 ){.   
2b250 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50 45   OSTRACE(("DLOPE
2b260 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64 6c  N name=%s, handl
2b270 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e 61  e=%p\n", zFilena
2b280 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b 0a  me, (void*)0));.
2b290 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2b2a0 7d 0a 20 20 69 66 28 20 77 69 6e 46 75 6c 6c 50  }.  if( winFullP
2b2b0 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46  athname(pVfs, zF
2b2c0 69 6c 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 2c 20  ilename, nFull, 
2b2d0 7a 46 75 6c 6c 29 21 3d 53 51 4c 49 54 45 5f 4f  zFull)!=SQLITE_O
2b2e0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
2b2f0 5f 66 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 20 20  _free(zFull);.  
2b300 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f 50    OSTRACE(("DLOP
2b310 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e 64  EN name=%s, hand
2b320 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65 6e  le=%p\n", zFilen
2b330 61 6d 65 2c 20 28 76 6f 69 64 2a 29 30 29 29 3b  ame, (void*)0));
2b340 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2b350 20 7d 0a 20 20 7a 43 6f 6e 76 65 72 74 65 64 20   }.  zConverted 
2b360 3d 20 77 69 6e 43 6f 6e 76 65 72 74 46 72 6f 6d  = winConvertFrom
2b370 55 74 66 38 46 69 6c 65 6e 61 6d 65 28 7a 46 75  Utf8Filename(zFu
2b380 6c 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ll);.  sqlite3_f
2b390 72 65 65 28 7a 46 75 6c 6c 29 3b 0a 23 65 6c 73  ree(zFull);.#els
2b3a0 65 0a 20 20 76 6f 69 64 20 2a 7a 43 6f 6e 76 65  e.  void *zConve
2b3b0 72 74 65 64 20 3d 20 77 69 6e 43 6f 6e 76 65 72  rted = winConver
2b3c0 74 46 72 6f 6d 55 74 66 38 46 69 6c 65 6e 61 6d  tFromUtf8Filenam
2b3d0 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
2b3e0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b3f0 28 70 56 66 73 29 3b 0a 23 65 6e 64 69 66 0a 20  (pVfs);.#endif. 
2b400 20 69 66 28 20 7a 43 6f 6e 76 65 72 74 65 64 3d   if( zConverted=
2b410 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  =0 ){.    OSTRAC
2b420 45 28 28 22 44 4c 4f 50 45 4e 20 6e 61 6d 65 3d  E(("DLOPEN name=
2b430 25 73 2c 20 68 61 6e 64 6c 65 3d 25 70 5c 6e 22  %s, handle=%p\n"
2b440 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 76 6f  , zFilename, (vo
2b450 69 64 2a 29 30 29 29 3b 0a 20 20 20 20 72 65 74  id*)0));.    ret
2b460 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
2b470 20 6f 73 49 73 4e 54 28 29 20 29 7b 0a 23 69 66   osIsNT() ){.#if
2b480 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54   SQLITE_OS_WINRT
2b490 0a 20 20 20 20 68 20 3d 20 6f 73 4c 6f 61 64 50  .    h = osLoadP
2b4a0 61 63 6b 61 67 65 64 4c 69 62 72 61 72 79 28 28  ackagedLibrary((
2b4b0 4c 50 43 57 53 54 52 29 7a 43 6f 6e 76 65 72 74  LPCWSTR)zConvert
2b4c0 65 64 2c 20 30 29 3b 0a 23 65 6c 73 65 0a 20 20  ed, 0);.#else.  
2b4d0 20 20 68 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72    h = osLoadLibr
2b4e0 61 72 79 57 28 28 4c 50 43 57 53 54 52 29 7a 43  aryW((LPCWSTR)zC
2b4f0 6f 6e 76 65 72 74 65 64 29 3b 0a 23 65 6e 64 69  onverted);.#endi
2b500 66 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c  f.  }.#ifdef SQL
2b510 49 54 45 5f 57 49 4e 33 32 5f 48 41 53 5f 41 4e  ITE_WIN32_HAS_AN
2b520 53 49 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 68  SI.  else{.    h
2b530 20 3d 20 6f 73 4c 6f 61 64 4c 69 62 72 61 72 79   = osLoadLibrary
2b540 41 28 28 63 68 61 72 2a 29 7a 43 6f 6e 76 65 72  A((char*)zConver
2b550 74 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ted);.  }.#endif
2b560 0a 20 20 4f 53 54 52 41 43 45 28 28 22 44 4c 4f  .  OSTRACE(("DLO
2b570 50 45 4e 20 6e 61 6d 65 3d 25 73 2c 20 68 61 6e  PEN name=%s, han
2b580 64 6c 65 3d 25 70 5c 6e 22 2c 20 7a 46 69 6c 65  dle=%p\n", zFile
2b590 6e 61 6d 65 2c 20 28 76 6f 69 64 2a 29 68 29 29  name, (void*)h))
2b5a0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
2b5b0 28 7a 43 6f 6e 76 65 72 74 65 64 29 3b 0a 20 20  (zConverted);.  
2b5c0 72 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 68 3b  return (void*)h;
2b5d0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  .}.static void w
2b5e0 69 6e 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  inDlError(sqlite
2b5f0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2b600 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2b610 66 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  fOut){.  UNUSED_
2b620 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2b630 0a 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72 72  .  winGetLastErr
2b640 6f 72 4d 73 67 28 6f 73 47 65 74 4c 61 73 74 45  orMsg(osGetLastE
2b650 72 72 6f 72 28 29 2c 20 6e 42 75 66 2c 20 7a 42  rror(), nBuf, zB
2b660 75 66 4f 75 74 29 3b 0a 7d 0a 73 74 61 74 69 63  ufOut);.}.static
2b670 20 76 6f 69 64 20 28 2a 77 69 6e 44 6c 53 79 6d   void (*winDlSym
2b680 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
2b690 66 73 2c 76 6f 69 64 20 2a 70 48 2c 63 6f 6e 73  fs,void *pH,cons
2b6a0 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28 76  t char *zSym))(v
2b6b0 6f 69 64 29 7b 0a 20 20 46 41 52 50 52 4f 43 20  oid){.  FARPROC 
2b6c0 70 72 6f 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  proc;.  UNUSED_P
2b6d0 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b 0a  ARAMETER(pVfs);.
2b6e0 20 20 70 72 6f 63 20 3d 20 6f 73 47 65 74 50 72    proc = osGetPr
2b6f0 6f 63 41 64 64 72 65 73 73 41 28 28 48 41 4e 44  ocAddressA((HAND
2b700 4c 45 29 70 48 2c 20 7a 53 79 6d 29 3b 0a 20 20  LE)pH, zSym);.  
2b710 4f 53 54 52 41 43 45 28 28 22 44 4c 53 59 4d 20  OSTRACE(("DLSYM 
2b720 68 61 6e 64 6c 65 3d 25 70 2c 20 73 79 6d 62 6f  handle=%p, symbo
2b730 6c 3d 25 73 2c 20 61 64 64 72 65 73 73 3d 25 70  l=%s, address=%p
2b740 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2b750 28 76 6f 69 64 2a 29 70 48 2c 20 7a 53 79 6d 2c  (void*)pH, zSym,
2b760 20 28 76 6f 69 64 2a 29 70 72 6f 63 29 29 3b 0a   (void*)proc));.
2b770 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 28 2a    return (void(*
2b780 29 28 76 6f 69 64 29 29 70 72 6f 63 3b 0a 7d 0a  )(void))proc;.}.
2b790 73 74 61 74 69 63 20 76 6f 69 64 20 77 69 6e 44  static void winD
2b7a0 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
2b7b0 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
2b7c0 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53  pHandle){.  UNUS
2b7d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
2b7e0 73 29 3b 0a 20 20 6f 73 46 72 65 65 4c 69 62 72  s);.  osFreeLibr
2b7f0 61 72 79 28 28 48 41 4e 44 4c 45 29 70 48 61 6e  ary((HANDLE)pHan
2b800 64 6c 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  dle);.  OSTRACE(
2b810 28 22 44 4c 43 4c 4f 53 45 20 68 61 6e 64 6c 65  ("DLCLOSE handle
2b820 3d 25 70 5c 6e 22 2c 20 28 76 6f 69 64 2a 29 70  =%p\n", (void*)p
2b830 48 61 6e 64 6c 65 29 29 3b 0a 7d 0a 23 65 6c 73  Handle));.}.#els
2b840 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
2b850 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
2b860 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
2b870 2f 0a 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44  /.  #define winD
2b880 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
2b890 6e 65 20 77 69 6e 44 6c 45 72 72 6f 72 20 30 0a  ne winDlError 0.
2b8a0 20 20 23 64 65 66 69 6e 65 20 77 69 6e 44 6c 53    #define winDlS
2b8b0 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
2b8c0 20 77 69 6e 44 6c 43 6c 6f 73 65 20 30 0a 23 65   winDlClose 0.#e
2b8d0 6e 64 69 66 0a 0a 2f 2a 20 53 74 61 74 65 20 69  ndif../* State i
2b8e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
2b8f0 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 67 61  he randomness ga
2b900 74 68 65 72 65 72 2e 20 2a 2f 0a 74 79 70 65 64  therer. */.typed
2b910 65 66 20 73 74 72 75 63 74 20 45 6e 74 72 6f 70  ef struct Entrop
2b920 79 47 61 74 68 65 72 65 72 20 45 6e 74 72 6f 70  yGatherer Entrop
2b930 79 47 61 74 68 65 72 65 72 3b 0a 73 74 72 75 63  yGatherer;.struc
2b940 74 20 45 6e 74 72 6f 70 79 47 61 74 68 65 72 65  t EntropyGathere
2b950 72 20 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  r {.  unsigned c
2b960 68 61 72 20 2a 61 3b 20 20 20 2f 2a 20 47 61 74  har *a;   /* Gat
2b970 68 65 72 20 65 6e 74 72 6f 70 79 20 69 6e 74 6f  her entropy into
2b980 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
2b990 20 20 69 6e 74 20 6e 61 3b 20 20 20 20 20 20 20    int na;       
2b9a0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2b9b0 20 61 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f   a[] in bytes */
2b9c0 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
2b9d0 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6e 65         /* XOR ne
2b9e0 78 74 20 69 6e 70 75 74 20 69 6e 74 6f 20 61 5b  xt input into a[
2b9f0 69 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 58 6f 72  i] */.  int nXor
2ba00 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
2ba10 75 6d 62 65 72 20 6f 66 20 58 4f 52 20 6f 70 65  umber of XOR ope
2ba20 72 61 74 69 6f 6e 73 20 64 6f 6e 65 20 2a 2f 0a  rations done */.
2ba30 7d 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  };..#if !defined
2ba40 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
2ba50 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
2ba60 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
2ba70 29 0a 2f 2a 20 4d 69 78 20 73 7a 20 62 79 74 65  )./* Mix sz byte
2ba80 73 20 6f 66 20 65 6e 74 72 6f 70 79 20 69 6e 74  s of entropy int
2ba90 6f 20 70 2e 20 2a 2f 0a 73 74 61 74 69 63 20 76  o p. */.static v
2baa0 6f 69 64 20 78 6f 72 4d 65 6d 6f 72 79 28 45 6e  oid xorMemory(En
2bab0 74 72 6f 70 79 47 61 74 68 65 72 65 72 20 2a 70  tropyGatherer *p
2bac0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
2bad0 2a 78 2c 20 69 6e 74 20 73 7a 29 7b 0a 20 20 69  *x, int sz){.  i
2bae0 6e 74 20 6a 2c 20 6b 3b 0a 20 20 66 6f 72 28 6a  nt j, k;.  for(j
2baf0 3d 30 2c 20 6b 3d 70 2d 3e 69 3b 20 6a 3c 73 7a  =0, k=p->i; j<sz
2bb00 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; j++){.    p->a
2bb10 5b 6b 2b 2b 5d 20 5e 3d 20 78 5b 6a 5d 3b 0a 20  [k++] ^= x[j];. 
2bb20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e 6e 61 20     if( k>=p->na 
2bb30 29 20 6b 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  ) k = 0;.  }.  p
2bb40 2d 3e 69 20 3d 20 6b 3b 0a 20 20 70 2d 3e 6e 58  ->i = k;.  p->nX
2bb50 6f 72 20 2b 3d 20 73 7a 3b 0a 7d 0a 23 65 6e 64  or += sz;.}.#end
2bb60 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2bb70 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 21  QLITE_TEST) && !
2bb80 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
2bb90 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29 20  MIT_RANDOMNESS) 
2bba0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  */../*.** Write 
2bbb0 75 70 20 74 6f 20 6e 42 75 66 20 62 79 74 65 73  up to nBuf bytes
2bbc0 20 6f 66 20 72 61 6e 64 6f 6d 6e 65 73 73 20 69   of randomness i
2bbd0 6e 74 6f 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  nto zBuf..*/.sta
2bbe0 74 69 63 20 69 6e 74 20 77 69 6e 52 61 6e 64 6f  tic int winRando
2bbf0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
2bc00 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75  s *pVfs, int nBu
2bc10 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
2bc20 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2bc30 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
2bc40 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2bc50 52 41 4e 44 4f 4d 4e 45 53 53 29 0a 20 20 55 4e  RANDOMNESS).  UN
2bc60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
2bc70 56 66 73 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a  Vfs);.  memset(z
2bc80 42 75 66 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 20  Buf, 0, nBuf);. 
2bc90 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 23 65   return nBuf;.#e
2bca0 6c 73 65 0a 20 20 45 6e 74 72 6f 70 79 47 61 74  lse.  EntropyGat
2bcb0 68 65 72 65 72 20 65 3b 0a 20 20 55 4e 55 53 45  herer e;.  UNUSE
2bcc0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73  D_PARAMETER(pVfs
2bcd0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  );.  memset(zBuf
2bce0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
2bcf0 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52  defined(_MSC_VER
2bd00 29 20 26 26 20 5f 4d 53 43 5f 56 45 52 3e 3d 31  ) && _MSC_VER>=1
2bd10 34 30 30 20 26 26 20 21 53 51 4c 49 54 45 5f 4f  400 && !SQLITE_O
2bd20 53 5f 57 49 4e 43 45 0a 20 20 72 61 6e 64 5f 73  S_WINCE.  rand_s
2bd30 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 2a 29  ((unsigned int*)
2bd40 7a 42 75 66 29 3b 20 2f 2a 20 72 61 6e 64 5f 73  zBuf); /* rand_s
2bd50 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  () is not availa
2bd60 62 6c 65 20 77 69 74 68 20 4d 69 6e 47 57 20 2a  ble with MinGW *
2bd70 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  /.#endif /* defi
2bd80 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 20 26 26  ned(_MSC_VER) &&
2bd90 20 5f 4d 53 43 5f 56 45 52 3e 3d 31 34 30 30 20   _MSC_VER>=1400 
2bda0 2a 2f 0a 20 20 65 2e 61 20 3d 20 28 75 6e 73 69  */.  e.a = (unsi
2bdb0 67 6e 65 64 20 63 68 61 72 2a 29 7a 42 75 66 3b  gned char*)zBuf;
2bdc0 0a 20 20 65 2e 6e 61 20 3d 20 6e 42 75 66 3b 0a  .  e.na = nBuf;.
2bdd0 20 20 65 2e 6e 58 6f 72 20 3d 20 30 3b 0a 20 20    e.nXor = 0;.  
2bde0 65 2e 69 20 3d 20 30 3b 0a 20 20 7b 0a 20 20 20  e.i = 0;.  {.   
2bdf0 20 53 59 53 54 45 4d 54 49 4d 45 20 78 3b 0a 20   SYSTEMTIME x;. 
2be00 20 20 20 6f 73 47 65 74 53 79 73 74 65 6d 54 69     osGetSystemTi
2be10 6d 65 28 26 78 29 3b 0a 20 20 20 20 78 6f 72 4d  me(&x);.    xorM
2be20 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2be30 6e 65 64 20 63 68 61 72 2a 29 26 78 2c 20 73 69  ned char*)&x, si
2be40 7a 65 6f 66 28 53 59 53 54 45 4d 54 49 4d 45 29  zeof(SYSTEMTIME)
2be50 29 3b 0a 20 20 7d 0a 20 20 7b 0a 20 20 20 20 44  );.  }.  {.    D
2be60 57 4f 52 44 20 70 69 64 20 3d 20 6f 73 47 65 74  WORD pid = osGet
2be70 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 49 64  CurrentProcessId
2be80 28 29 3b 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72  ();.    xorMemor
2be90 79 28 26 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  y(&e, (unsigned 
2bea0 63 68 61 72 2a 29 26 70 69 64 2c 20 73 69 7a 65  char*)&pid, size
2beb0 6f 66 28 44 57 4f 52 44 29 29 3b 0a 20 20 7d 0a  of(DWORD));.  }.
2bec0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2bed0 4e 52 54 0a 20 20 7b 0a 20 20 20 20 55 4c 4f 4e  NRT.  {.    ULON
2bee0 47 4c 4f 4e 47 20 63 6e 74 20 3d 20 6f 73 47 65  GLONG cnt = osGe
2bef0 74 54 69 63 6b 43 6f 75 6e 74 36 34 28 29 3b 0a  tTickCount64();.
2bf00 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65      xorMemory(&e
2bf10 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2bf20 2a 29 26 63 6e 74 2c 20 73 69 7a 65 6f 66 28 55  *)&cnt, sizeof(U
2bf30 4c 4f 4e 47 4c 4f 4e 47 29 29 3b 0a 20 20 7d 0a  LONGLONG));.  }.
2bf40 23 65 6c 73 65 0a 20 20 7b 0a 20 20 20 20 44 57  #else.  {.    DW
2bf50 4f 52 44 20 63 6e 74 20 3d 20 6f 73 47 65 74 54  ORD cnt = osGetT
2bf60 69 63 6b 43 6f 75 6e 74 28 29 3b 0a 20 20 20 20  ickCount();.    
2bf70 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c 20 28 75  xorMemory(&e, (u
2bf80 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 63  nsigned char*)&c
2bf90 6e 74 2c 20 73 69 7a 65 6f 66 28 44 57 4f 52 44  nt, sizeof(DWORD
2bfa0 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ));.  }.#endif /
2bfb0 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52  * SQLITE_OS_WINR
2bfc0 54 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 4c 41 52  T */.  {.    LAR
2bfd0 47 45 5f 49 4e 54 45 47 45 52 20 69 3b 0a 20 20  GE_INTEGER i;.  
2bfe0 20 20 6f 73 51 75 65 72 79 50 65 72 66 6f 72 6d    osQueryPerform
2bff0 61 6e 63 65 43 6f 75 6e 74 65 72 28 26 69 29 3b  anceCounter(&i);
2c000 0a 20 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26  .    xorMemory(&
2c010 65 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e, (unsigned cha
2c020 72 2a 29 26 69 2c 20 73 69 7a 65 6f 66 28 4c 41  r*)&i, sizeof(LA
2c030 52 47 45 5f 49 4e 54 45 47 45 52 29 29 3b 0a 20  RGE_INTEGER));. 
2c040 20 7d 0a 23 69 66 20 21 53 51 4c 49 54 45 5f 4f   }.#if !SQLITE_O
2c050 53 5f 57 49 4e 43 45 20 26 26 20 21 53 51 4c 49  S_WINCE && !SQLI
2c060 54 45 5f 4f 53 5f 57 49 4e 52 54 20 26 26 20 53  TE_OS_WINRT && S
2c070 51 4c 49 54 45 5f 57 49 4e 33 32 5f 55 53 45 5f  QLITE_WIN32_USE_
2c080 55 55 49 44 0a 20 20 7b 0a 20 20 20 20 55 55 49  UUID.  {.    UUI
2c090 44 20 69 64 3b 0a 20 20 20 20 6d 65 6d 73 65 74  D id;.    memset
2c0a0 28 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&id, 0, sizeof(
2c0b0 55 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75  UUID));.    osUu
2c0c0 69 64 43 72 65 61 74 65 28 26 69 64 29 3b 0a 20  idCreate(&id);. 
2c0d0 20 20 20 78 6f 72 4d 65 6d 6f 72 79 28 26 65 2c     xorMemory(&e,
2c0e0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
2c0f0 29 26 69 64 2c 20 73 69 7a 65 6f 66 28 55 55 49  )&id, sizeof(UUI
2c100 44 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  D));.    memset(
2c110 26 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55  &id, 0, sizeof(U
2c120 55 49 44 29 29 3b 0a 20 20 20 20 6f 73 55 75 69  UID));.    osUui
2c130 64 43 72 65 61 74 65 53 65 71 75 65 6e 74 69 61  dCreateSequentia
2c140 6c 28 26 69 64 29 3b 0a 20 20 20 20 78 6f 72 4d  l(&id);.    xorM
2c150 65 6d 6f 72 79 28 26 65 2c 20 28 75 6e 73 69 67  emory(&e, (unsig
2c160 6e 65 64 20 63 68 61 72 2a 29 26 69 64 2c 20 73  ned char*)&id, s
2c170 69 7a 65 6f 66 28 55 55 49 44 29 29 3b 0a 20 20  izeof(UUID));.  
2c180 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
2c190 49 54 45 5f 4f 53 5f 57 49 4e 43 45 20 26 26 20  ITE_OS_WINCE && 
2c1a0 21 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 52 54  !SQLITE_OS_WINRT
2c1b0 20 26 26 20 53 51 4c 49 54 45 5f 57 49 4e 33 32   && SQLITE_WIN32
2c1c0 5f 55 53 45 5f 55 55 49 44 20 2a 2f 0a 20 20 72  _USE_UUID */.  r
2c1d0 65 74 75 72 6e 20 65 2e 6e 58 6f 72 3e 6e 42 75  eturn e.nXor>nBu
2c1e0 66 20 3f 20 6e 42 75 66 20 3a 20 65 2e 6e 58 6f  f ? nBuf : e.nXo
2c1f0 72 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  r;.#endif /* def
2c200 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
2c210 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
2c220 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
2c230 45 53 53 29 20 2a 2f 0a 7d 0a 0a 0a 2f 2a 0a 2a  ESS) */.}.../*.*
2c240 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
2c250 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
2c260 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
2c270 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
2c280 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 53  .static int winS
2c290 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
2c2a0 20 2a 70 56 66 73 2c 20 69 6e 74 20 6d 69 63 72   *pVfs, int micr
2c2b0 6f 73 65 63 29 7b 0a 20 20 73 71 6c 69 74 65 33  osec){.  sqlite3
2c2c0 5f 77 69 6e 33 32 5f 73 6c 65 65 70 28 28 6d 69  _win32_sleep((mi
2c2d0 63 72 6f 73 65 63 2b 39 39 39 29 2f 31 30 30 30  crosec+999)/1000
2c2e0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2c2f0 4d 45 54 45 52 28 70 56 66 73 29 3b 0a 20 20 72  METER(pVfs);.  r
2c300 65 74 75 72 6e 20 28 28 6d 69 63 72 6f 73 65 63  eturn ((microsec
2c310 2b 39 39 39 29 2f 31 30 30 30 29 2a 31 30 30 30  +999)/1000)*1000
2c320 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
2c330 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
2c340 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
2c350 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
2c360 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2c370 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
2c380 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
2c390 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
2c3a0 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
2c3b0 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
2c3c0 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
2c3d0 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
2c3e0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2c3f0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
2c400 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
2c410 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
2c420 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
2c430 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
2c440 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
2c450 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
2c460 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
2c470 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
2c480 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
2c490 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
2c4a0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
2c4b0 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
2c4c0 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
2c4d0 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
2c4e0 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
2c4f0 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
2c500 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
2c510 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
2c520 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
2c530 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
2c540 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
2c550 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
2c560 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
2c570 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
2c580 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
2c590 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
2c5a0 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
2c5b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
2c5c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
2c5d0 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
2c5e0 20 61 6e 64 20 64 61 74 65 0a 2a 2a 20 63 61 6e   and date.** can
2c5f0 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
2c600 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
2c610 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28  urrentTimeInt64(
2c620 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2c630 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  s, sqlite3_int64
2c640 20 2a 70 69 4e 6f 77 29 7b 0a 20 20 2f 2a 20 46   *piNow){.  /* F
2c650 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75 72  ILETIME structur
2c660 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76 61  e is a 64-bit va
2c670 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e 67  lue representing
2c680 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
2c690 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f      100-nanoseco
2c6a0 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e  nd intervals sin
2c6b0 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36  ce January 1, 16
2c6c0 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33  01 (= JD 2305813
2c6d0 2e 35 29 2e 0a 20 20 2a 2f 0a 20 20 46 49 4c 45  .5)..  */.  FILE
2c6e0 54 49 4d 45 20 66 74 3b 0a 20 20 73 74 61 74 69  TIME ft;.  stati
2c6f0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2c700 69 6e 74 36 34 20 77 69 6e 46 69 6c 65 74 69 6d  int64 winFiletim
2c710 65 45 70 6f 63 68 20 3d 20 32 33 30 35 38 31 33  eEpoch = 2305813
2c720 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
2c730 29 38 36 34 30 30 30 30 3b 0a 23 69 66 64 65 66  )8640000;.#ifdef
2c740 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
2c750 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2c760 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45 70  te3_int64 unixEp
2c770 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a 28  och = 24405875*(
2c780 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38 36  sqlite3_int64)86
2c790 34 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a 20 20  40000;.#endif.  
2c7a0 2f 2a 20 32 5e 33 32 20 2d 20 74 6f 20 61 76 6f  /* 2^32 - to avo
2c7b0 69 64 20 75 73 65 20 6f 66 20 4c 4c 20 61 6e 64  id use of LL and
2c7c0 20 77 61 72 6e 69 6e 67 73 20 69 6e 20 67 63 63   warnings in gcc
2c7d0 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
2c7e0 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  st sqlite3_int64
2c7f0 20 6d 61 78 33 32 42 69 74 56 61 6c 75 65 20 3d   max32BitValue =
2c800 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  .      (sqlite3_
2c810 69 6e 74 36 34 29 32 30 30 30 30 30 30 30 30 30  int64)2000000000
2c820 20 2b 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   + (sqlite3_int6
2c830 34 29 32 30 30 30 30 30 30 30 30 30 20 2b 0a 20  4)2000000000 +. 
2c840 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e       (sqlite3_in
2c850 74 36 34 29 32 39 34 39 36 37 32 39 36 3b 0a 0a  t64)294967296;..
2c860 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2c870 4e 43 45 0a 20 20 53 59 53 54 45 4d 54 49 4d 45  NCE.  SYSTEMTIME
2c880 20 74 69 6d 65 3b 0a 20 20 6f 73 47 65 74 53 79   time;.  osGetSy
2c890 73 74 65 6d 54 69 6d 65 28 26 74 69 6d 65 29 3b  stemTime(&time);
2c8a0 0a 20 20 2f 2a 20 69 66 20 53 79 73 74 65 6d 54  .  /* if SystemT
2c8b0 69 6d 65 54 6f 46 69 6c 65 54 69 6d 65 28 29 20  imeToFileTime() 
2c8c0 66 61 69 6c 73 2c 20 69 74 20 72 65 74 75 72 6e  fails, it return
2c8d0 73 20 7a 65 72 6f 2e 20 2a 2f 0a 20 20 69 66 20  s zero. */.  if 
2c8e0 28 21 6f 73 53 79 73 74 65 6d 54 69 6d 65 54 6f  (!osSystemTimeTo
2c8f0 46 69 6c 65 54 69 6d 65 28 26 74 69 6d 65 2c 26  FileTime(&time,&
2c900 66 74 29 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ft)){.    return
2c910 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2c920 20 7d 0a 23 65 6c 73 65 0a 20 20 6f 73 47 65 74   }.#else.  osGet
2c930 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
2c940 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 23 65 6e  Time( &ft );.#en
2c950 64 69 66 0a 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  dif..  *piNow = 
2c960 77 69 6e 46 69 6c 65 74 69 6d 65 45 70 6f 63 68  winFiletimeEpoch
2c970 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28   +.            (
2c980 28 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  (((sqlite3_int64
2c990 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
2c9a0 6d 65 29 2a 6d 61 78 33 32 42 69 74 56 61 6c 75  me)*max32BitValu
2c9b0 65 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20  e) +.           
2c9c0 20 20 20 20 28 73 71 6c 69 74 65 33 5f 69 6e 74      (sqlite3_int
2c9d0 36 34 29 66 74 2e 64 77 4c 6f 77 44 61 74 65 54  64)ft.dwLowDateT
2c9e0 69 6d 65 29 2f 28 73 71 6c 69 74 65 33 5f 69 6e  ime)/(sqlite3_in
2c9f0 74 36 34 29 31 30 30 30 30 3b 0a 0a 23 69 66 64  t64)10000;..#ifd
2ca00 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2ca10 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
2ca20 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
2ca30 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28   *piNow = 1000*(
2ca40 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71  sqlite3_int64)sq
2ca50 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69  lite3_current_ti
2ca60 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  me + unixEpoch;.
2ca70 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55    }.#endif.  UNU
2ca80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
2ca90 66 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  fs);.  return SQ
2caa0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2cab0 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
2cac0 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
2cad0 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
2cae0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
2caf0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
2cb00 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
2cb10 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
2cb20 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
2cb30 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
2cb40 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
2cb50 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
2cb60 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
2cb70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2cb80 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71  inCurrentTime(sq
2cb90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
2cba0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
2cbb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
2cbc0 69 74 65 33 5f 69 6e 74 36 34 20 69 3b 0a 20 20  ite3_int64 i;.  
2cbd0 72 63 20 3d 20 77 69 6e 43 75 72 72 65 6e 74 54  rc = winCurrentT
2cbe0 69 6d 65 49 6e 74 36 34 28 70 56 66 73 2c 20 26  imeInt64(pVfs, &
2cbf0 69 29 3b 0a 20 20 69 66 28 20 21 72 63 20 29 7b  i);.  if( !rc ){
2cc00 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  .    *prNow = i/
2cc10 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 7d 0a  86400000.0;.  }.
2cc20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2cc30 2f 2a 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 69  /*.** The idea i
2cc40 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
2cc50 74 69 6f 6e 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tion works like 
2cc60 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  a combination of
2cc70 0a 2a 2a 20 47 65 74 4c 61 73 74 45 72 72 6f 72  .** GetLastError
2cc80 28 29 20 61 6e 64 20 46 6f 72 6d 61 74 4d 65 73  () and FormatMes
2cc90 73 61 67 65 28 29 20 6f 6e 20 57 69 6e 64 6f 77  sage() on Window
2cca0 73 20 28 6f 72 20 65 72 72 6e 6f 20 61 6e 64 0a  s (or errno and.
2ccb0 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ** strerror_r() 
2ccc0 6f 6e 20 55 6e 69 78 29 2e 20 41 66 74 65 72 20  on Unix). After 
2ccd0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
2cce0 72 6e 65 64 20 62 79 20 61 6e 20 4f 53 0a 2a 2a  rned by an OS.**
2ccf0 20 66 75 6e 63 74 69 6f 6e 2c 20 53 51 4c 69 74   function, SQLit
2cd00 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
2cd10 63 74 69 6f 6e 20 77 69 74 68 20 7a 42 75 66 20  ction with zBuf 
2cd20 70 6f 69 6e 74 69 6e 67 20 74 6f 0a 2a 2a 20 61  pointing to.** a
2cd30 20 62 75 66 66 65 72 20 6f 66 20 6e 42 75 66 20   buffer of nBuf 
2cd40 62 79 74 65 73 2e 20 54 68 65 20 4f 53 20 6c 61  bytes. The OS la
2cd50 79 65 72 20 73 68 6f 75 6c 64 20 70 6f 70 75 6c  yer should popul
2cd60 61 74 65 20 74 68 65 0a 2a 2a 20 62 75 66 66 65  ate the.** buffe
2cd70 72 20 77 69 74 68 20 61 20 6e 75 6c 2d 74 65 72  r with a nul-ter
2cd80 6d 69 6e 61 74 65 64 20 55 54 46 2d 38 20 65 6e  minated UTF-8 en
2cd90 63 6f 64 65 64 20 65 72 72 6f 72 20 6d 65 73 73  coded error mess
2cda0 61 67 65 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  age.** describin
2cdb0 67 20 74 68 65 20 6c 61 73 74 20 49 4f 20 65 72  g the last IO er
2cdc0 72 6f 72 20 74 6f 20 68 61 76 65 20 6f 63 63 75  ror to have occu
2cdd0 72 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  rred within the 
2cde0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 72 65 61  calling.** threa
2cdf0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
2ce00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
2ce10 20 74 6f 6f 20 6c 61 72 67 65 20 66 6f 72 20 74   too large for t
2ce20 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
2ce30 65 72 2c 0a 2a 2a 20 69 74 20 73 68 6f 75 6c 64  er,.** it should
2ce40 20 62 65 20 74 72 75 6e 63 61 74 65 64 2e 20 54   be truncated. T
2ce50 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2ce60 6f 66 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  of xGetLastError
2ce70 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 69 66 20 74  .** is zero if t
2ce80 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
2ce90 20 66 69 74 73 20 69 6e 20 74 68 65 20 62 75 66   fits in the buf
2cea0 66 65 72 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f  fer, or non-zero
2ceb0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 28 69  .** otherwise (i
2cec0 66 20 74 68 65 20 6d 65 73 73 61 67 65 20 77 61  f the message wa
2ced0 73 20 74 72 75 6e 63 61 74 65 64 29 2e 20 49 66  s truncated). If
2cee0 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
2cef0 75 72 6e 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 69  urned,.** then i
2cf00 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
2cf10 72 79 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ry to include th
2cf20 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  e nul-terminator
2cf30 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e   character.** in
2cf40 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
2cf50 65 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 20 73 75  er..**.** Not su
2cf60 70 70 6c 79 69 6e 67 20 61 6e 20 65 72 72 6f 72  pplying an error
2cf70 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 68 61   message will ha
2cf80 76 65 20 6e 6f 20 61 64 76 65 72 73 65 20 65 66  ve no adverse ef
2cf90 66 65 63 74 0a 2a 2a 20 6f 6e 20 53 51 4c 69 74  fect.** on SQLit
2cfa0 65 2e 20 49 74 20 69 73 20 66 69 6e 65 20 74 6f  e. It is fine to
2cfb0 20 68 61 76 65 20 61 6e 20 69 6d 70 6c 65 6d 65   have an impleme
2cfc0 6e 74 61 74 69 6f 6e 20 74 68 61 74 20 6e 65 76  ntation that nev
2cfd0 65 72 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 6e  er.** returns an
2cfe0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 3a 0a   error message:.
2cff0 2a 2a 0a 2a 2a 20 20 20 69 6e 74 20 78 47 65 74  **.**   int xGet
2d000 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69 74 65  LastError(sqlite
2d010 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
2d020 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2d030 66 29 7b 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  f){.**     asser
2d040 74 28 7a 42 75 66 5b 30 5d 3d 3d 27 5c 30 27 29  t(zBuf[0]=='\0')
2d050 3b 0a 2a 2a 20 20 20 20 20 72 65 74 75 72 6e 20  ;.**     return 
2d060 30 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a 2a 2a 20  0;.**   }.**.** 
2d070 48 6f 77 65 76 65 72 20 69 66 20 61 6e 20 65 72  However if an er
2d080 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
2d090 75 70 70 6c 69 65 64 2c 20 69 74 20 77 69 6c 6c  upplied, it will
2d0a0 20 62 65 20 69 6e 63 6f 72 70 6f 72 61 74 65 64   be incorporated
2d0b0 0a 2a 2a 20 62 79 20 73 71 6c 69 74 65 20 69 6e  .** by sqlite in
2d0c0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
2d0d0 73 61 67 65 20 61 76 61 69 6c 61 62 6c 65 20 74  sage available t
2d0e0 6f 20 74 68 65 20 75 73 65 72 20 75 73 69 6e 67  o the user using
2d0f0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  .** sqlite3_errm
2d100 73 67 28 29 2c 20 70 6f 73 73 69 62 6c 79 20 6d  sg(), possibly m
2d110 61 6b 69 6e 67 20 49 4f 20 65 72 72 6f 72 73 20  aking IO errors 
2d120 65 61 73 69 65 72 20 74 6f 20 64 65 62 75 67 2e  easier to debug.
2d130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2d140 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 28 73  inGetLastError(s
2d150 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2d160 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  , int nBuf, char
2d170 20 2a 7a 42 75 66 29 7b 0a 20 20 44 57 4f 52 44   *zBuf){.  DWORD
2d180 20 65 20 3d 20 6f 73 47 65 74 4c 61 73 74 45 72   e = osGetLastEr
2d190 72 6f 72 28 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ror();.  UNUSED_
2d1a0 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29 3b  PARAMETER(pVfs);
2d1b0 0a 20 20 69 66 28 20 6e 42 75 66 3e 30 20 29 20  .  if( nBuf>0 ) 
2d1c0 77 69 6e 47 65 74 4c 61 73 74 45 72 72 6f 72 4d  winGetLastErrorM
2d1d0 73 67 28 65 2c 20 6e 42 75 66 2c 20 7a 42 75 66  sg(e, nBuf, zBuf
2d1e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 3b 0a 7d  );.  return e;.}
2d1f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2d200 7a 65 20 61 6e 64 20 64 65 69 6e 69 74 69 61 6c  ze and deinitial
2d210 69 7a 65 20 74 68 65 20 6f 70 65 72 61 74 69 6e  ize the operatin
2d220 67 20 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61  g system interfa
2d230 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ce..*/.int sqlit
2d240 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69 64 29  e3_os_init(void)
2d250 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
2d260 65 33 5f 76 66 73 20 77 69 6e 56 66 73 20 3d 20  e3_vfs winVfs = 
2d270 7b 0a 20 20 20 20 33 2c 20 20 20 20 20 20 20 20  {.    3,        
2d280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
2d290 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 69  ersion */.    si
2d2a0 7a 65 6f 66 28 77 69 6e 46 69 6c 65 29 2c 20 20  zeof(winFile),  
2d2b0 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a     /* szOsFile *
2d2c0 2f 0a 20 20 20 20 53 51 4c 49 54 45 5f 57 49 4e  /.    SQLITE_WIN
2d2d0 33 32 5f 4d 41 58 5f 50 41 54 48 5f 42 59 54 45  32_MAX_PATH_BYTE
2d2e0 53 2c 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65  S, /* mxPathname
2d2f0 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20 20   */.    0,      
2d300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d310 70 4e 65 78 74 20 2a 2f 0a 20 20 20 20 22 77 69  pNext */.    "wi
2d320 6e 33 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  n32",           
2d330 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20    /* zName */.  
2d340 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
2d350 20 20 20 20 20 20 20 2f 2a 20 70 41 70 70 44 61         /* pAppDa
2d360 74 61 20 2a 2f 0a 20 20 20 20 77 69 6e 4f 70 65  ta */.    winOpe
2d370 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n,             /
2d380 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 77  * xOpen */.    w
2d390 69 6e 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  inDelete,       
2d3a0 20 20 20 20 2f 2a 20 78 44 65 6c 65 74 65 20 2a      /* xDelete *
2d3b0 2f 0a 20 20 20 20 77 69 6e 41 63 63 65 73 73 2c  /.    winAccess,
2d3c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41             /* xA
2d3d0 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 77 69 6e  ccess */.    win
2d3e0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
2d3f0 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
2d400 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 4f  me */.    winDlO
2d410 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pen,           /
2d420 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20  * xDlOpen */.   
2d430 20 77 69 6e 44 6c 45 72 72 6f 72 2c 20 20 20 20   winDlError,    
2d440 20 20 20 20 20 20 2f 2a 20 78 44 6c 45 72 72 6f        /* xDlErro
2d450 72 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 53 79  r */.    winDlSy
2d460 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m,            /*
2d470 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 20 20 77   xDlSym */.    w
2d480 69 6e 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  inDlClose,      
2d490 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f 73 65 20      /* xDlClose 
2d4a0 2a 2f 0a 20 20 20 20 77 69 6e 52 61 6e 64 6f 6d  */.    winRandom
2d4b0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
2d4c0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20  Randomness */.  
2d4d0 20 20 77 69 6e 53 6c 65 65 70 2c 20 20 20 20 20    winSleep,     
2d4e0 20 20 20 20 20 20 20 2f 2a 20 78 53 6c 65 65 70         /* xSleep
2d4f0 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2d500 6e 74 54 69 6d 65 2c 20 20 20 20 20 20 2f 2a 20  ntTime,      /* 
2d510 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a  xCurrentTime */.
2d520 20 20 20 20 77 69 6e 47 65 74 4c 61 73 74 45 72      winGetLastEr
2d530 72 6f 72 2c 20 20 20 20 20 2f 2a 20 78 47 65 74  ror,     /* xGet
2d540 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 20  LastError */.   
2d550 20 77 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 49   winCurrentTimeI
2d560 6e 74 36 34 2c 20 2f 2a 20 78 43 75 72 72 65 6e  nt64, /* xCurren
2d570 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 20 20  tTimeInt64 */.  
2d580 20 20 77 69 6e 53 65 74 53 79 73 74 65 6d 43 61    winSetSystemCa
2d590 6c 6c 2c 20 20 20 20 2f 2a 20 78 53 65 74 53 79  ll,    /* xSetSy
2d5a0 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20  stemCall */.    
2d5b0 77 69 6e 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  winGetSystemCall
2d5c0 2c 20 20 20 20 2f 2a 20 78 47 65 74 53 79 73 74  ,    /* xGetSyst
2d5d0 65 6d 43 61 6c 6c 20 2a 2f 0a 20 20 20 20 77 69  emCall */.    wi
2d5e0 6e 4e 65 78 74 53 79 73 74 65 6d 43 61 6c 6c 2c  nNextSystemCall,
2d5f0 20 20 20 2f 2a 20 78 4e 65 78 74 53 79 73 74 65     /* xNextSyste
2d600 6d 43 61 6c 6c 20 2a 2f 0a 20 20 7d 3b 0a 23 69  mCall */.  };.#i
2d610 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2d620 5f 57 49 4e 33 32 5f 48 41 53 5f 57 49 44 45 29  _WIN32_HAS_WIDE)
2d630 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
2d640 33 5f 76 66 73 20 77 69 6e 4c 6f 6e 67 50 61 74  3_vfs winLongPat
2d650 68 56 66 73 20 3d 20 7b 0a 20 20 20 20 33 2c 20  hVfs = {.    3, 
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d670 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
2d680 0a 20 20 20 20 73 69 7a 65 6f 66 28 77 69 6e 46  .    sizeof(winF
2d690 69 6c 65 29 2c 20 20 20 20 20 2f 2a 20 73 7a 4f  ile),     /* szO
2d6a0 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 53 51 4c  sFile */.    SQL
2d6b0 49 54 45 5f 57 49 4e 4e 54 5f 4d 41 58 5f 50 41  ITE_WINNT_MAX_PA
2d6c0 54 48 5f 42 59 54 45 53 2c 20 2f 2a 20 6d 78 50  TH_BYTES, /* mxP
2d6d0 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 30  athname */.    0
2d6e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d6f0 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
2d700 20 20 20 20 22 77 69 6e 33 32 2d 6c 6f 6e 67 70      "win32-longp
2d710 61 74 68 22 2c 20 20 20 20 2f 2a 20 7a 4e 61 6d  ath",    /* zNam
2d720 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20 20 20  e */.    0,     
2d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d740 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 20   pAppData */.   
2d750 20 77 69 6e 4f 70 65 6e 2c 20 20 20 20 20 20 20   winOpen,       
2d760 20 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a        /* xOpen *
2d770 2f 0a 20 20 20 20 77 69 6e 44 65 6c 65 74 65 2c  /.    winDelete,
2d780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
2d790 65 6c 65 74 65 20 2a 2f 0a 20 20 20 20 77 69 6e  elete */.    win
2d7a0 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20 20  Access,         
2d7b0 20 20 2f 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a    /* xAccess */.
2d7c0 20 20 20 20 77 69 6e 46 75 6c 6c 50 61 74 68 6e      winFullPathn
2d7d0 61 6d 65 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c  ame,     /* xFul
2d7e0 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 20  lPathname */.   
2d7f0 20 77 69 6e 44 6c 4f 70 65 6e 2c 20 20 20 20 20   winDlOpen,     
2d800 20 20 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e        /* xDlOpen
2d810 20 2a 2f 0a 20 20 20 20 77 69 6e 44 6c 45 72 72   */.    winDlErr
2d820 6f 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  or,          /* 
2d830 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20  xDlError */.    
2d840 77 69 6e 44 6c 53 79 6d 2c 20 20 20 20 20 20 20  winDlSym,       
2d850 20 20 20 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a       /* xDlSym *
2d860 2f 0a 20 20 20 20 77 69 6e 44 6c 43 6c 6f 73 65  /.    winDlClose
2d870 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44  ,          /* xD
2d880 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 77 69  lClose */.    wi
2d890 6e 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20  nRandomness,    
2d8a0 20 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73     /* xRandomnes
2d8b0 73 20 2a 2f 0a 20 20 20 20 77 69 6e 53 6c 65 65  s */.    winSlee
2d8c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
2d8d0 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 20 20 77   xSleep */.    w
2d8e0 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 2c 20 20  inCurrentTime,  
2d8f0 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74 54      /* xCurrentT
2d900 69 6d 65 20 2a 2f 0a 20 20 20 20 77 69 6e 47 65  ime */.    winGe
2d910 74 4c 61 73 74 45 72 72 6f 72 2c 20 20 20 20 20  tLastError,     
2d920 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
2d930 20 2a 2f 0a 20 20 20 20 77 69 6e 43 75 72 72 65   */.    winCurre
2d940 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 2f 2a 20  ntTimeInt64, /* 
2d950 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
2d960 34 20 2a 2f 0a 20 20 20 20 77 69 6e 53 65 74 53  4 */.    winSetS
2d970 79 73 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a  ystemCall,    /*
2d980 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 20   xSetSystemCall 
2d990 2a 2f 0a 20 20 20 20 77 69 6e 47 65 74 53 79 73  */.    winGetSys
2d9a0 74 65 6d 43 61 6c 6c 2c 20 20 20 20 2f 2a 20 78  temCall,    /* x
2d9b0 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f  GetSystemCall */
2d9c0 0a 20 20 20 20 77 69 6e 4e 65 78 74 53 79 73 74  .    winNextSyst
2d9d0 65 6d 43 61 6c 6c 2c 20 20 20 2f 2a 20 78 4e 65  emCall,   /* xNe
2d9e0 78 74 53 79 73 74 65 6d 43 61 6c 6c 20 2a 2f 0a  xtSystemCall */.
2d9f0 20 20 7d 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f    };.#endif..  /
2da00 2a 20 44 6f 75 62 6c 65 2d 63 68 65 63 6b 20 74  * Double-check t
2da10 68 61 74 20 74 68 65 20 61 53 79 73 63 61 6c 6c  hat the aSyscall
2da20 5b 5d 20 61 72 72 61 79 20 68 61 73 20 62 65 65  [] array has bee
2da30 6e 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20  n constructed.  
2da40 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 53  ** correctly.  S
2da50 65 65 20 74 69 63 6b 65 74 20 5b 62 62 33 61 38  ee ticket [bb3a8
2da60 36 65 38 39 30 63 38 65 39 36 61 62 5d 20 2a 2f  6e890c8e96ab] */
2da70 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79  .  assert( Array
2da80 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3d 3d  Size(aSyscall)==
2da90 38 30 20 29 3b 0a 0a 20 20 2f 2a 20 67 65 74 20  80 );..  /* get 
2daa0 6d 65 6d 6f 72 79 20 6d 61 70 20 61 6c 6c 6f 63  memory map alloc
2dab0 61 74 69 6f 6e 20 67 72 61 6e 75 6c 61 72 69 74  ation granularit
2dac0 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 77  y */.  memset(&w
2dad0 69 6e 53 79 73 49 6e 66 6f 2c 20 30 2c 20 73 69  inSysInfo, 0, si
2dae0 7a 65 6f 66 28 53 59 53 54 45 4d 5f 49 4e 46 4f  zeof(SYSTEM_INFO
2daf0 29 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  ));.#if SQLITE_O
2db00 53 5f 57 49 4e 52 54 0a 20 20 6f 73 47 65 74 4e  S_WINRT.  osGetN
2db10 61 74 69 76 65 53 79 73 74 65 6d 49 6e 66 6f 28  ativeSystemInfo(
2db20 26 77 69 6e 53 79 73 49 6e 66 6f 29 3b 0a 23 65  &winSysInfo);.#e
2db30 6c 73 65 0a 20 20 6f 73 47 65 74 53 79 73 74 65  lse.  osGetSyste
2db40 6d 49 6e 66 6f 28 26 77 69 6e 53 79 73 49 6e 66  mInfo(&winSysInf
2db50 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  o);.#endif.  ass
2db60 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66 6f 2e  ert( winSysInfo.
2db70 64 77 41 6c 6c 6f 63 61 74 69 6f 6e 47 72 61 6e  dwAllocationGran
2db80 75 6c 61 72 69 74 79 3e 30 20 29 3b 0a 20 20 61  ularity>0 );.  a
2db90 73 73 65 72 74 28 20 77 69 6e 53 79 73 49 6e 66  ssert( winSysInf
2dba0 6f 2e 64 77 50 61 67 65 53 69 7a 65 3e 30 20 29  o.dwPageSize>0 )
2dbb0 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ;..  sqlite3_vfs
2dbc0 5f 72 65 67 69 73 74 65 72 28 26 77 69 6e 56 66  _register(&winVf
2dbd0 73 2c 20 31 29 3b 0a 0a 23 69 66 20 64 65 66 69  s, 1);..#if defi
2dbe0 6e 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32  ned(SQLITE_WIN32
2dbf0 5f 48 41 53 5f 57 49 44 45 29 0a 20 20 73 71 6c  _HAS_WIDE).  sql
2dc00 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
2dc10 72 28 26 77 69 6e 4c 6f 6e 67 50 61 74 68 56 66  r(&winLongPathVf
2dc20 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  s, 0);.#endif.. 
2dc30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2dc40 4b 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  K;.}..int sqlite
2dc50 33 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 0a  3_os_end(void){.
2dc60 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2dc70 4e 52 54 0a 20 20 69 66 28 20 73 6c 65 65 70 4f  NRT.  if( sleepO
2dc80 62 6a 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  bj!=NULL ){.    
2dc90 6f 73 43 6c 6f 73 65 48 61 6e 64 6c 65 28 73 6c  osCloseHandle(sl
2dca0 65 65 70 4f 62 6a 29 3b 0a 20 20 20 20 73 6c 65  eepObj);.    sle
2dcb0 65 70 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20  epObj = NULL;.  
2dcc0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
2dcd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2dce0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2dcf0 5f 4f 53 5f 57 49 4e 20 2a 2f 0a                 _OS_WIN */.